Android系統啟動流程
阿新 • • 發佈:2018-05-13
包名 more dev ted androi cap 執行 ons 開始
-
當系統引導程序啟動Linux內核,內核會記載各種數據結構,和驅動程序,加載完畢之後,Android系統開始啟動並加載第一個用戶級別的進程:init(system/core/init/Init.c)
-
查看Init.c代碼,看main函數
int main(int argc, char **argv) { ... //執行Linux指令 mkdir("/dev", 0755); mkdir("/proc", 0755); mkdir("/sys", 0755); ... //解析執行init.rc配置文件 init_parse_config_file("/init.rc"); ... }
-
在init.rc中定義好的指令都會開始執行,其中執行了很多bin指令,啟動系統服務
//啟動孵化器進程,此進程是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
-
在appprocess文件夾下找到appmain.cpp,查看main函數,發現以下代碼
int main(int argc, const char* const argv[]) { ... //啟動一個系統服務:ZygoteInit runtime.start("com.android.internal.os.ZygoteInit",startSystemServer); ... }
-
在ZygoteInit.java中,查看main方法
public static void main(String argv[]) { ... //加載Android系統需要的類 preloadClasses(); ... if (argv[1].equals("true")) { //調用方法啟動一個系統服務 startSystemServer(); } ... }
-
startSystemServer()方法的方法體
String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003", "--capabilities=130104352,130104352", "--runtime-init", "--nice-name=system_server", "com.android.server.SystemServer", }; ... //分叉啟動上面字符串數組定義的服務 pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities);
-
SystemServer服務被啟動
public static void main(String[] args) { ... //加載動態鏈接庫 System.loadLibrary("android_servers"); //執行鏈接庫裏的init1方法 init1(args); ... }
-
動態鏈接庫文件和java類包名相同,找到comandroidserver_SystemServer.cpp文件
-
在comandroidserver_SystemServer.cpp文件中,找到了
static JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ //給init1方法映射一個指針,調用system_init方法 { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 }, };
-
androidserverSystemServer_init1方法體中調用了systeminit,systeminit沒有方法體
-
在systeminit.cpp文件中找到systeminit方法,方法體中 //執行了SystemServer.java的init2方法 runtime->callStatic("com/android/server/SystemServer", "init2");
-
回到SystemServer.java,在init2的方法體中
//啟動一個服務線程 Thread thr = new ServerThread(); thr.start();
-
在ServerThread的run方法中
//準備消息輪詢器 Looper.prepare(); ... //啟動大量的系統服務並把其逐一添加至ServiceManager ServiceManager.addService(Context.WINDOW_SERVICE, wm); ... //調用systemReady,準備創建第一個activity ((ActivityManagerService)ActivityManagerNative.getDefault()) .systemReady(new Runnable(){ ... });
-
在ActivityManagerService.java中,有systemReady方法,方法體裏找到
//檢測任務棧中有沒有activity,如果沒有,創建Launcher mMainStack.resumeTopActivityLocked(null);
-
在ActivityStack.java中,方法resumeTopActivityLocked
// Find the first activity that is not finishing. ActivityRecord next = topRunningActivityLocked(null); ... if (next == null) { // There are no more activities! Let‘s just start up the // Launcher... if (mMainStack) { return mService.startHomeActivityLocked(); } } ...
Android系統啟動流程