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作為切入點來看看其主要流程
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操作系統架構開篇>