Android Zygote介紹


1. 介紹

Zygote是Android系統創建新進程的核心進程,負責啟動Dalvik虛擬機,加載一些必要的系統資源和系統類,啟動system_server進程,隨后進入等待處理app應用請求

Zygote涉及的主要代碼如下

frameworks/base/cmds/app_process/App_main.cpp
frameworks/base/core/jni/AndroidRuntime.cpp

frameworks/base/core/java/com/android/internal/os/
  - Zygote.java
  - ZygoteInit.java
  - ZygoteServer.java
  - ZygoteConnection.java

2. 啟動

Zygote進程由init啟動,在筆者開發板上是以app_process64為主模式,app_process為輔

# /vendor/default.prop
ro.zygote=zygote64_32

# /init.rc
import /init.${ro.zygote}.rc
on zygote-start && property:ro.crypto.state=...
    # A/B update verifier that marks a successful boot.
    exec_start update_verifier_nonencrypted
    start netd
    start zygote
    start zygote_secondary

# /init.zygote64_32.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    onrestart restart wificond
    writepid /dev/cpuset/foreground/tasks

service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote_secondary stream 660 root system
    onrestart restart zygote
    writepid /dev/cpuset/foreground/tasks

屬性 ro.zygote 的值包括zygote32、zygote64、zygote32_64、zygote64_32,對應區別如下:
- init.zygote32.rc:zygote進程對應的執行程序是app_process(純32bit模式)
- init.zygote64.rc:zygote進程對應的執行程序是app_process64(純64bit模式)
- init.zygote32_64.rc:啟動兩個zygote進程,對應的執行程序分別是app_process32(主模式)、app_process64
- init.zygote64_32.rc:啟動兩個zygote進程,對應的執行程序分別是app_process64(主模式)、app_process32

3. app_process

zygote和zygote_secondary其實大同小異,都是執行/system/bin/app_process,其執行的的應用及參數如下

app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

這里以app_process作為切入點來看看其主要流程

ZygoteSequence

main()
    AppRuntime::AppRuntime()
        AndroidRuntime::AndroidRuntime()
            SkGraphics::Init()
    // 創建Dalvik緩存
    maybeCreateDalvikCache()
    AndroidRuntime::start("com.android.internal.os.ZygoteInit", args, )
        // JniInvocation位於libnativehelper
        JniInvocation::JniInvocation()
        /*
         * 初始化虛擬機環境
         * - 加載libart.so, 由art/runtime生成
         * - 導出JNI_GetDefaultJavaVMInitArgs
         * - 導出JNI_CreateJavaVM
         * - 導出JNI_GetCreatedJavaVMs
         */
        JniInvocation::Init(NULL)
        AndroidRuntime::startVm(JavaVM, JNIEnv,)
            // 獲取虛擬機參數
            AndroidRuntime::parseRuntimeOption()
            // 位於libnativehelper ???
            JNI_CreateJavaVM()
                JniInvocation::JNI_CreateJavaVM()
        AppRuntime::onVmCreated()
        // 向VM注冊native函數
        AndroidRuntime::startReg()
            /*
             * 依次注冊預定義的gRegJNI列表, 包括
             *   frameworks/base/core/jni/android_xxx.cpp
             *   frameworks/base/core/jni/com_xxx.cpp
             * 下面以android_util_Process.cpp為例
             */
            register_jni_procs(gRegJNI)
                register_android_os_Process()
                    /* 
                     * 注冊 android.os.Process 類
                     * 注冊 android.os.Process.setUid 方法
                     * ...
                     *
                     * static const JNINativeMethod methods[] = {
                     *     ...
                     *     {"setUid", "(I)I", (void*)android_os_Process_setUid},
                     *     ...
                     * };
                     */
                    RegisterMethodsOrDie(env, "android/os/Process", methods,)
                        AndroidRuntime::registerNativeMethods(env, className, methods, )
                            jniRegisterNativeMethods()
                                JNINativeInterface::RegisterNatives()
        /*
         * 找到入口com.android.internal.os.ZygoteInit(在register_jni_procs中注冊)
         */
        JNIEnv::FindClass("com/android/internal/os/ZygoteInit")
        // 找到入口類的main函數
        JNIEnv::GetStaticMethodID(jclass, "main")
        // 執行com.android.internal.os.ZygoteInit.main()
        JNIEnv::CallStaticVoidMethod(jclass, jmethodID, jobjectArray)

接下來就是ZygoteInit的執行過程

ZygoteInit.main()
    /*
     * 在init.zygote*.rc中注冊了zygote套接字
     * init進程在啟動service時會添加環境變量
     * 環境變量: "ANDROID_SOCKET_zygote"
     *
     * 從環境變量中獲取socket的fd
     * 通過LocalServerSocket()創建服務端
     */
    ZygoteServer::registerServerSocketFromEnv("zygote")
    // FIXME: Add More
    ZygoteInit::preload()
    // 主動進行GC操作
    ZygoteInit::gcAndFinalize()
    Zygote::nativeSecurityInit()
        com_android_internal_os_Zygote_nativeSecurityInit()
    Zygote::nativeUnmountStorageOnInit()
        com_android_internal_os_Zygote_nativeUnmountStorageOnInit()
    /*
     * 啟動SystemServer, 重命名為system_server
     */
    ZygoteInit::forkSystemServer()
        Zygote::forkSystemServer()
            Zygote::nativeForkSystemServer()
                com_android_internal_os_Zygote_nativeForkSystemServer()
                    ForkAndSpecializeCommon()
                        fork()
                        // 子進程: com.android.internal.os.Zygote
                        JNIENV::CallStaticVoidMethod("com/android/internal/os/Zygote")
        // 子進程: FIXME: Add More
        ZygoteInit::handleSystemServerProcess()
            ZygoteInit::zygoteInit(, "com.android.server.SystemServer", )
                RuntimeInit::commonInit()
                ZygoteInit::nativeZygoteInit()
                    com_android_internal_os_ZygoteInit_nativeZygoteInit()
                        AppRuntime::onZygoteInit()
                RuntimeInit::applicationInit()
                    RuntimeInit::findStaticMain("com.android.server.SystemServer", , )
        // 執行com.android.server.SystemServer.main()
        MethodAndArgsCaller.run()
    /* 
     * 監聽zygote socket
     * 等待客戶端消息並處理
     * ZygoteConnection用於表示和客戶端的連接
     */
    ZygoteServer::runSelectLoop()
        ZygoteConnection::processOneCommand()

