원본 코드 편 - 안 드 로 이 드 시작 프로 세 스

6663 단어
먼저 말 한 것 은 안 드 로 이 드 의 4 층 구조 이다.
 APPLICTION, APPLICATION FRAMEWORK, LIBRARICB+ANDROID RUNTIME, LINUX KERNEL
안 드 로 이 드 시작
안내 프로그램 이 리 눅 스 커 널 을 시작 하면 각종 구동 과 데이터 구 조 를 불 러 옵 니 다. 구동 이 있 으 면 안 드 로 이 드 시스템 을 시작 하 는 동시에 사용자 등급 의 첫 번 째 프로 세 스 init (system \ core \ init. c) 코드 를 다음 과 같이 불 러 옵 니 다.
    int main(int argc, char **argv)
{

    //         
    mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
    mkdir("/dev/pts", 0755);

    //     
    log_init();

    INFO("reading config file
"); // init.rc init_parse_config_file("/init.rc"); }

init. rc 파일 을 불 러 오 면 Zygote 프로 세 스 를 시작 합 니 다. 이 프로 세 스 는 Android 시스템 의 모 프로 세 스 로 Android 의 다른 서비스 프로 세 스, 코드 를 시작 합 니 다.
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd

c + 코드 에서 자바 코드 로:
    int main(int argc, const char* const argv[])
{
    ...
    // Android     
    AppRuntime runtime;
    ...
    // Next arg is startup classname or "--zygote"
    if (i < argc) {
        arg = argv[i++];
        if (0 == strcmp("--zygote", arg)) {
            bool startSystemServer = (i < argc) ? 
                    strcmp(argv[i], "--start-system-server") == 0 : false;
            setArgv0(argv0, "zygote");
            set_process_name("zygote");
            //   java  
            runtime.start("com.android.internal.os.ZygoteInit",
         ...

}

ZygoteInit. java 코드:
public static void main(String argv[]) { try { VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);
        //   Android    
        preloadClasses();
        //cacheRegisterMaps();
        preloadResources();
        ...

        if (argv[1].equals("true")) {
            //       
            startSystemServer();
        } else if (!argv[1].equals("false")) {
       ...
}


private static boolean startSystemServer()
     ...
        args = new String[] {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006",
            "--capabilities=130104352,130104352",
            "--rlimit=8,",
            "--runtime-init",
            "--nice-name=system_server",
            "com.android.server.SystemServer",
      ...

        /* Request to fork the system server process */
        //             SystemServer
        pid = Zygote.forkSystemServer(
                parsedArgs.uid, parsedArgs.gid,
                parsedArgs.gids, debugFlags, rlimits,
                parsedArgs.permittedCapabilities,
                parsedArgs.effectiveCapabilities);
    ..
}

System Server. java 코드
public static void main(String[] args) {
    ... 
    //   jni 
    System.loadLibrary("android_servers");
    //   native  
    init1(args);
}
native public static void init1(String[] args);

SystemServer 에 대응 하 는 c + + 코드 comandroidserver SystemServer. cpp 코드 는 다음 과 같 습 니 다.
//   java     
extern "C" int system_init();

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{   
    //   
    system_init();
}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */ 
    //       init1     android_server_SystemServer_init1
    { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};

systeminit 의 실현 방법 은 Systeminit. cpp 코드 에서 다음 과 같 습 니 다.
extern "C" status_t system_init()
{
    ...
    //        
    if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }



    AndroidRuntime* runtime = AndroidRuntime::getRuntime();

    LOGI("System server: starting Android services.
"); // , Systemserver init2 runtime->callStatic("com/android/server/SystemServer", "init2"); ... }

SystemServer 의 init 2 방법 코드:
public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
    }

ServerThread 의 run 방법:
public void run () {... / / Android 각종 서 비 스 를 시작 하고 ServiceManager 에 추가 하여 Slog. i (TAG, "Device Policy") 를 관리 합 니 다. devicePolicy = new DevicePolicy Manager Service (context); ServiceManager. addService (Context. DEVICEPOLICYSERVICE, ottle =
    ...
    // We now tell the activity manager it is okay to run third party
    // code.  It will call back into us once it has gotten to the state
    // where third party code can really run (but before it has actually
    // started launching the initial applications), for us to complete our
    // initialization.
    //          ActivityManagerService.systemReady
    ((ActivityManagerService)ActivityManagerNative.getDefault())
            .systemReady(new Runnable() {
        public void run() {
            Slog.i(TAG, "Making services ready");

Activity MangerService 의 system Ready 방법:
public void systemReady(final Runnable goingCallback) {
        ...
        //      Activity
            mMainStack.resumeTopActivityLocked(null);
        }
    }

Activity Stack 의 resume TopActivity Locked 방법
final boolean resumeTopActivityLocked(ActivityRecord prev) {
        // Find the first activity that is not finishing.
        //        Activity next  null
        ActivityRecord next = topRunningActivityLocked(null);

        // Remember how we'll process this pause/resume situation, and ensure
        // that the state is reset however we wind up proceeding.
        final boolean userLeaving = mUserLeaving;
        mUserLeaving = false;

        if (next == null) {
            // There are no more activities!  Let's just start up the
            // Launcher...

            if (mMainStack) {
                //   lucher       
                return mService.startHomeActivityLocked();
            }
        }

Android 시스템 시작 이 완료 되 어 Luncher 애플 리 케 이 션 의 홈 인터페이스 가 열 렸 습 니 다.

좋은 웹페이지 즐겨찾기