国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

建設(shè)物流網(wǎng)站的規(guī)劃網(wǎng)絡(luò)營(yíng)銷(xiāo)戰(zhàn)略的內(nèi)容

建設(shè)物流網(wǎng)站的規(guī)劃,網(wǎng)絡(luò)營(yíng)銷(xiāo)戰(zhàn)略的內(nèi)容,封面型網(wǎng)站布局,平面設(shè)計(jì)筆記本電腦推薦概述 在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)中有著如此重…

概述

在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)程

鏈接

  1. 在init啟動(dòng)Zygote時(shí)主要是調(diào)用app_main.cpp的main函數(shù)中的AppRuntime.start()方法來(lái)啟動(dòng)Zygote進(jìn)程的;
  2. 接著到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層。
  3. /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)程。
  1. 調(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);
}
  1. 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)程

  1. /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即可。
http://m.aloenet.com.cn/news/37841.html

相關(guān)文章:

  • 網(wǎng)站浮動(dòng)窗口如何做江西seo推廣
  • 建設(shè)網(wǎng)站企業(yè)排行網(wǎng)絡(luò)營(yíng)銷(xiāo)工程師前景
  • 網(wǎng)站開(kāi)發(fā)費(fèi)用稅常德網(wǎng)站設(shè)計(jì)
  • wordpress主題ruikedu正規(guī)seo關(guān)鍵詞排名哪家專(zhuān)業(yè)
  • 怎么做app和網(wǎng)站購(gòu)物最好的營(yíng)銷(xiāo)策劃公司
  • php網(wǎng)站后臺(tái)管理模板推廣排名
  • 什么是網(wǎng)站排名優(yōu)化百度關(guān)鍵詞挖掘工具
  • 廣廣東網(wǎng)站建設(shè)百度軟件下載中心官方網(wǎng)站
  • 網(wǎng)站建設(shè)頁(yè)面設(shè)計(jì)南寧百度seo軟件
  • 姑蘇網(wǎng)站制作國(guó)家免費(fèi)培訓(xùn)機(jī)構(gòu)
  • 公司要網(wǎng)站建設(shè)實(shí)時(shí)熱搜
  • 梧州市網(wǎng)站建設(shè)seo是什么級(jí)別
  • 專(zhuān)業(yè)網(wǎng)站構(gòu)建谷歌優(yōu)化的最佳方案
  • wordpress怎么復(fù)制頁(yè)面福州網(wǎng)站優(yōu)化公司
  • 南昌網(wǎng)站建設(shè)web8848百度一下 官方網(wǎng)
  • 企業(yè)做網(wǎng)站的注意什么百度用戶(hù)服務(wù)中心官網(wǎng)
  • 常德網(wǎng)站建設(shè)案例教程seo培訓(xùn)一對(duì)一
  • 怎么做查詢(xún)網(wǎng)站網(wǎng)站排名怎么做上去
  • 做建筑的網(wǎng)站百度百科創(chuàng)建
  • 織夢(mèng)做的網(wǎng)站怎么樣今日新聞最新事件
  • 減肥養(yǎng)生網(wǎng)站建設(shè)自制網(wǎng)站教程
  • 衡水建設(shè)投資集團(tuán)網(wǎng)站萬(wàn)能軟文范例800字
  • 網(wǎng)站加載頁(yè)模板太倉(cāng)seo網(wǎng)站優(yōu)化軟件
  • 那個(gè)網(wǎng)站專(zhuān)做地質(zhì)基礎(chǔ)信息域名查詢(xún)服務(wù)器
  • 網(wǎng)站在工信部備案百度seo優(yōu)化招聘
  • 網(wǎng)站為什么不被收錄網(wǎng)絡(luò)營(yíng)銷(xiāo)工具包括
  • 3建設(shè)營(yíng)銷(xiāo)型網(wǎng)站流程圖生成關(guān)鍵詞的軟件免費(fèi)
  • 基于web前端的旅游網(wǎng)站論文自己做一個(gè)網(wǎng)站需要多少錢(qián)
  • 北京網(wǎng)站制作公司興田德潤(rùn)可信賴(lài)網(wǎng)絡(luò)營(yíng)銷(xiāo)主要學(xué)什么
  • 企業(yè)網(wǎng)站建設(shè)方案價(jià)位企業(yè)網(wǎng)站設(shè)計(jì)服務(wù)