TIP: app_process有兩種啟動模式,都是調用AppRuntime::start(),加載ZygoteInit或RuntimeInit兩個Java類

- Zygote模式: 即初始化zygote進程,也即上面分析的流程
- Application模式: 即啟動普通應用程序,傳遞的參數有class名字以及class帶的參數

4. SystemServer

Zygote啟動過程中fork了一個新進程用於啟動com.android.server.SystemServer,即SystemServer,文件路徑如下

frameworks/base/services/java/com/android/server/SystemServer.java

SystemServer(進程名為system_server)是android服務的提供者,所有service運行在該進程中,主要流程如下

SystemServer::main()
    SystemServer::run()
        /*
         * 一些准備工作
         */
        Looper.prepareMainLooper()
        /*
         * 初始化native服務
         *  libandroid_servers
         *    <- libservices.core
         *  由[frameworks/base/services/core/jni/*]編譯生成
         */
        System::loadLibrary("android_servers");
            // 位於frameworks/base/services/core/jni/onload.cpp
            JNI_OnLoad()
                register_android_server_broadcastradio_BroadcastRadioService()
                register_android_server_broadcastradio_Tuner()
                register_android_server_PowerManagerService()
                    /*
                     * 向com.android.server.power.PowerManagerService注冊native方法
                     *   2rd參數: "com/android/server/power/PowerManagerService"
                     *   3rd參數: gPowerManagerServiceMethods
                     *   4rd參數: NELEM(gPowerManagerServiceMethods)
                     */
                    jniRegisterNativeMethods(JNIEnv, , ,)
                register_android_server_SerialService()
                ...
        // FIXME
        SystemServer::performPendingShutdown()
        // 初始化系統上下文
        SystemServer::createSystemContext()
            ActivityThread::systemMain()
                new ActivityThread()
                // FIXME: a lot thing seems done
                ActivityThread::attach(true, 0)
            ActivityThread::getSystemContext()
        mSystemServiceManager = new SystemServiceManager()
        /*
         * 區別於BinderService, Localservice只在本進程使用
         */
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager)

        /*
         * 啟動關鍵服務
         */
        startBootstrapServices();
            // FIXME: 讀取系統配置
            SystemServerInitThreadPool.get().submit(SystemConfig::getInstance, )
            /*
             * 啟動[Installer]服務並連接至installd
             * installd為native服務, 位於frameworks/native/cmds/installd/
             */
            SystemServiceManager::startService(Installer.class)
                new Installer() && Installer::onStart()
            // 啟動[設備標識符]服務
            SystemServiceManager::startService(DeviceIdentifiersPolicyService.class)
                new DeviceIdentifiersPolicyService()
                DeviceIdentifiersPolicyService::onStart()
 // 啟動[AMS]服務
            SystemServiceManager::startService(ActivityManagerService.Lifecycle.class)
                new ActivityManagerService()
                ActivityManagerService::onStart()
 // 啟動[電源管理服務]
            SystemServiceManager::startService(PowerManagerService.class)
                new PowerManagerService()
                PowerManagerService::onStart()
                    publishBinderService(Context.POWER_SERVICE, new BinderService());
                        // 向servicemanager注冊服務
                        ServiceManager.addService( , , , )
                    publishLocalService(PowerManagerInternal.class, new LocalService());
                        LocalServices.addService( , )
            // 初始化電源管理功能
            ActivityManagerService::initPowerManagement()

            SystemServiceManager::startService(RecoverySystemService.class)
            SystemServiceManager::startService(LightsService.class)
 // 啟動[顯示管理服務]
            SystemServiceManager::startService(DisplayManagerService.class)

            // 等待默認顯示器
            SystemServiceManager::startBootPhase(SystemService.PHASE_WAIT_FOR_DE~T_DISPLAY);
                DisplayManagerService::onBootPhase(SystemService.PHASE_WAIT_FOR_DE~T_DISPLAY)
            // 啟動[PackageManagerService, PMS]服務 
            PackageManagerService::main(mSystemContext, installer, , )
            ActivityManagerService::setSystemProcess()
            new OverlayManagerService(mSystemContext, installer)
            SystemServiceManager::startService(mOverlayManagerService)
            startSensorService()
        /*
         * 啟動必要服務
         */
        startCoreServices();
            SystemServiceManager::startService(BatteryService.class)
            SystemServiceManager::startService(UsageStatsService.class)
            BinderCallsStatsService.start();
        /*
         * 啟動其他服務, 太多了, 這里不一一列舉
         */ 
        startOtherServices();

        /*
         * 進入循環
         */
        Looper.loop();

最后,就是啟動Launcher,可以參考<Android源碼解析-Launcher啟動流程>

參考:
<Android操作系統架構開篇>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM