建設(shè)物流網(wǎng)站的規(guī)劃網(wǎng)絡(luò)營(yíng)銷(xiāo)戰(zhàn)略的內(nèi)容
概述
在Android系統(tǒng)中,所有的應(yīng)用程序進(jìn)程以及系統(tǒng)服務(wù)進(jìn)程SystemServer都是由Zygote進(jìn)程孕育(fork)出來(lái)的,這也許就是為什么要把它稱(chēng)為Zygote(受精卵)的原因吧。由于Zygote進(jìn)程在Android系統(tǒng)中有著如此重要的地位,本文將詳細(xì)分析它的啟動(dòng)過(guò)程
總體時(shí)序
先概述一下總體運(yùn)行流程,當(dāng)按電源鍵,首先是加載系統(tǒng)引導(dǎo)程序BootLoader,然后啟動(dòng)linux內(nèi)核,再啟動(dòng)init進(jìn)程,最后Zygote進(jìn)程啟動(dòng)完成。理論上Android系統(tǒng)中的所有應(yīng)用程序理論上都是由Zygote啟動(dòng)的。Zygote前期啟動(dòng)啟動(dòng)服務(wù),后期主要fork程序。
init啟動(dòng)流程
- 用戶(hù)空間的第一個(gè)進(jìn)程,進(jìn)程號(hào)為1(在《深入理解安卓?jī)?nèi)核思想》的257頁(yè)里面寫(xiě)的是0,在這記錄一下)
- 職責(zé)
- 創(chuàng)建Zygote
- 初始化屬性服務(wù)
- init文件位于源碼目錄system/core/init中
init進(jìn)程的啟動(dòng)三個(gè)階段
- 啟動(dòng)電源以及系統(tǒng)的啟動(dòng),加載引導(dǎo)程序BootLoader。
- 啟動(dòng)Linux內(nèi)核
- 啟動(dòng)init進(jìn)程。
- 啟動(dòng)Zygote進(jìn)程
- 初始化啟動(dòng)屬性服務(wù)。
Zygote進(jìn)程
- 所有App的父進(jìn)程,ZygoteInit.main
- Zygote進(jìn)程,是由init進(jìn)程通過(guò)解析init.rc文件后fork生成的,Zygote進(jìn)程主要包括
- 加載Zygoteinit類(lèi),注冊(cè)Zygote Socket服務(wù)端套接字
- 加載虛擬機(jī)
- 提前加載類(lèi)PreloadClasses
- 提前加載資源PreLoadResouces
- system_server進(jìn)程,是由Zygote fork而來(lái),System Server是Zygote孵化出的第一個(gè)進(jìn)程,System Server 負(fù)責(zé)啟動(dòng)和管理整個(gè)Java FrameWork,包含ActivityManagerService, WorkManagerService,PagerManagerService,PowerManagerService等服務(wù)
system_server進(jìn)程
系統(tǒng)各大服務(wù)的載體, SystemServer.main system_server進(jìn)程從源碼角度來(lái)看可以分為,引導(dǎo)服務(wù),核心服務(wù)和其他服務(wù)
- 引導(dǎo)服務(wù)(7個(gè)):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
- 核心服務(wù)(3個(gè)):BatteryService、UsageStatsService、WebViewUpdateService;
- 其他服務(wù)(70個(gè)+):AlarmManagerService、VibratorService等。
ServiceManger進(jìn)程
bInder服務(wù)的大管家
ServiceManager 是Binder IPC通信過(guò)程中的守護(hù)進(jìn)程,本身也是一個(gè)Binder,但是并沒(méi)有采用多線程模型來(lái)跟Binder通信,而是自行編寫(xiě)了binder.c直接和Binder驅(qū)動(dòng)來(lái)通信,并且只有一個(gè)binder_loop來(lái)讀取和處理事務(wù),這樣做的好處是簡(jiǎn)單和高效 ServiceManager本身工作相對(duì)簡(jiǎn)單,其工能查詢(xún)和注冊(cè)服務(wù)
流程圖
ServiceManager 集中管理系統(tǒng)內(nèi)的所有服務(wù),通能過(guò)權(quán)限控制進(jìn)程是否有權(quán)注冊(cè)服務(wù),通過(guò)字符串來(lái)查找是否有對(duì)應(yīng)的Service,由于ServiceManager進(jìn)程注冊(cè)了Service的死亡通知,那么服務(wù)所在的進(jìn)程死亡后,只需告訴ServiceManager,每個(gè)Client通過(guò)查詢(xún)ServiceManager可以獲取Service的情況
啟動(dòng)主要包括以下幾個(gè)階段
- 打開(kāi)Binder驅(qū)動(dòng),并調(diào)用mmap()方法分配128k的內(nèi)存映射空間,binder_open
- 注冊(cè)成為Binder服務(wù)的大管家binder_become_context_manager
- 驗(yàn)證selinux權(quán)限,判斷進(jìn)程是否有權(quán)注冊(cè)查看指定服務(wù)
- 進(jìn)入無(wú)限循環(huán),處理Client發(fā)來(lái)的請(qǐng)求 binder_loop
- 根據(jù)服務(wù)的名稱(chēng)注冊(cè)服務(wù),重復(fù)注冊(cè)會(huì)移除之前的注冊(cè)信息
- 死亡通知,當(dāng)所在進(jìn)程死亡后,調(diào)用binder_release方法,然后調(diào)用binder_node_release,這個(gè)過(guò)程發(fā)出死亡通知回調(diào)
App進(jìn)程
- 通過(guò)Process.start啟動(dòng)的App進(jìn)程ActivityThread.main
- Zygote 孵化出的第一個(gè)App進(jìn)程是Launcher,這是用戶(hù)看到的桌面App
- Zygote 還會(huì)創(chuàng)建出Browser,Phone,Email等App進(jìn)程,每個(gè)App至少運(yùn)行在一個(gè)進(jìn)程上
- 所有的App進(jìn)程都是由Zygote fork而成
3)Zygote進(jìn)程的啟動(dòng)
Zygote進(jìn)程, 一個(gè)在Android系統(tǒng)中扮演重要角色的進(jìn)程. 我們知道Android系統(tǒng)中的兩個(gè)重要服務(wù)PackageManagerService和ActivityManagerService, 都是由SystemServer進(jìn)程啟動(dòng)的, 而這個(gè)SystemServer進(jìn)程本身是Zygote進(jìn)程在啟動(dòng)的過(guò)程中fork出來(lái)的. 這樣一來(lái), 想必我們就知道Zygote進(jìn)程在Android系統(tǒng)中的重要地位了.
從圖中可得知Android系統(tǒng)中各個(gè)進(jìn)程的先后順序?yàn)?#xff1a;
init進(jìn)程 –-> Zygote進(jìn)程 –> SystemServer進(jìn)程 –>應(yīng)用進(jìn)程
鏈接
- 在init啟動(dòng)Zygote時(shí)主要是調(diào)用app_main.cpp的main函數(shù)中的AppRuntime.start()方法來(lái)啟動(dòng)Zygote進(jìn)程的;
- 接著到AndroidRuntime的start函數(shù):使用JNI調(diào)用ZygoteInit的main函數(shù),之所以這里要使用JNI,是因?yàn)閆ygoteInit是java代碼。最終,Zygote就從Native層進(jìn)入了Java FrameWork層。在此之前,并沒(méi)有任何代碼進(jìn)入Java FrameWork層面,因此可以認(rèn)為,Zygote開(kāi)創(chuàng)了java FrameWork層。
- /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
@UnsupportedAppUsagepublic static void main(String argv[]) {ZygoteServer zygoteServer = null;// Mark zygote start. This ensures that thread creation will throw// an error.ZygoteHooks.startZygoteNoThreadCreation();// Zygote goes into its own process group.try {Os.setpgid(0, 0);} catch (ErrnoException ex) {throw new RuntimeException("Failed to setpgid(0,0)", ex);}Runnable caller;try {// Report Zygote start time to tron unless it is a runtime restartif (!"1".equals(SystemProperties.get("sys.boot_completed"))) {MetricsLogger.histogram(null, "boot_zygote_init",(int) SystemClock.elapsedRealtime());}String bootTimeTag = Process.is64Bit() ? "Zygote64Timing" : "Zygote32Timing";TimingsTraceLog bootTimingsTraceLog = new TimingsTraceLog(bootTimeTag,Trace.TRACE_TAG_DALVIK);bootTimingsTraceLog.traceBegin("ZygoteInit");RuntimeInit.enableDdms();boolean startSystemServer = false;String zygoteSocketName = "zygote";String abiList = null;boolean enableLazyPreload = false;for (int i = 1; i < argv.length; i++) {if ("start-system-server".equals(argv[i])) {startSystemServer = true;} else if ("--enable-lazy-preload".equals(argv[i])) {enableLazyPreload = true;} else if (argv[i].startsWith(ABI_LIST_ARG)) {abiList = argv[i].substring(ABI_LIST_ARG.length());} else if (argv[i].startsWith(SOCKET_NAME_ARG)) {zygoteSocketName = argv[i].substring(SOCKET_NAME_ARG.length());} else {throw new RuntimeException("Unknown command line argument: " + argv[i]);}}final boolean isPrimaryZygote = zygoteSocketName.equals(Zygote.PRIMARY_SOCKET_NAME);if (abiList == null) {throw new RuntimeException("No ABI list supplied.");}// In some configurations, we avoid preloading resources and classes eagerly.// In such cases, we will preload things prior to our first fork.if (!enableLazyPreload) {bootTimingsTraceLog.traceBegin("ZygotePreload");EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,SystemClock.uptimeMillis());preload(bootTimingsTraceLog);EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,SystemClock.uptimeMillis());bootTimingsTraceLog.traceEnd(); // ZygotePreload} else {Zygote.resetNicePriority();}// Do an initial gc to clean up after startupbootTimingsTraceLog.traceBegin("PostZygoteInitGC");gcAndFinalize();bootTimingsTraceLog.traceEnd(); // PostZygoteInitGCbootTimingsTraceLog.traceEnd(); // ZygoteInit// Disable tracing so that forked processes do not inherit stale tracing tags from// Zygote.Trace.setTracingEnabled(false, 0);Zygote.initNativeState(isPrimaryZygote);ZygoteHooks.stopZygoteNoThreadCreation();zygoteServer = new ZygoteServer(isPrimaryZygote);if (startSystemServer) {
// 使用了forkSystemServer()方法去創(chuàng)建SystemServer進(jìn)程Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
// {@code r == null} in the parent (zygote) process, and {@code r != null} in the
// child (system_server) process.if (r != null) {r.run();return;
}
}
Log.i(TAG, "Accepting command socket connections");
// The select loop returns early in the child process after a fork and
// 這里調(diào)用了ZygoteServer的runSelectLoop方法來(lái)等等ActivityManagerService來(lái)請(qǐng)求創(chuàng)建新的應(yīng)用程序進(jìn)程
// loops forever in the zygote.caller = zygoteServer.runSelectLoop(abiList);}
catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
throw ex;}
finally
{
if (zygoteServer != null) {zygoteServer.closeServerSocket();
}
}
// We're in the child process and have exited the select loop. Proceed to execute the
// command.if (caller != null) {caller.run();
}
}
其中, 在ZygoteInit的forkSystemServer()方法中啟動(dòng)了SystemServer進(jìn)程,forkSystemServer()方法核心代碼 :
private static Runnable forkSystemServer(String abiList, String socketName,ZygoteServer zygoteServer)
{
// 一系統(tǒng)創(chuàng)建SystemServer進(jìn)程所需參數(shù)的準(zhǔn)備工作try {...
/* Request to fork the system server process
*/// 3.1pid = 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();
// 3.2return handleSystemServerProcess(parsedArgs);
}return null;
}
可以看到,forkSystemServer()方法中,注釋3.1調(diào)用了Zygote的forkSystemServer()方法去創(chuàng)建SystemServer進(jìn)程,其內(nèi)部會(huì)執(zhí)行nativeForkSystemServer這個(gè)Native方法,它最終會(huì)使用fork函數(shù)在當(dāng)前進(jìn)程創(chuàng)建一個(gè)SystemServer進(jìn)程。如果pid等于0,即當(dāng)前是處于新創(chuàng)建的子進(jìn)程ServerServer進(jìn)程中,則在注釋3.2處使用handleSystemServerProcess()方法處理SystemServer進(jìn)程的一些處理工作。
從以上的分析可以得知,Zygote進(jìn)程啟動(dòng)中承擔(dān)的主要職責(zé)如下:
- 1、創(chuàng)建AppRuntime,執(zhí)行其start方法,啟動(dòng)Zygote進(jìn)程。。
- 2、創(chuàng)建JVM并為JVM注冊(cè)JNI方法。
- 3、使用JNI調(diào)用ZygoteInit的main函數(shù)進(jìn)入Zygote的Java FrameWork層。
- 4、使用registerZygoteSocket方法創(chuàng)建服務(wù)器端Socket,并通過(guò)runSelectLoop方法等等AMS的請(qǐng)求去創(chuàng)建新的應(yīng)用進(jìn)程。
- 5、啟動(dòng)SystemServer進(jìn)程。
- 調(diào)用了handleSystemServerprocess()方法來(lái)啟動(dòng)SystemServer進(jìn)程。handleSystemServerProcess()方法如下所示:
/*** Finish remaining work for the newly forked system server process.
*/
private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {...
if (parsedArgs.invokeWith != null) {...}
else {ClassLoader cl = null;
if (systemServerClasspath != null) {
// 1cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);
Thread.currentThread().setContextClassLoader(cl);}
/** Pass the remaining arguments to SystemServer.
*/// 2return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}
}
在注釋1處,使用了systemServerClassPath和targetSdkVersion創(chuàng)建了一個(gè)PathClassLoader。接著,在注釋2處,執(zhí)行了ZygoteInit的zygoteInit()方法,該方法如下所示:
public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
{
if (RuntimeInit.DEBUG) {
Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
}
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
RuntimeInit.redirectLogStreams();
RuntimeInit.commonInit();
// 1ZygoteInit.nativeZygoteInit();
// 2return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
- zygoteInit()方法的注釋2處,這里調(diào)用了RuntimeInit 的 applicationInit() 方法,代碼如下所示:
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
protected static Runnable applicationInit(int targetSdkVersion, String[] argv,ClassLoader classLoader) {...
// Remaining arguments are passed to the start class's static mainreturn findStaticMain(args.startClass, args.startArgs, classLoader);
}
在applicationInit()方法中最后調(diào)用了findStaticMain()方法:
protected static Runnable findStaticMain(String className, String[] argv,ClassLoader classLoader) {
Class<?> cl;
try {
// 1cl = Class.forName(className, true, classLoader);
}
catch (ClassNotFoundException ex) {
throw new RuntimeException("Missing class when invoking static main " + className,ex);
}
Method m;try {
// 2m = cl.getMethod("main", new Class[] { String[].class });
}
catch (NoSuchMethodException ex) {
throw new RuntimeException("Missing static main on " + className, ex);}
catch (SecurityException ex) {throw new RuntimeException("Problem getting static main on " + className, ex);}
int modifiers = m.getModifiers();
if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
throw new RuntimeException("Main method is not public and static on " + className);}
/** This throw gets caught in ZygoteInit.main(), which responds
* by invoking the exception's run() method. This arrangement
* clears up all the stack frames that were required in setting
* up the process.
*/// 3return new MethodAndArgsCaller(m, argv);
}
首先,在注釋1處,通過(guò)發(fā)射得到了SystemServer類(lèi)。接著,在注釋2處,找到了SystemServer中的main()方法。最后,在注釋3處,會(huì)將main()方法傳入MethodAndArgsCaller()方法中,這里的MethodAndArgsCaller()方法是一個(gè)Runnable實(shí)例,它最終會(huì)一直返回出去,直到在ZygoteInit的main()方法中被使用,如下所示:
if (startSystemServer) {
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
// {@code r == null}
in the parent (zygote) process, and {
@code r != null}
in the
// child (system_server) process.
if (r != null) {
r.run();
return;
}
}
可以看到,最終直接調(diào)用了這個(gè)Runnable實(shí)例的run()方法,代碼如下所示:
/*** Helper class which holds a method and arguments and can call them. This is used as part of
* a trampoline to get rid of the initial process setup stack frames.
*/
static class MethodAndArgsCaller implements Runnable {
/** method to call
*/private final Method mMethod;
/** argument array
*/private final String[] mArgs;public MethodAndArgsCaller(Method method, String[] args) {
mMethod = method;mArgs = args;}
public void run() {try {
// 1mMethod.invoke(null, new Object[] {
mArgs });}
catch (IllegalAccessException ex) {throw new RuntimeException(ex);}
catch (InvocationTargetException ex) {
Throwable cause = ex.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
}
else if (cause instanceof Error) {
throw (Error) cause;}
throw new RuntimeException(ex);
}
}
}
在注釋1處,這個(gè)mMethod就是指的SystemServer的main()方法,這里動(dòng)態(tài)調(diào)用了SystemServer的main()方法,最終,SystemServer進(jìn)程就進(jìn)入了SystemServer的main()方法中了。這里還有個(gè)遺留問(wèn)題,為什么不直接在findStaticMain()方法中直接動(dòng)態(tài)調(diào)用SystemServer的main()方法呢?原因就是這種遞歸返回后再執(zhí)行入口方法的方式會(huì)讓SystemServer的main()方法看起來(lái)像是SystemServer的入口方法,而且,這樣也會(huì)清除之前所有SystemServer相關(guān)設(shè)置過(guò)程中需要的堆棧幀。
--------走到 SystemService 進(jìn)程
- /frameworks/base/services/java/com/android/server/SystemServer.java
接下來(lái)我們看看SystemServer的main()方法:
/**
* The main entry point from zygote.
*/
public static void main(String[] args)
{
new SystemServer().run();
}
main()方法中調(diào)用了SystemServer的run()方法,如下所示:
private void run() {try {...
// 1Looper.prepareMainLooper();...
// Initialize native services.
// 2System.loadLibrary("android_servers");
// Check whether we failed to shut down last time we tried.
// This call may not return.performPendingShutdown();
// Initialize the system context.createSystemContext();
// Create the system service manager.
// 3mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelizedSystemServerInitThreadPool.get();}
finally {traceEnd();
// InitBeforeStartServices}
// Start services.try {
traceBeginAndSlog("StartServices");
// 4startBootstrapServices();
// 5startCoreServices();
//6startOtherServices();
SystemServerInitThreadPool.shutdown();}
catch (Throwable ex) {Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;}
finally {
traceEnd();
}...
// Loop forever.
// 7Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
在注釋1處,創(chuàng)建了消息Looper。
在注釋2處,加載了動(dòng)態(tài)庫(kù)libandroid_servers.so。
在注釋3處,創(chuàng)建了SystemServerManager,它的作用是對(duì)系統(tǒng)服務(wù)進(jìn)行創(chuàng)建、啟動(dòng)和生命周期管理。
在注釋4處的startBootstarpServices()方法中使用SystemServiceManager啟動(dòng)了ActivityManagerService、PackageManagerService、PowerManagerService等引導(dǎo)服務(wù)。
在注釋5處的startCoreServices()方法中則啟動(dòng)了BatteryService、WebViewUpdateService、DropBoxManagerService、UsageStatsService4個(gè)核心服務(wù)。
在注釋6處的startOtherServices()方法中啟動(dòng)了WindowManagerService、InputManagerService、CameraService等其它服務(wù)。這些服務(wù)的父類(lèi)都是SystemService。
可以看到,上面把系統(tǒng)服務(wù)分成了三種類(lèi)型:引導(dǎo)服務(wù)、核心服務(wù)、其它服務(wù)。這些系統(tǒng)服務(wù)共有100多個(gè),其中對(duì)于我們來(lái)說(shuō)比較關(guān)鍵的有:
- 引導(dǎo)服務(wù):ActivityManagerService,負(fù)責(zé)四大組件的啟動(dòng)、切換、調(diào)度。
- 引導(dǎo)服務(wù):PackageManagerService,負(fù)責(zé)對(duì)APK進(jìn)行安裝、解析、刪除、卸載等操作。
- 引導(dǎo)服務(wù):PowerManagerService,負(fù)責(zé)計(jì)算系統(tǒng)中與Power相關(guān)的計(jì)算,然后決定系統(tǒng)該如何反應(yīng)。
- 核心服務(wù):BatteryService,管理電池相關(guān)的服務(wù)。
- 其它服務(wù):WindowManagerService,窗口管理服務(wù)。
- 其它服務(wù):InputManagerService,管理輸入事件。
很多系統(tǒng)服務(wù)的啟動(dòng)邏輯都是類(lèi)似的,這里我以啟動(dòng)ActivityManagerService服務(wù)來(lái)進(jìn)行舉例,代碼如下所示:
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
SystemServiceManager 的 startService() 方法啟動(dòng)了ActivityManagerService,該啟動(dòng)方法如下所示:
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {final String name = serviceClass.getName();
...try {Constructor<T> constructor = serviceClass.getConstructor(Context.class);
// 1service = constructor.newInstance(mContext);
}
catch (InstantiationException ex) {...
// 2startService(service);return service;
}
finally {Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
在注釋1處使用反射創(chuàng)建了ActivityManagerService實(shí)例,并在注釋2處調(diào)用了另一個(gè)startService()重載方法,如下所示:
public void startService(@NonNull final SystemService service) {
// Register it.
// 1mServices.add(service);
// Start it.long time = SystemClock.elapsedRealtime();
try {
// 2service.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");
}
在注釋1處,首先會(huì)將ActivityManagerService添加在mServices中,它是一個(gè)存儲(chǔ)SystemService類(lèi)型的ArrayList,這樣就完成了ActivityManagerService的注冊(cè)。
在注釋2處,調(diào)用了ActivityManagerService的onStart()方法完成了啟動(dòng)ActivityManagerService服務(wù)。
除了使用SystemServiceManager的startService()方法來(lái)啟動(dòng)系統(tǒng)服務(wù)外,也可以直接調(diào)用服務(wù)的main()方法來(lái)啟動(dòng)系統(tǒng)服務(wù),如PackageManagerService:
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
這里直接調(diào)用了PackageManagerService的main()方法:
public static PackageManagerService main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.PackageManagerServiceCompilerMapping.checkProperties();
// 1PackageManagerService m = new PackageManagerService(context, installer,factoryTest, onlyCore);
m.enableSystemUserPackages();
// 2ServiceManager.addService("package", m);
// 3final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
在注釋1處,直接新建了一個(gè)PackageManagerService實(shí)例,
注釋2處將PackageManagerService注冊(cè)到服務(wù)大管家ServiceManager中,ServiceManager用于管理系統(tǒng)中的各種Service,用于系統(tǒng)C/S架構(gòu)中的Binder進(jìn)程間通信,即如果Client端需要使用某個(gè)Servcie,首先應(yīng)該到ServiceManager查詢(xún)Service的相關(guān)信息,然后使用這些信息和該Service所在的Server進(jìn)程建立通信通道,這樣Client端就可以服務(wù)端進(jìn)程的Service進(jìn)行通信了。
7. SystemService 進(jìn)程總結(jié)
SystemService的啟動(dòng)流程分析至此已經(jīng)完結(jié),經(jīng)過(guò)以上的分析可知,SystemService進(jìn)程被創(chuàng)建后,主要的處理如下:
- 1、啟動(dòng)Binder線程池,這樣就可以與其他進(jìn)程進(jìn)行Binder跨進(jìn)程通信。
- 2、創(chuàng)建SystemServiceManager,它用來(lái)對(duì)系統(tǒng)服務(wù)進(jìn)行創(chuàng)建、啟動(dòng)和生命周期管理。
- 3、啟動(dòng)各種系統(tǒng)服務(wù):引導(dǎo)服務(wù)、核心服務(wù)、其他服務(wù),共100多種。應(yīng)用開(kāi)發(fā)主要關(guān)注引導(dǎo)服務(wù)ActivityManagerService、PackageManagerService和其他服務(wù)WindowManagerService、InputManagerService即可。