Android-Zygote 의 시작 과정 상세 분석

2898 단어 AndroidZygote
Android 시스템 에 서 는 DVM,ART,응용 프로그램 프로 세 스 와 시스템 을 실행 하 는 핵심 서비스의 SystemServer 프로 세 스 가 모두 Zygote 에서 만 들 어 졌 습 니 다.그 는 포크 형식 을 통 해 만 들 었 다.Zygote 가 시작 할 때 DVM 이나 ART 를 만 들 기 때문에 fork 를 통 해 만 든 프로그램 프로 세 스 와 SystemServer 프로 세 스 는 내부 에서 DVM 이나 ART 의 인 스 턴 스 복사 본 을 가 져 올 수 있 습 니 다.
Zygote 를 시작 할 때 ro.zygote 속성 에 따라 Zygote 시작 스 크 립 트 를 제어 합 니 다.시작 스 크 립 트 는 System/core/rootdir 디 렉 터 리 에 놓 습 니 다.

Zygote 는 시작 할 때 Zygote Init 의 main 방법 으로 갑 니 다.이 방법 에서 주로 다음 과 같은 일 을 했 습 니 다.
서버 엔 드 의 Socket 을 만 듭 니 다4.567917.예비 로드 류 와 자원SystemServer 프로 세 스 시작
  • AMS 가 새로운 프로그램 프로 세 스 를 만 들 기 를 기다 리 고 있 습 니 다.
  • JNI 를 통 해 ZygoteInit 의 main 방법 을 호출 한 후 Zygote 는 자바 층 에 들 어 갔다.이전의 모든 코드 는 자바 층 이 없 었 고 Zygote 는 자바 프레임 층 을 열 었 다.
    Zygote 가 만 든 Socket 의 name 은 Zygote 입 니 다.Activity Manager Service 가 Zygote 에 새 프로그램 프로 세 스 를 만 들 기 를 기다 리 는 데 사 용 됩 니 다.
    SystemServer 프로 세 스 를 시작 하면 시스템 서비스 도 SystemServer 프로 세 스 로 시 작 됩 니 다.
    마지막 으로 AMS 가 새로운 프로그램 프로 세 스 를 만 들 기 를 요청 할 때 까지 방법 을 호출 합 니 다.
    소켓 만 들 기
    Socket 을 만 들 때 이름 이[ANDROID]인 이름 을 만 듭 니 다.SOCKET_zygote]이 이름 을 통 해 환경 변수의 값,파일 설명자 인 자 를 가 져 오고 마지막 으로 파일 설명 자 를 만 들 고 LocalServerSocket 을 생 성 할 때 들 어 옵 니 다.이것 이 바로 서버 의 Socket 입 니 다.Zygote 는 SystemServer 프로 세 스 를 시작 하면 이 서버 의 Socket 에서 AMS 신 호 를 기다 릴 것 입 니 다.
    System Server 시작
    SystemServer 를 시작 하 는 시작 인 자 를 저장 하기 위해 args 배열 을 만들어 야 합 니 다.SystemServer 프로 세 스 의 사용자 id 와 사용자 그룹 id 는 1000 으로 설정 되 어 있 으 며,프로 세 스 이름 은 system 입 니 다.server,시작 하 는 클래스 이름 은 com.android.server.SystemServer 입 니 다.이 어 Zygote 의 forkSystemServer 방법 을 호출 합 니 다.그 내 부 는 nativeForkSystemServer 라 는 Native 방법 을 호출 합 니 다.마지막 으로 fork 함 수 를 통 해 현재 프로 세 스 에 키 프로 세 스 를 만 듭 니 다.바로 SystemServer 프로 세 스 입 니 다.forkSystemServer 방법 이 되 돌아 오 는 pid 가 0 이면 현재 코드 가 새로 만 든 하위 프로 세 스 에서 실행 되 고 있 음 을 표시 합 니 다.handle SystemServerProcess 를 실행 하여 SystemServer 프로 세 스 를 처리 합 니 다.
    AMS 대기
    앞에서 만 든 Socket 의 fd 필드 값 을 가 져 와 fds 목록 에 추가 합 니 다.다음은 AMS 요청 을 무한 순환 으로 기다 리 겠 습 니 다.이 순환 에서 fds 의 데 이 터 를 pollFds 배열 로 옮 긴 다음 pollFds 를 옮 겨 다 니 며 현재 Zygote 프로 세 스 가 AMS 와 연결 되 었 는 지 판단 합 니 다.연결 이 되 어 있 으 면 acceptCommamdPeer 방법 으로 Zygote Connection 클래스 를 얻어 Socket 연결 목록 peers 에 추가 합 니 다.그리고 Zygote Connection 의 fd 를 fds 목록 에 추가 하여 AMS 에서 보 내 온 요청 을 받 을 수 있 도록 합 니 다.pollFds 를 옮 겨 다 닐 때 AMS 와 연결 하지 않 으 면 애플 리 케 이 션 을 만 들 라 는 요청 입 니 다.Zygote Connection 의 runOnce 방법 으로 새 프로그램 프로 세 스 를 만 듭 니 다.생 성 에 성공 하면 이 Socket 을 peers 와 fds 에서 지 웁 니 다.
    Zygote 프로 세 스 시작 요약:
    Zygote 프로 세 스 시작
  • 가상 컴퓨터 를 만 들 고 자바 가상 컴퓨터 에 JNI 를 등록 하 는 방법
  • JNI 를 통 해 ZygoteInit 의 main 함 수 를 호출 하여 자바 프레임 층 에 들 어 갑 니 다
  • registerZygote Socket 방법 으로 서버 Socket 을 만 들 고 funSelectLoop 방법 으로 AMS 요청 을 기다 리 고 있 습 니 다
  • SystemServer 프로 세 스 시작이상 은 안 드 로 이 드-Zygote 시작 과정 에 대한 상세 한 내용 입 니 다.안 드 로 이 드-Zygote 시작 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기