Android應(yīng)用程序進(jìn)程啟動過程的源代碼分析(一)
Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程具有兩個特點(diǎn),一是進(jìn)程的入口函數(shù)是ActivityThread.main,二是進(jìn)程天然支持 Binder進(jìn)程間通信機(jī)制;這兩個特點(diǎn)都是在進(jìn)程的初始化過程中實現(xiàn)的,本文將詳細(xì)分析Android應(yīng)用程序進(jìn)程創(chuàng)建過程中是如何實現(xiàn)這兩個特點(diǎn)的。
Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程的入口函數(shù)是ActivityThread.main比較好理解,即進(jìn)程創(chuàng)建完成之 后,Android應(yīng)用程序框架層就會在這個進(jìn)程中將ActivityThread類加載進(jìn)來,然后執(zhí)行它的main函數(shù),這個main函數(shù)就是進(jìn)程執(zhí)行 消息循環(huán)的地方了。Android應(yīng)用程序框架層創(chuàng)建的應(yīng)用程序進(jìn)程天然支持Binder進(jìn)程間通信機(jī)制這個特點(diǎn)應(yīng)該怎么樣理解呢?前面我們在學(xué)習(xí) Android系統(tǒng)的Binder進(jìn)程間通信機(jī)制時說到,它具有四個組件,分別是驅(qū)動程序、守護(hù)進(jìn)程、Client以及Server,其中Server組 件在初始化時必須進(jìn)入一個循環(huán)中不斷地與Binder驅(qū)動程序進(jìn)行到交互,以便獲得Client組件發(fā)送的請求,具體可參考Android系統(tǒng)進(jìn)程間通信 (IPC)機(jī)制Binder中的Server啟動過程源代碼分析一文,但是,當(dāng)我們在Android應(yīng)用程序中實現(xiàn)Server組件的時候,我們并沒有讓 進(jìn)程進(jìn)入一個循環(huán)中去等待Client組件的請求,然而,當(dāng)Client組件得到這個Server組件的遠(yuǎn)程接口時,卻可以順利地和Server組件進(jìn)行 進(jìn)程間通信,這就是因為Android應(yīng)用程序進(jìn)程在創(chuàng)建的時候就已經(jīng)啟動了一個線程池來支持Server組件和Binder驅(qū)動程序之間的交互了,這 樣,極大地方便了在Android應(yīng)用程序中創(chuàng)建Server組件。
在Android應(yīng)用程序框架層中,是由ActivityManagerService組件負(fù)責(zé)為Android應(yīng)用程序創(chuàng)建新的進(jìn)程的,它本來也是 運(yùn)行在一個獨(dú)立的進(jìn)程之中,不過這個進(jìn)程是在系統(tǒng)啟動的過程中創(chuàng)建的。ActivityManagerService組件一般會在什么情況下會為應(yīng)用程序 創(chuàng)建一個新的進(jìn)程呢?當(dāng)系統(tǒng)決定要在一個新的進(jìn)程中啟動一個Activity或者Service時,它就會創(chuàng)建一個新的進(jìn)程了,然后在這個新的進(jìn)程中啟動 這個Activity或者Service,具體可以參考Android系統(tǒng)在新進(jìn)程中啟動自定義服務(wù)過程(startService)的原理分析、 Android應(yīng)用程序啟動過程源代碼分析和Android應(yīng)用程序在新的進(jìn)程中啟動新的Activity的方法和過程分析這三篇文章。
ActivityManagerService啟動新的進(jìn)程是從其成員函數(shù)startProcessLocked開始的,在深入分析這個過程之前,我們先來看一下進(jìn)程創(chuàng)建過程的序列圖,然后再詳細(xì)分析每一個步驟。
Step 1. ActivityManagerService.startProcessLocked
這個函數(shù)定義在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:
- [java] view plaincopypublic final class ActivityManagerService extends
- ActivityManagerNative
- implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
- ......
- private final void startProcessLocked(ProcessRecord app,
- String hostingType, String hostingNameStr) {
- ......
- try {
- int uid = app.info.uid;
- int[] gids = null;
- try {
- gids = mContext.getPackageManager().getPackageGids(
- app.info.packageName);
- } catch (PackageManager.NameNotFoundException e) {
- ......
- }
- ......
- int debugFlags = 0;
- ......
- int pid = Process.start("android.app.ActivityThread",
- mSimpleProcessManagement ? app.processName : null, uid, uid,
- gids, debugFlags, null);
- ......
- } catch (RuntimeException e) {
- ......
- }
- }
- ......
- }
它調(diào)用了Process.start函數(shù)開始為應(yīng)用程序創(chuàng)建新的進(jìn)程,注意,它傳入一個***個參數(shù) 為"android.app.ActivityThread",這就是進(jìn)程初始化時要加載的Java類了,把這個類加載到進(jìn)程之后,就會把它里面的靜態(tài)成 員函數(shù)main作為進(jìn)程的入口點(diǎn),后面我們會看到。