Zygote初始化完成,建立的第一個進程為系統進程(SystemServer進程), 首先會執行此進程的main()方法,我們看main方法
public static void main(String[] args) {
...
System.loadLibrary("android_servers");
init1(args) ;
}
從這個方法中就可以看出,首先載入了一個本地庫android_servers.so庫,然後調用init1() 方法,此方法是一個native方法,也就是說,這個方法是由C/C++實現的, 此方法據說是初始化一些系統級的服務,具體什麼服務,還有待研究,但肯定的一點是,在init1()方法中會調用init2()方法,現在可以看看init2()方法中做了那些操作,
public static final void init2() {
Thread thr=new ServerThread();
thr.start();
}
由此可以,此方法主要是啟動了一個線程,那麼我們具體分析ServerThread線程中的run()方法,
在run()方法中主要啟動了一系列服務,並且把這些服務一一添加到ServiceManager進程,由ServiceManager來統一管理,以後使用這些服務都會通過ServiceManager進程來讀取, 範例程式碼如下:
PowerManagerService power=new PowerManagerService(); // 建立電源管理服務
ServiceManager.addService(Context.POWER_SERVICE,power); // 添加服務到ServiceManager
其中最重要的兩個服務是ActivityManagerService 和 WindowManagerService
ActivityManagerService服務(簡稱是AMS服務)是管理android概念空間中的四大組件,包括Activity,Service,等的管理,生命週期的管理,狀態維護等工作,
注意,它是管理所有手機中所有應用程式的組件,並不是單獨管理一個程式。
WindowManagerService服務(簡稱是WMS服務)主要是管理Activity中視窗的管理,是管理手機中所有程式所有activity中的所有視窗,並不單間是管理一個程式中的視窗,
我們先看AMS的初始化過程,
1):首先調AMS的main()方法
2):調用AMS的setSystemProcess()方法
3):調用AMS的installSystemProviders()方法
4):調用AMS的setWindowManager()方法
5):調用AMS的systemReady方法
1:AMS的main()方法分析:通過AThread內部類來建立AMS對象,調用ActivityThread類中的systemMain()方法,建立ActivityThread對象,最後調用AMS中的 startRunning();
2:AMS中的setSystemProcess()方法分析:
首先會把AMS添加到ServiceManager進程中,接著再添加MemBinder,CpuBinder,PermissionController到ServiceManager中
我猜這三個的作用是:Cpu控制和許可權控制,
接著,會調用AMS中的newProcessRecordLocked()方法建立一個ActivityThread類的進程,按照IPC的概念,此類應該為表示用戶端,而AMS表示服務端,此類的進程被封裝成ProcessRecord類,在服務端ProcessRecord都表示為進程,建立完畢後,再看如下代碼
ProcessRecord app=mSelf.newProcessRecordLocked(mSystemThread.getApplicationThread(),info,info.processName);
mSelf.mProcessNames.put(app,app.info.uid,app);
synchronized(mSelf.mPidsSelfLocked) {
mSelf.mPidsSelfLocked.put(app.pid,app);
}
mSelf.updateLruProcessLocked(app,true,true);
其中mSelf就是代表AMS自己,
mProcessNames是一個HashMap,主要用來存放ProcessRecord對象,每建立一個新的進程,都會添加到此資料結構中,
mPidsSelfLocked也是一個ProcessMap資料結構,存取方式為通過app.pid來尋找ProcessRecord。
從newProcessRecordLocked(thread,info,customProcess)方法中分析,要建立一個進程要的參數如下:
IApplicationThread thread:
ApplicationInfo info:// 進程的資訊,包括名字,等內容
String customProcess:進程名字
再後來會調用updateLruProcessLocked()方法,來更新最後一次開啟程式的列表,
3:調用AMS的installSystemProviders()方法分析,這個方法的主要作用是:初始化與系統進程(system)相關的所有ContentProviders
代碼如下:
public static final installSystemProviders() {
List providers;
synchronized(mSelf) {
ProcessRecord app=mSelf.mProcessNames.get("system",Process.SYSTEM_UID);// 得到名字為system的進程
providers=mSelf.generateApplicationProvidersLocked(app); // 得到所有與此進程相關的Providers
......
if(providers!=null) {
mSystemThread.installSystemProviders(providers); // 通知用戶端(ActivityThread)初始化providers
}
}
}
4:調用AMS的setWindowManager()方法,
此方法主要作用是:把WindowManagerService賦給AMS中的一個執行個體,以便於AMS更好的控制WMS