Android系統包含netd、servicemanager、surfaceflinger、zygote、media、installd、bootanimation等基本服務,具體作用請看下圖。
Android 系統基本服務
二、虛擬機創建和第一個Java 程序引導
為了讓APK在不同的虛擬機都可以運行,Google采取了適配器模式,在讓虛擬機運行之前先執行dexopt,即將dex文件優化成odex文件,可以讓虛擬機更加優化的執行。
在ART虛擬機中,dexopt將dex文件優化成二進制格式的問題,從而可以讓ART虛擬機執行。dexopt會調用dex2oat進行優化,dex2oat的任務是將原來的dex文件進行預翻譯,從而可以加快app運行的時間,但是由于某些app比較復雜,所以優化的時間就比較長。
優化是以dex文件中的Method方法為單位,dex2oat在優化時候,會根據需求優化一定量的Method,即不是所有的Method都回翻譯成oat模式。
虛擬機創建和第一個Java 程序引導
三、Dalvik 虛擬機基本配置
在Android系統中,Dalvik虛擬機 和ART、應用程序進程,以及運行系統的關鍵服務SystemServer進程都是由Zygote進程創建孵化的。
1.Dalvik 虛擬機基本配置
Dalvik 虛擬機基本配置
四、Zygote 啟動流程
1.Zygote 啟動代碼
Zygote服務時通過init.rc進程啟動的,Zygote的classname為main.
init.rc文件配置代碼如下:
... ... on nonencrypted class_start main class_start late_start on property:sys.init_log_level=* loglevel ${sys.init_log_level} ... ...
詳細可以參考init.rc啟動分析。
Android init 啟動流程
2.Zygote main 函數
app_main.cpp是Zygote進程的main函數,frameworksasecmdsapp_processapp_main.cpp
Zygote是由init.rc腳本啟動,在init腳本中,我們可以看到會導入import /init.${ro.zygote}.rc腳本
# Copyright (C) 2012 The Android Open Source Project # # IMPORTANT: Do not create world writable files or directories. # This is a common source of Android security bugs. # import /init.environ.rc import /init.usb.rc import /init.${ro.hardware}.rc import /vendor/etc/init/hw/init.${ro.hardware}.rc import /init.usb.configfs.rc ... ... import /init.${ro.zygote}.rc ... ...
在system/core/rootdir目錄下,會根據ro.zygote屬性值不同,啟動不同的腳本,主要包含以下四個zygote腳本。
1.init.zygote32.rc 支持32為系統
2.init.zygote32_64.rc
3.init.zygote64.rc
4.init.zygote64_32.rc
init.zygte.rc腳本
Zygote 啟動流程
五、Zygote 啟動分析
Zygote 啟動分析
六、Zygote 創建system_server主要方法
Zygote 創建system_server主要方法
七、Zygote 創建System_server 分析
Zygote 創建System_server
八、Zygote 創建應用
Zygote 創建應用
九、Zygote 創建應用流程
Zygote 創建應用流程
十、Zygote 預加載資源
Zygote 預加載資源
preloadClasses()
preloadResources()
十一、Zygote 預加載的目的
Zygote 預加載的目的
十二、優化Zygote 啟動方法:線程池
1.Zygote 啟動優化
1:加載類和資源是可重入操作,所以在并行模式下,不存在互斥的場景
2:Android提供了Executors和ExecutorService多線程類,因此可以使用多線程來加載類和資源。
3:硬件平臺最好是多核,否則加速也不明顯;
線程池 優化Zygote 啟動
2.Zygote 啟動優化實質
使我們的進程最大限度的搶占CPU
十三、fork SystemServer
經過一系列初始化后,在ZygoteInit類中forkSystemServer,為啟動SystemServer做準備。ZygoteInit.java代碼路徑如下:alpsframeworksasecorejavacomandroidinternalosygoteInit.java
/** * Prepare the arguments and forks for the system server process. * * Returns an {@code Runnable} that provides an entrypoint into system_server code in the * child process, and {@code null} in the parent. */ private static Runnable forkSystemServer(String abiList, String socketName, ZygoteServer zygoteServer) { long capabilities = posixCapabilitiesAsBits( OsConstants.CAP_IPC_LOCK, OsConstants.CAP_KILL, OsConstants.CAP_NET_ADMIN, OsConstants.CAP_NET_BIND_SERVICE, OsConstants.CAP_NET_BROADCAST, OsConstants.CAP_NET_RAW, OsConstants.CAP_SYS_MODULE, OsConstants.CAP_SYS_NICE, OsConstants.CAP_SYS_PTRACE, OsConstants.CAP_SYS_TIME, OsConstants.CAP_SYS_TTY_CONFIG, OsConstants.CAP_WAKE_ALARM, OsConstants.CAP_BLOCK_SUSPEND ); /* Containers run without some capabilities, so drop any caps that are not available. */ StructCapUserHeader header = new StructCapUserHeader( OsConstants._LINUX_CAPABILITY_VERSION_3, 0); StructCapUserData[] data; try { data = Os.capget(header); } catch (ErrnoException ex) { throw new RuntimeException("Failed to capget()", ex); } capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32); /* Hardcoded command line to start the system server */ String args[] = { "--setuid=1000", "--setgid=1000", /// M: [Wi-Fi Hotspot Manager] system_server add dhcp (1014) group to access /// "/data/misc/dhcp/dnsmasq.leases" "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1014,1018,1021,1023," + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010", "--capabilities=" + capabilities + "," + capabilities, "--nice-name=system_server", "--runtime-args", "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT, "com.android.server.SystemServer", }; ZygoteConnection.Arguments parsedArgs = null; int pid; try { parsedArgs = new ZygoteConnection.Arguments(args); ZygoteConnection.applyDebuggerSystemProperty(parsedArgs); ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs); boolean profileSystemServer = SystemProperties.getBoolean( "dalvik.vm.profilesystemserver", false); if (profileSystemServer) { parsedArgs.runtimeFlags |= Zygote.PROFILE_SYSTEM_SERVER; } /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.runtimeFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } /* For child process */ if (pid == 0) { if (hasSecondZygote(abiList)) { waitForSecondaryZygote(socketName); } zygoteServer.closeServerSocket(); return handleSystemServerProcess(parsedArgs); } return null; }
審核編輯:湯梓紅
-
Android
+關注
關注
12文章
3943瀏覽量
127742 -
JAVA
+關注
關注
19文章
2974瀏覽量
104973 -
應用程序
+關注
關注
38文章
3292瀏覽量
57846 -
虛擬機
+關注
關注
1文章
931瀏覽量
28359 -
ART
+關注
關注
0文章
26瀏覽量
10495
原文標題:十三、fork SystemServer
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論