Android Applicaion組件創建的源代碼分析(Android 9,含序列圖)

1. Applicaion啓動流程源代碼分析

本次使用的源代碼版本爲android 9,通過Android SDK中sources直接查看代碼文件。
共分析了四組代碼ActivityThread.java、ActivityManagerService.java、Instrumentation.java、Application.java,PackageManagerService.java。
類關係

  1. ActivityThread:通過IActivityManager類,通知AMS準備application啓動所需進程數據;
  2. ActivityManagerService:獲取application啓動所需進程數據;
  3. Instrumentation:創建和啓動Application;跟蹤Application的生命週期;
  4. PackageManagerService:權限校撿(checkPermission,checkUidPermission),Apk
    meta信息獲取(getApplicationInfo等),四大組件信息獲取(query系列方法)等功能。

2. 啓動過程中應用進程、系統服務進程通信的分界點

通信分界點

  1. AMS通過ProcessRecord來維護進程運行時的狀態信息,需要將應用進程綁定到ProcessRecord才能開始一個Application的構建;通過ActivityRecord來維護Activity運行時的狀態信息,需要將Activity綁定到AMS中的ActivityRecord能開始Activity的生命週期;
  2. 通過兩個Binder接口IApplicationThread和IActivityManager實現應用進程與服務通信;
  3. IApplicationThread作爲系統進程請求應用進程的接口,代理類爲IApplicationThread.Stub,實體類爲ApplicationThread;
  4. IActivityManager作爲應用進程請求系統進程的接口,接口代理類爲IActivityManager.Stub,實體類爲ActivityManagerService;
  5. 應用進程何時將本地binder代理傳遞給了系統服務進程
    應用進程在ActivityThread創建的時候,會將自己的ApplicationThread綁定到AMS中,應用進程作爲客戶端,通過IActivityManager接口發起了跨進程調用,跨進程傳遞的參數mAppThread就是IApplicationThread的實例,執行流程從應用進程進入到系統進程;
    AMS作爲IActivityManager接口的服務端實現,會響應客戶端的請求,最終AMS.attachApplication()函數會被執行,該函數接收跨進程傳遞過來的IApplicationThread實例,將其綁定到系統進程。AMS中維護了所有進程運行時的信息(ProcessRecord),一旦發生了應用進程的綁定請求,ProcessRecord.thread就被賦值成應用進程的IApplicationThread實例,在AMS中就能通過該實例發起嚮應用進程的調用。

3. 組件生命週期與系統服務的關係

  1. AMS
  • Activity的啓動和Activity的生命週期回調在AMS中完成;
  • Service的啓動調用了AMS的startService和bindService方法;
  • Broadcaset的註冊和接收在AMS中完成;
  • getContentResolver從AMS的getContentProvider獲取到ContentProvider。
  1. PMS
  • 權限校撿checkPermission、checkUidPermission,Apk meta信息獲取getApplicationInfo等,四大組件信息獲取,query系列方法等功能在PMS中完成;
  • 靜態廣播在PMS中完成;

4. Application組件啓動的序列圖(超清點擊可放大)

序列圖

4.1 代理方式更新

Android 26版本以後ActivityManagerNative類被棄用,代理類ActivityManagerProxy、ApplicationThreadProxy被刪除,改用AIDL方式。
ActivityManagerService 繼承IActivityManager.Stub;
ApplicationThread繼承IApplicationThread.Stub;
PackageManagerService 繼承IPackageManager.Stub。

4.2 函數作用

getPackageManager作用:獲得PMS的Binder類型實例,然後得到PMS的代理類。
getPackageInfo作用:參數爲包名、標誌、用戶id,爲PMS的接口方法。
getService作用:獲取AMS的代理類IActivityManager;
attachApplication作用:

  1. 參數爲當前應用進程的binder對象,通過系統AMS本地代理傳遞給系統AMS進程,供系統AMS進程後續通過此binder代理直接調用ApplicationThread類中的函數;
  2. 告知系統AMS服務準備啓動Application。
    attachApplicationLocked作用:
  3. 參數爲當前應用進程的binder對象的pid、callingUid,根據pid獲取存儲在AMS中的對應進程的相關信息;
  4. 通知ActivityThread啓動啓動Application。
    bindApplication作用:從Handler切換到了主線程,最後調用handleBindApplication()。
    handleBindApplication作用:
  5. 創建Instrumentation,負責跟蹤Application還在Activity的生命週期;
  6. 創建Application對象 & 調用其attach();
  7. 調用Instrumentation的onCreate(),內部是空實現;
  8. 調用Instrumentation的callApplicationOnCreate(),內部是調用Application的onCreate()。

