參考自:
Android 進(jìn)階解密
網(wǎng)易課程
Zygote 服務(wù)啟動(dòng) SystemServer
在 ZygoteInit 的 main 函數(shù)中
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
public static void main(String argv[]) {
....
startSystemServer(...)
....
}
startSystemServer 函數(shù)
startSystemServer 函數(shù)會(huì) fork 出當(dāng)前 Zygote 的進(jìn)程空間侯嘀,并在該進(jìn)程空間下啟動(dòng) SystemServer,由于 fork 時(shí)同樣獲得了 Zygote Server 的 Socket 耐量,但這個(gè) Socket 對(duì) SystemServer 來說是沒有用的堡妒,所以關(guān)閉它抵知。
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.debugFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
zygoteServer.closeServerSocket();
handleSystemServerProcess(parsedArgs);
}
handleSystemServerProcess
handleSystemServerProcess 函數(shù)會(huì)調(diào)用 ZygoteInit 函數(shù)
....
ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
....
ZygoteInit 的 nativeZygoteInit 函數(shù)對(duì)應(yīng) AndroidRuntime 的 jni 函數(shù),負(fù)責(zé)創(chuàng)建 Binder 線程池,讓 SystemServer 可以和其他進(jìn)程進(jìn)行通信晨川。
RuntimeInit.applicationInit 函數(shù)真正調(diào)用 SystemServer 的 main 函數(shù)
public static final void zygoteInit(int targetSdkVersion, String[] argv,
ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
.....
ZygoteInit.nativeZygoteInit();
RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
SystemServer 的 main 函數(shù)
frameworks/base/services/java/com/android/server/SystemServer.java
SystemServer 的 run 方法主要做了以下幾個(gè)事情
- 創(chuàng)建 Looper 消息循環(huán)體
- 創(chuàng)建系統(tǒng)的 context
- 創(chuàng)建 SystemServerManager
- 啟動(dòng)引導(dǎo)服務(wù)
- 啟動(dòng)核心服務(wù)
- 啟動(dòng)其他服務(wù)
public static void main(String[] args) {
new SystemServer().run();
}
SystemServer.run
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
// Initialize the system context.
createSystemContext();
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServiceManager 負(fù)責(zé)啟動(dòng)和管理服務(wù)
- 首先將要啟動(dòng)的 Service 放入集合中管理
- 根據(jù)反射調(diào)用到 Service 并執(zhí)行服務(wù)的 onStart 方法
基本上所有的服務(wù)都是 SystemServer 的子類,都具備 onStart 方法删豺。
private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
總結(jié)
- SystemServer 是由 Zygote 服務(wù)啟動(dòng)的共虑,在創(chuàng)建 SystemServer 的時(shí)候會(huì)創(chuàng)建 Binder 線程池,然后 fork 出一個(gè)進(jìn)程呀页,在這個(gè)新的進(jìn)程環(huán)境下啟動(dòng) SystemServer妈拌,調(diào)用 SystemServer 的 main 函數(shù)。
- SystemServer 的 main 函數(shù)觸發(fā)后蓬蝶,會(huì)創(chuàng)建 Looper 消息循環(huán)供炎,創(chuàng)建 context渴逻,同時(shí)啟動(dòng)系統(tǒng)服務(wù),引導(dǎo)服務(wù)以及其他服務(wù)