--摘自《Android進階解密》
根Activity啟動過程中會涉及4個進程,分別是Zygote進程、Launcher進程、AMS所在進程(SystemServer進程)、應用程序進程,關系圖如下
其中步驟2采用的是Socket通信,步驟1和4采用的是Binder通信
如果是普通Activity啟動過程會涉及兩個進程:AMS所在進程和應用程序進程
啟動過程
第一步:Launcher請求AMS過程
1)Android8.0之前是通過ActivityManagerNative的getDefault來獲取AMS的代理對象的,現在這個邏輯封裝到了ActivityManager中而不是ActivityManagerNative中
2)Android8.0之前並沒有采用AIDL,而是采用了類似AIDL的形式,用AMS的代理對象ActivityManagerProxy來與AMS進行進程間通信,Android8.0去除了ActivityManagerNative的內部類ActivityManagerProxy,代替它的是IActivityManager,它是AMS在本地的代理。
第二步:AMS到ApplicationThread的調用過程
1)UserHandle.getCallingUserId(),這個方法會獲得調用者的UserId,AMS根據這個UserId來確定調用者的權限
2)TaskRecord代表啟動的Activity所在的棧
3)ActivityRecord用於描述一個Activity,用來記錄一個Activity的所有信息
4)ApplicationThread繼承了IApplicationThread.Stub,是AMS所在進程(SystemServer進程)和應用程序進程的通信橋梁
第三步:ActivityThread啟動Activity的過程
1)ApplicationThread是ActivityThread的內部類
2)H,它是ActivityThread的內部類並繼承自Handler,是應用程序進程中主線程的消息管理類。因為ApplicationThread是一個Binder,它的調用邏輯運行在Binder線程池中,所以這里需要用H將代碼的邏輯切換到主線程中
3)應用程序進程要啟動Activity時需要將該Activity所屬的APK加載進來,而LoadedApk就是用來描述已加載的APK文件的
歡迎關注的微信公眾號:安卓圈