目錄介紹
- 1.什么是Zygote進(jìn)程
- 1.1 簡單介紹
- 1.2 各個(gè)進(jìn)程的先后順序
- 1.3 進(jìn)程作用說明
- 2.Zygote進(jìn)程的啟動(dòng)流程
- 2.1 源碼位置
- 2.2 ZygoteInit類的main方法
- 2.3 registerZygoteSocket(socketName)分析
- 2.4 preLoad()方法分析
- 2.5 startSystemServer()啟動(dòng)進(jìn)程
- 3.SystemServer進(jìn)程啟動(dòng)流程
- 3.1 SystemServer進(jìn)程簡介
- 3.2 SystemServer的main方法
- 3.3 查看run方法
- 3.4 run方法中createSystemContext()解析
- 3.5 mSystemServiceManager的創(chuàng)建
- 4.啟動(dòng)服務(wù)
- 4.1 啟動(dòng)哪些服務(wù)
- 4.2 啟動(dòng)服務(wù)流程源碼分析
- 4.3 啟動(dòng)部分服務(wù)
好消息
- 博客筆記大匯總【16年3月到至今】徐伐,包括Java基礎(chǔ)及深入知識點(diǎn)窍育,Android技術(shù)博客,Python學(xué)習(xí)筆記等等踊餐,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題拴泌,長期更新維護(hù)并且修正瑰抵,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客厚棵,從12年起,積累共計(jì)47篇[近20萬字]蔼紧,轉(zhuǎn)載請注明出處婆硬,謝謝!
- 鏈接地址:https://github.com/yangchong211/YCBlogs
- 如果覺得好奸例,可以star一下彬犯,謝謝向楼!當(dāng)然也歡迎提出建議,萬事起于忽微谐区,量變引起質(zhì)變湖蜕!
1.什么是Zygote進(jìn)程
1.1 簡單介紹
- Zygote進(jìn)程是所有的android進(jìn)程的父進(jìn)程,包括SystemServer和各種應(yīng)用進(jìn)程都是通過Zygote進(jìn)程fork出來的宋列。Zygote(孵化)進(jìn)程相當(dāng)于是android系統(tǒng)的根進(jìn)程昭抒,后面所有的進(jìn)程都是通過這個(gè)進(jìn)程fork出來的
- 雖然Zygote進(jìn)程相當(dāng)于Android系統(tǒng)的根進(jìn)程,但是事實(shí)上它也是由Linux系統(tǒng)的init進(jìn)程啟動(dòng)的炼杖。
1.2 各個(gè)進(jìn)程的先后順序
- init進(jìn)程 --> Zygote進(jìn)程 --> SystemServer進(jìn)程 -->各種應(yīng)用進(jìn)程
1.3 進(jìn)程作用說明
- init進(jìn)程:linux的根進(jìn)程灭返,android系統(tǒng)是基于linux系統(tǒng)的,因此可以算作是整個(gè)android操作系統(tǒng)的第一個(gè)進(jìn)程坤邪;
- Zygote進(jìn)程:android系統(tǒng)的根進(jìn)程熙含,主要作用:可以作用Zygote進(jìn)程fork出SystemServer進(jìn)程和各種應(yīng)用進(jìn)程;
- SystemService進(jìn)程:主要是在這個(gè)進(jìn)程中啟動(dòng)系統(tǒng)的各項(xiàng)服務(wù)艇纺,比如ActivityManagerService婆芦,PackageManagerService,WindowManagerService服務(wù)等等喂饥;
- 各種應(yīng)用進(jìn)程:啟動(dòng)自己編寫的客戶端應(yīng)用時(shí),一般都是重新啟動(dòng)一個(gè)應(yīng)用進(jìn)程肠鲫,有自己的虛擬機(jī)與運(yùn)行環(huán)境员帮;
2.Zygote進(jìn)程的啟動(dòng)流程
2.1 源碼位置
- 位置:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
- Zygote進(jìn)程mian方法主要執(zhí)行邏輯:
- 初始化DDMS;
- 注冊Zygote進(jìn)程的socket通訊导饲;
- 初始化Zygote中的各種類捞高,資源文件,OpenGL渣锦,類庫顽决,Text資源等等丽柿;
- 初始化完成之后fork出SystemServer進(jìn)程;
- fork出SystemServer進(jìn)程之后,關(guān)閉socket連接渠牲;
2.2 ZygoteInit類的main方法
- init進(jìn)程在啟動(dòng)Zygote進(jìn)程時(shí)一般都會調(diào)用ZygoteInit類的main方法,因此這里看一下該方法的具體實(shí)現(xiàn)(基于android23源碼)曲楚;
- 調(diào)用enableDdms()幢痘,設(shè)置DDMS可用,可以發(fā)現(xiàn)DDMS啟動(dòng)的時(shí)機(jī)還是比較早的皆看,在整個(gè)Zygote進(jìn)程剛剛開始要啟動(dòng)額時(shí)候就設(shè)置可用仓坞。
- 之后初始化各種參數(shù)
- 通過調(diào)用registerZygoteSocket方法,注冊為Zygote進(jìn)程注冊Socket
- 然后調(diào)用preload方法實(shí)現(xiàn)預(yù)加載各種資源
- 然后通過調(diào)用startSystemServer開啟SystemServer服務(wù)腰吟,這個(gè)是重點(diǎn)
public static void main(String argv[]) { try { //設(shè)置ddms可以用 RuntimeInit.enableDdms(); SamplingProfilerIntegration.start(); boolean startSystemServer = false; String socketName = "zygote"; String abiList = null; for (int i = 1; i < argv.length; i++) { if ("start-system-server".equals(argv[i])) { startSystemServer = 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)) { socketName = argv[i].substring(SOCKET_NAME_ARG.length()); } else { throw new RuntimeException("Unknown command line argument: " + argv[i]); } } if (abiList == null) { throw new RuntimeException("No ABI list supplied."); } registerZygoteSocket(socketName); EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START, SystemClock.uptimeMillis()); preload(); EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END, SystemClock.uptimeMillis()); SamplingProfilerIntegration.writeZygoteSnapshot(); gcAndFinalize(); Trace.setTracingEnabled(false); if (startSystemServer) { startSystemServer(abiList, socketName); } Log.i(TAG, "Accepting command socket connections"); runSelectLoop(abiList); closeServerSocket(); } catch (MethodAndArgsCaller caller) { caller.run(); } catch (RuntimeException ex) { Log.e(TAG, "Zygote died with exception", ex); closeServerSocket(); throw ex; } }
2.3 registerZygoteSocket(socketName)分析
- 調(diào)用registerZygoteSocket(String socketName)為Zygote進(jìn)程注冊socket
private static void registerZygoteSocket(String socketName) { if (sServerSocket == null) { int fileDesc; final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName; try { String env = System.getenv(fullSocketName); fileDesc = Integer.parseInt(env); } catch (RuntimeException ex) { throw new RuntimeException(fullSocketName + " unset or invalid", ex); } try { FileDescriptor fd = new FileDescriptor(); fd.setInt$(fileDesc); sServerSocket = new LocalServerSocket(fd); } catch (IOException ex) { throw new RuntimeException( "Error binding to local socket '" + fileDesc + "'", ex); } } }
2.4 preLoad()方法分析
- 源碼如下所示
static void preload() { Log.d(TAG, "begin preload"); preloadClasses(); preloadResources(); preloadOpenGL(); preloadSharedLibraries(); preloadTextResources(); // Ask the WebViewFactory to do any initialization that must run in the zygote process, // for memory sharing purposes. WebViewFactory.prepareWebViewInZygote(); Log.d(TAG, "end preload"); }
- 大概操作是這樣的:
- preloadClasses()用于初始化Zygote中需要的class類无埃;
- preloadResources()用于初始化系統(tǒng)資源;
- preloadOpenGL()用于初始化OpenGL;
- preloadSharedLibraries()用于初始化系統(tǒng)libraries嫉称;
- preloadTextResources()用于初始化文字資源侦镇;
- prepareWebViewInZygote()用于初始化webview;
2.5 startSystemServer()啟動(dòng)進(jìn)程
- 這段邏輯的執(zhí)行邏輯就是通過Zygote fork出SystemServer進(jìn)程
private static boolean startSystemServer(String abiList, String socketName) throws MethodAndArgsCaller, RuntimeException { long capabilities = posixCapabilitiesAsBits( OsConstants.CAP_BLOCK_SUSPEND, 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_RESOURCE, OsConstants.CAP_SYS_TIME, OsConstants.CAP_SYS_TTY_CONFIG ); /* Hardcoded command line to start the system server */ String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007", "--capabilities=" + capabilities + "," + capabilities, "--nice-name=system_server", "--runtime-args", "com.android.server.SystemServer", }; ZygoteConnection.Arguments parsedArgs = null; int pid; try { parsedArgs = new ZygoteConnection.Arguments(args); ZygoteConnection.applyDebuggerSystemProperty(parsedArgs); ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs); /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } /* For child process */ if (pid == 0) { if (hasSecondZygote(abiList)) { waitForSecondaryZygote(socketName); } handleSystemServerProcess(parsedArgs); } return true; }
3.SystemServer進(jìn)程啟動(dòng)流程
3.1 SystemServer進(jìn)程簡介
- SystemServer進(jìn)程主要的作用是在這個(gè)進(jìn)程中啟動(dòng)各種系統(tǒng)服務(wù),比如ActivityManagerService澎埠,PackageManagerService虽缕,WindowManagerService服務(wù),以及各種系統(tǒng)性的服務(wù)其實(shí)都是在SystemServer進(jìn)程中啟動(dòng)的蒲稳,而當(dāng)我們的應(yīng)用需要使用各種系統(tǒng)服務(wù)的時(shí)候其實(shí)也是通過與SystemServer進(jìn)程通訊獲取各種服務(wù)對象的句柄的氮趋。
3.2 SystemServer的main方法
- 如下所示,比較簡單江耀,只是new出一個(gè)SystemServer對象并執(zhí)行其run方法剩胁,查看SystemServer類的定義我們知道其實(shí)final類型的,所以我們一般不能重寫或者繼承祥国。
- image
3.3 查看run方法
- 代碼如下所示
- 首先判斷系統(tǒng)當(dāng)前時(shí)間昵观,若當(dāng)前時(shí)間小于1970年1月1日,則一些初始化操作可能會處所舌稀,所以當(dāng)系統(tǒng)的當(dāng)前時(shí)間小于1970年1月1日的時(shí)候啊犬,設(shè)置系統(tǒng)當(dāng)前時(shí)間為該時(shí)間點(diǎn)。
- 然后是設(shè)置系統(tǒng)的語言環(huán)境等
- 接著設(shè)置虛擬機(jī)運(yùn)行內(nèi)存壁查,加載運(yùn)行庫觉至,設(shè)置SystemServer的異步消息
private void run() { if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } if (!SystemProperties.get("persist.sys.language").isEmpty()) { final String languageTag = Locale.getDefault().toLanguageTag(); SystemProperties.set("persist.sys.locale", languageTag); SystemProperties.set("persist.sys.language", ""); SystemProperties.set("persist.sys.country", ""); SystemProperties.set("persist.sys.localevar", ""); } Slog.i(TAG, "Entered the Android system server!"); EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis()); SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary()); if (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); mProfilerSnapshotTimer = new Timer(); mProfilerSnapshotTimer.schedule(new TimerTask() { @Override public void run() { SamplingProfilerIntegration.writeSnapshot("system_server", null); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } // Mmmmmm... more memory! VMRuntime.getRuntime().clearGrowthLimit(); // The system server has to run all of the time, so it needs to be // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); // Some devices rely on runtime fingerprint generation, so make sure // we've defined it before booting further. Build.ensureFingerprintProperty(); // Within the system server, it is an error to access Environment paths without // explicitly specifying a user. Environment.setUserRequired(true); // Ensure binder calls into the system always run at foreground priority. BinderInternal.disableBackgroundScheduling(true); // Prepare the main looper thread (this thread). android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); Looper.prepareMainLooper(); // Initialize native services. System.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. mSystemServiceManager = new SystemServiceManager(mSystemContext); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); // Start services. try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } // For debug builds, log event loop stalls to dropbox for analysis. if (StrictMode.conditionallyEnableDebugLogging()) { Slog.i(TAG, "Enabled StrictMode for system server main thread."); } // Loop forever. Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
- 然后下面的代碼是:
// Initialize the system context. createSystemContext(); // Create the system service manager. mSystemServiceManager = new SystemServiceManager(mSystemContext); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); // Start services. try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; }
3.4 run方法中createSystemContext()解析
- 調(diào)用createSystemContext()方法:
- 可以看到在SystemServer進(jìn)程中也存在著Context對象,并且是通過ActivityThread.systemMain方法創(chuàng)建context的睡腿,這一部分的邏輯以后會通過介紹Activity的啟動(dòng)流程來介紹语御,這里就不在擴(kuò)展,只知道在SystemServer進(jìn)程中也需要?jiǎng)?chuàng)建Context對象席怪。
private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); }
3.5 mSystemServiceManager的創(chuàng)建
- 看run方法中应闯,通過SystemServiceManager的構(gòu)造方法創(chuàng)建了一個(gè)新的SystemServiceManager對象,我們知道SystemServer進(jìn)程主要是用來構(gòu)建系統(tǒng)各種service服務(wù)的挂捻,而SystemServiceManager就是這些服務(wù)的管理對象碉纺。
- 然后調(diào)用:
- 將SystemServiceManager對象保存SystemServer進(jìn)程中的一個(gè)數(shù)據(jù)結(jié)構(gòu)中。
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
- 最后開始執(zhí)行:
// Start services. try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; }
- 里面主要涉及了是三個(gè)方法:
- startBootstrapServices() 主要用于啟動(dòng)系統(tǒng)Boot級服務(wù)
- startCoreServices() 主要用于啟動(dòng)系統(tǒng)核心的服務(wù)
- startOtherServices() 主要用于啟動(dòng)一些非緊要或者是非需要及時(shí)啟動(dòng)的服務(wù)
- 里面主要涉及了是三個(gè)方法:
4.啟動(dòng)服務(wù)
4.1 啟動(dòng)哪些服務(wù)
- 在開始執(zhí)行啟動(dòng)服務(wù)之前總是會先嘗試通過socket方式連接Zygote進(jìn)程刻撒,在成功連接之后才會開始啟動(dòng)其他服務(wù)惜辑。
- image
4.2 啟動(dòng)服務(wù)流程源碼分析
- 首先看一下startBootstrapServices方法:
private void startBootstrapServices() { Installer installer = mSystemServiceManager.startService(Installer.class); mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); mActivityManagerService.initPowerManagement(); // Manages LEDs and display backlight so we need it to bring up the display. mSystemServiceManager.startService(LightsService.class); // Display manager is needed to provide display metrics before package manager // starts up. mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class); // We need the default display before we can initialize the package manager. mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); // Only run "core" apps if we're encrypting the device. String cryptState = SystemProperties.get("vold.decrypt"); if (ENCRYPTING_STATE.equals(cryptState)) { Slog.w(TAG, "Detected encryption in progress - only parsing core apps"); mOnlyCore = true; } else if (ENCRYPTED_STATE.equals(cryptState)) { Slog.w(TAG, "Device encrypted - only parsing core apps"); mOnlyCore = true; } // Start the package manager. Slog.i(TAG, "Package Manager"); mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); Slog.i(TAG, "User Service"); ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance()); // Initialize attribute cache used to cache resources from packages. AttributeCache.init(mSystemContext); // Set up the Application instance for the system process and get started. mActivityManagerService.setSystemProcess(); // The sensor service needs access to package manager service, app ops // service, and permissions service, therefore we start it after them. startSensorService(); }
- 先執(zhí)行:
Installer installer = mSystemServiceManager.startService(Installer.class);
- mSystemServiceManager是系統(tǒng)服務(wù)管理對象,在main方法中已經(jīng)創(chuàng)建完成疫赎,這里我們看一下其startService方法的具體實(shí)現(xiàn):
- 可以看到通過反射器構(gòu)造方法創(chuàng)建出服務(wù)類盛撑,然后添加到SystemServiceManager的服務(wù)列表數(shù)據(jù)中,最后調(diào)用了service.onStart()方法捧搞,因?yàn)閭鬟f的是Installer.class
public <T extends SystemService> T startService(Class<T> serviceClass) { final String name = serviceClass.getName(); Slog.i(TAG, "Starting " + name); // Create the service. if (!SystemService.class.isAssignableFrom(serviceClass)) { throw new RuntimeException("Failed to create " + name + ": service must extend " + SystemService.class.getName()); } final T service; try { Constructor<T> constructor = serviceClass.getConstructor(Context.class); service = constructor.newInstance(mContext); } catch (InstantiationException ex) { throw new RuntimeException("Failed to create service " + name + ": service could not be instantiated", ex); } catch (IllegalAccessException ex) { throw new RuntimeException("Failed to create service " + name + ": service must have a public constructor with a Context argument", ex); } catch (NoSuchMethodException ex) { throw new RuntimeException("Failed to create service " + name + ": service must have a public constructor with a Context argument", ex); } catch (InvocationTargetException ex) { throw new RuntimeException("Failed to create service " + name + ": service constructor threw an exception", ex); } // Register it. mServices.add(service); // Start it. try { service.onStart(); } catch (RuntimeException ex) { throw new RuntimeException("Failed to start service " + name + ": onStart threw an exception", ex); } return service; }
- 看一下Installer的onStart方法:
- 很簡單就是執(zhí)行了mInstaller的waitForConnection方法抵卫,這里簡單介紹一下Installer類狮荔,該類是系統(tǒng)安裝apk時(shí)的一個(gè)服務(wù)類,繼承SystemService(系統(tǒng)服務(wù)的一個(gè)抽象接口)介粘,需要在啟動(dòng)完成Installer服務(wù)之后才能啟動(dòng)其他的系統(tǒng)服務(wù)殖氏。
@Override public void onStart() { Slog.i(TAG, "Waiting for installd to be ready."); mInstaller.waitForConnection(); }
- 然后查看waitForConnection()方法:
- 通過追蹤代碼可以發(fā)現(xiàn),其在不斷的通過ping命令連接Zygote進(jìn)程(SystemServer和Zygote進(jìn)程通過socket方式通訊姻采,其他進(jìn)程通過Binder方式通訊)
public void waitForConnection() { for (;;) { if (execute("ping") >= 0) { return; } Slog.w(TAG, "installd not ready"); SystemClock.sleep(1000); } }
- 繼續(xù)看startBootstrapServices方法:
- 這段代碼主要是用于啟動(dòng)ActivityManagerService服務(wù)雅采,并為其設(shè)置SysServiceManager和Installer。ActivityManagerService是系統(tǒng)中一個(gè)非常重要的服務(wù)慨亲,Activity婚瓜,service,Broadcast刑棵,contentProvider都需要通過其余系統(tǒng)交互巴刻。
// Activity manager runs the show. mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer);
- 首先看一下Lifecycle類的定義:
- 可以看到其實(shí)ActivityManagerService的一個(gè)靜態(tài)內(nèi)部類,在其構(gòu)造方法中會創(chuàng)建一個(gè)ActivityManagerService蛉签,通過剛剛對Installer服務(wù)的分析我們知道胡陪,SystemServiceManager的startService方法會調(diào)用服務(wù)的onStart()方法,而在Lifecycle類的定義中我們看到其onStart()方法直接調(diào)用了mService.start()方法碍舍,mService是Lifecycle類中對ActivityManagerService的引用
public static final class Lifecycle extends SystemService { private final ActivityManagerService mService; public Lifecycle(Context context) { super(context); mService = new ActivityManagerService(context); } @Override public void onStart() { mService.start(); } public ActivityManagerService getService() { return mService; } }
4.3 啟動(dòng)部分服務(wù)
- 啟動(dòng)PowerManagerService服務(wù):
- 啟動(dòng)方式跟上面的ActivityManagerService服務(wù)相似都會調(diào)用其構(gòu)造方法和onStart方法柠座,PowerManagerService主要用于計(jì)算系統(tǒng)中和Power相關(guān)的計(jì)算,然后決策系統(tǒng)應(yīng)該如何反應(yīng)片橡。同時(shí)協(xié)調(diào)Power如何與系統(tǒng)其它模塊的交互妈经,比如沒有用戶活動(dòng)時(shí),屏幕變暗等等锻全。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
- 然后是啟動(dòng)LightsService服務(wù)
- 主要是手機(jī)中關(guān)于閃光燈,LED等相關(guān)的服務(wù)录煤;也是會調(diào)用LightsService的構(gòu)造方法和onStart方法鳄厌;
mSystemServiceManager.startService(LightsService.class);
- 然后是啟動(dòng)DisplayManagerService服務(wù)
- 主要是手機(jī)顯示方面的服務(wù)
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
-
然后是啟動(dòng)PackageManagerService,該服務(wù)也是android系統(tǒng)中一個(gè)比較重要的服務(wù)
- 包括多apk文件的安裝妈踊,解析了嚎,刪除,卸載等等操作廊营。
- 可以看到PackageManagerService服務(wù)的啟動(dòng)方式與其他服務(wù)的啟動(dòng)方式有一些區(qū)別歪泳,直接調(diào)用了PackageManagerService的靜態(tài)main方法
Slog.i(TAG, "Package Manager"); mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager();
- 看一下其main方法的具體實(shí)現(xiàn):
- 可以看到也是直接使用new的方式創(chuàng)建了一個(gè)PackageManagerService對象,并在其構(gòu)造方法中初始化相關(guān)變量露筒,最后調(diào)用了ServiceManager.addService方法呐伞,主要是通過Binder機(jī)制與JNI層交互
public static PackageManagerService main(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { PackageManagerService m = new PackageManagerService(context, installer, factoryTest, onlyCore); ServiceManager.addService("package", m); return m; }
- 然后查看startCoreServices方法:
- 可以看到這里啟動(dòng)了BatteryService(電池相關(guān)服務(wù)),UsageStatsService慎式,WebViewUpdateService服務(wù)等伶氢。
private void startCoreServices() { // Tracks the battery level. Requires LightService. mSystemServiceManager.startService(BatteryService.class); // Tracks application usage stats. mSystemServiceManager.startService(UsageStatsService.class); mActivityManagerService.setUsageStatsManager( LocalServices.getService(UsageStatsManagerInternal.class)); // Update after UsageStatsService is available, needed before performBootDexOpt. mPackageManagerService.getUsageStatsIfNoPackageUsageInfo(); // Tracks whether the updatable WebView is in a ready state and watches for update installs. mSystemServiceManager.startService(WebViewUpdateService.class); }
總結(jié):
- SystemServer進(jìn)程是android中一個(gè)很重要的進(jìn)程由Zygote進(jìn)程啟動(dòng)趟径;
- SystemServer進(jìn)程主要用于啟動(dòng)系統(tǒng)中的服務(wù);
- SystemServer進(jìn)程啟動(dòng)服務(wù)的啟動(dòng)函數(shù)為main函數(shù)癣防;
- SystemServer在執(zhí)行過程中首先會初始化一些系統(tǒng)變量蜗巧,加載類庫,創(chuàng)建Context對象蕾盯,創(chuàng)建SystemServiceManager對象等之后才開始啟動(dòng)系統(tǒng)服務(wù)幕屹;
- SystemServer進(jìn)程將系統(tǒng)服務(wù)分為三類:boot服務(wù),core服務(wù)和other服務(wù)级遭,并逐步啟動(dòng)
- SertemServer進(jìn)程在嘗試啟動(dòng)服務(wù)之前會首先嘗試與Zygote建立socket通訊望拖,只有通訊成功之后才會開始嘗試啟動(dòng)服務(wù);
- 創(chuàng)建的系統(tǒng)服務(wù)過程中主要通過SystemServiceManager對象來管理装畅,通過調(diào)用服務(wù)對象的構(gòu)造方法和onStart方法初始化服務(wù)的相關(guān)變量靠娱;
- 服務(wù)對象都有自己的異步消息對象,并運(yùn)行在單獨(dú)的線程中掠兄;
參考博客
- http://www.reibang.com/p/064136533445
- http://blog.csdn.net/qq_23547831/article/details/51104873
- http://www.xuebuyuan.com/2178651.html
- http://www.reibang.com/p/e69d22ec0582
- http://blog.csdn.net/luoshengyang/article/details/6768304
- http://blog.csdn.net/ericming200409/article/details/45566153
關(guān)于其他內(nèi)容介紹
01.關(guān)于博客匯總鏈接
- 1.技術(shù)博客匯總
- 2.開源項(xiàng)目匯總
- 3.生活博客匯總
- 4.喜馬拉雅音頻匯總
- 5.其他匯總
02.關(guān)于我的博客
- 我的個(gè)人站點(diǎn):www.yczbj.org像云,www.ycbjie.cn
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
- 簡書:http://www.reibang.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜馬拉雅聽書:http://www.ximalaya.com/zhubo/71989305/
- 開源中國:https://my.oschina.net/zbj1618/blog
- 泡在網(wǎng)上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 郵箱:yangchong211@163.com
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault頭條:https://segmentfault.com/u/xiangjianyu/articles