4.3 類和函數調用關係

  1. ActivityThread通過PMS服務的本地Binder代理獲取package信息;
  2. ActivityThread中的 attch()函數通過AMS服務的本地Binder代理將當前應用進程的Binder代理對象傳遞給系統AMS服務進程,並通知系統AMS啓動Application組件;
  3. 系統AMS服務訪問PMS相關函數獲取Application組件的信息,系統AMS服務通過IApplicationThread代理調用handleBindApplication函數將Application相關信息傳遞給應用主進程ActivityThread,觸發Application對象創建和生命週期函數

5. 其它

5.1 啓動applicaiton的過程中,可以通過什麼方式進行攔截並能監控applicaiton的生命週期

通過繼承實現Instrumentation並反射修改ActivityThread.mInstrumentation變量,可以監控applicaiton的生命週期。

5.2 application組件對應的context的創建以及與application如何綁定

Context綁定

  1. 應用程序啓動;
  2. 創建Instrumentation對象;
  3. 創建Application對象;
  4. 創建ContextImpl對象;
  5. Application與ContextImpl進行綁定。

6. 另附兩篇Application源碼分析過程中的文章

  1. Android源代碼分析之類方法與組件名詞解釋https://blog.csdn.net/qq_26906345/article/details/103694786。
  2. 部分源代碼詳解
    https://blog.csdn.net/qq_26906345/article/details/103695560。

7. 參考文章

[1]: Android的Handler的簡單理解和使用. https://blog.csdn.net/weixin_43548748/article/details/91128791.
[2]: Android消息處理機制:Handler中sendMessage()方法的幾種重載方法. https://blog.csdn.net/fansl410k/article/details/79425765.
[3]: Android系統服務 —— WMS與AMS. https://www.jianshu.com/p/47eca41428d6.
[4]: Android源碼的Binder權限控制. https://blog.csdn.net/bbmcdull/article/details/52046690.
[5]: Binder進程間通信系統. Android系統源代碼情景分析.
[6]: Android進階(三):Application啓動過程(最詳細&最簡單). https://www.jianshu.com/p/4a8f44b6eecb.
[7]: Application初始化過程,基於android10. https://juejin.im/post/5ddb6b0de51d4523307fca86.
[8]: Android內存優化:DVM和ART原理初探. https://blog.csdn.net/weixin_42336002/article/details/80610555.
[9]: Content Provider組件的實現原理. Android系統源代碼情景分析.
[10]: Android HTTPS、TLS版本支持相關解決方案. https://blog.csdn.net/devrecord/article/details/88580235.
[11]: 不同版本的TLS在Android中的支持情況. https://blog.csdn.net/yanzhenjie1003/article/details/80202476.
[12]: 加密傳輸纔是王道!谷歌在 Android P 上默認啓用 TLS. https://www.oschina.net/news/95202/dns-over-tls-support-in-android-p.
[13]: Android instrumentation原理. https://blog.csdn.net/a19891024/article/details/54342799.
[14]: Instrumentation的理解. https://www.jianshu.com/p/5a7768f22b36.
[15]: Android ABI的淺析. https://www.jianshu.com/p/d2119b3880d8.
[16]: 關於BOOT_COMPLETED廣播-自啓動. https://www.jianshu.com/p/679dc03ee650.
[17]: PackageManagerService原理分析文章合集. https://www.douban.com/note/726553288/.
[18]: PackageManagerService服務框架詳解. https://www.jianshu.com/p/ef058fcfcd30.
[19]: Android 插件化原理解析——Hook機制之AMS&PMS.https://www.jianshu.com/p/8632fdc86009.
[20]: 一篇文章看明白 Android PackageManagerService 工作流程.https://blog.csdn.net/freekiteyu/article/details/82774947.

發佈了37 篇原創文章 · 獲贊 63 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章