應用進程
1.1?Android系統進程的啟動過程:
1、init進程fork出Zygote進程后,Zygote進程會創建一個服務端socket,等待AMS發起socket請求。
同時,由Zygote進程fork出的SystemServer進程會啟動各項系統服務,其中就包含了AMS,AMS會啟動Launcher桌面,此時就可以等待用戶點擊App圖標來啟動應用進程了。
2、然后看下系統服務的啟動,不管是由init進程啟動的獨立進程的系統服務如SurfaceFlinger,還是由SystemServer進程啟動的非獨立進程的系統服務如AMS,都是在ServiceManager進程中完成注冊和獲取的,在跨進程通信上使用了Android的binder機制。
ServiceManager進程本身也是一個系統服務,經過啟動進程、啟動binder機制、發布自己和等待請求4個步驟,就可以處理其他系統服務的獲取和注冊需求了。
1.2? Android系統服務的啟動過程:
1.3 AMS發送socket請求
Android應用進程的啟動是被動式的,在Launcher桌面點擊圖標啟動一個應用的組件如Activity時,如果Activity所在的進程不存在,就會創建并啟動進程。
點擊App圖標后經過層層調用會來到ActivityStackSupervisor的startSpecificActivityLocked方法,
//ActivityStackSupervisor.java
final ActivityManagerService mService;void startSpecificActivityLocked(...) {//查找Activity所在的進程,ProcessRecord是用來封裝進程信息的數據結構ProcessRecord app = mService.getProcessRecordLocked(...);//如果進程已啟動,并且binder句柄IApplicationThread也拿到了,那就直接啟動Activityif (app != null && app.thread != null) {realStartActivityLocked(r, app, andResume, checkConfig);return;}//否則,讓AMS啟動進程mService.startProcessLocked(...);
}
app.thread并不是線程,而是一個binder句柄。應用進程使用AMS需要拿到AMS的句柄IActivityManager,而系統需要通知應用和管理應用的生命周期,所以也需要持有應用進程的binder句柄IApplicationThread。
也就是說,他們互相持有彼此的binder句柄,來實現雙向通信。
所以對于AMS來說,
- AMS向Zygote發起啟動應用的socket請求,Zygote收到請求fork出進程,返回進程的pid給AMS;
- 應用進程啟動好后,執行入口main函數,通過attachApplication方法告訴AMS已經啟動,同時傳入應用進程的binder句柄IApplicationThread。
完成這兩步,應用進程的啟動過程才算完成。
1.3.1 流程圖
綜上,Android應用進程的啟動可以總結成以下步驟:
- 點擊Launcher桌面的App圖標
- AMS發起socket請求
- Zygote進程接收請求并處理參數
- Zygote進程fork出應用進程,應用進程繼承得到虛擬機實例
- 應用進程啟動binder線程池、運行ActivityThread類的main函數、啟動Looper循環