Android Framework層——App啟動過程
1. 關於Android系統的啟動
系統的啟動過程非常複雜,這裡只是簡單的瞭解。 先上谷歌提供的架構分層圖⬇
** 載入程式BootLoader進行初始化Linux核心->啟動init程序->init程序fork出zygote程序(處於c++ framework層)->zygote程序fork出system_server程序(處於java framework層) **
-
system_server程序負責啟動和管理整個java framwork層包含ActivityManagerService、PackageManagerService、WindowManagerService等服務
service的本質是Binder我們可以看ActivityManagerService的實現,是繼承了Binder的子類Stub
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {}
- Zygote程序fork出的APP層的第一個程序是Launch程序,就是使用者看到的桌面
- 所有的app程序都是由zygote程序fork的
2. APP的啟動過程
- 當點選桌面app時,launch程序中的startActvity方法通過binder通訊呼叫system_server程序管理的AMS中的startActivity,而AMS又繼續呼叫ATMS(# ActivityTaskManagerService)的StartActivity方法進行真正的啟動.
- system_server程序收到訊息後向Zygote程序傳送建立程序的請求(通過socket通訊)
- Zygote程序fork出app程序,並執行ActivityThread的main方法
原始碼基於android API 31 public static void main(String[] args) { //安裝sysCall Native與Kernel之間有一層系統呼叫(SysCall)層 AndroidOs.install(); CloseGuard.setEnabled(false); Environment.initForCurrentUser(); //獲取使用者空間的配置檔案 final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId()); TrustedCertificateStore.setDefaultUserDirectory(configDir); //初始化每個程序(MediaServiceManager,TelphoneServiceManager) initializeMainlineModules(); //初始化主執行緒looper Looper.prepareMainLooper(); long startSeq = 0; if (args != null) { for (int i = args.length - 1; i >= 0; --i) { if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) { startSeq = Long.parseLong( args[i].substring(PROC_START_SEQ_IDENT.length())); } } } //真正的主角 ActivityThread thread = new ActivityThread(); thread.attach(false, startSeq); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
- 從main方法中可以看到建立ActivityThread之後呼叫了thread.attach(false, startSeq)方法,並同時初始化ApplicationThread用於和AMS通訊
- App程序,通過Binder向sytem_server程序發起attachApplication請求,這裡實際上就是APP程序通過Binder呼叫sytem_server程序中AMS的attachApplication方法,AMS的attachApplication方法的作用是將ApplicationThread物件與AMS繫結
- system_server程序在收到attachApplication的請求,進行一些準備工作後,再通過binder IPC向App程序傳送handleBindApplication請求(初始化Application並呼叫onCreate方法)和scheduleLaunchActivity請求(建立啟動Activity)
- App程序的binder執行緒(ApplicationThread)在收到請求後,通過handler向主執行緒傳送BIND_APPLICATION和LAUNCH_ACTIVITY訊息,這裡注意的是AMS和主執行緒並不直接通訊,而是AMS和主執行緒的內部類ApplicationThread通過Binder通訊,ApplicationThread再和主執行緒通過Handler訊息互動。
- 主執行緒在收到Message後,建立Application並呼叫onCreate方法,再通過反射機制建立目標Activity,並回調Activity.onCreate()等方法
- 到此,App便正式啟動,開始進入Activity生命週期,執行完onCreate/onStart/onResume方法,UI渲染後顯示APP主介面
資料分享
這裡給大家分享一份騰訊總監整理的這份《Android Framework開發揭祕》總共將近20萬字,通過經典Binder、Handler、AMS等面試題解析加深你對Android Framework框架層的理解,今天在這裡拿出來分享給大家。
這份《Android Framework開發揭祕》【
100%免費獲取
】,需要的朋友可以【點選這裡】即可免費獲取。
《Android Framework 開發揭祕》
第一章 系統啟動流程分析
- 第一節 Android啟動概覽
- 第二節 init.rc解析
- 第三節 Zygote
- 第四節 面試題
第二章 Binder解析
- 第一節 巨集觀認識Binder
- 第二節binder的jni方法註冊
- 第三節binder驅動
- 第四節 資料結構
- 第五節 啟動service_manager
- 第六節獲取service_manager
- 第七節 addService流程
- 第八節 Binder面試題全解析
第三章 Handler解析
- 第一節 原始碼分析
- 第二節 難點問題
- 第三節Handler常問面試題
第四章 AMS 解析
- 第一節 引言
- 第二節 Android架構
- 第三節 通訊方式
- 第四節 系統啟動系列
- 第五節 AMS
- 第六節 AMS 面試題解析
第五章 WMS解析
- 第一節Activity與Window相關概念
- 第二節 Android視窗管理服務WindowManagerService計算Activity視窗大小的過程分析
- 第三節Android視窗管理服務WindowManagerService對視窗的組織方式分析
- 第四節 Android視窗管理服務WindowManagerService對輸入法視窗的管理分析
- 第五節 Android視窗管理服務WindowManagerService對桌布視窗的管理分析…
第六章PKMS Android10.0 原始碼解讀
- 第一節 前言 PKMS 是什麼東西?
- 第二節 PKMS 概述資訊
- 第三節 PKMS角色位置
- 第四節 PKMS 啟動過程分析
- 第五節 APK的掃描
- 第七節 PMS之許可權掃描
- 第八節 PackageManagerService大綜合筆記
《Android Framework 精編核心解析》
這份《Android Framework 精編核心解析》內容涵蓋:深入解析 Binde、深入解析 Handler 訊息機制、Dalvik VM 程序系統、深入解析 WMS、PackageMS 啟動五個章節,一共455頁。
第一章 深入解析Binder
- Binder系列—開篇
- Binder Driver初探
- Binder Driver再探
- Binder 啟動 ServiceManager
- 獲取 ServiceManager
- 註冊服務 (addService)
- 獲取服務 (getService)
- framework 層分析
- 如何使用 Binder
- 如何使用 AIDL
- Binder 總結
- Binder 面試題全解析
第二章深入解析Handler訊息機制
- 巨集觀理論分析與Message原始碼分析
- MessageQueue的原始碼分析
- Looper的原始碼分析
- handler的原始碼分析
- Handler機制實現原理總結
- Handler面試題全解析
第三章Dalvik VM程序系統
- Android系統啟動-綜述
- Init篇
- zygote篇
- SystemServer上篇
- SystemServer下篇
第四章深入解析WMS
- WMS概述
- WMS的誕生
第五章PackageMS啟動
- PackageMS相關框架類
- PackageMS啟動過程
最後
相信這兩份資料,一定可以為大家在Framework的學習上提供強有力的幫助和支撐,快人一步成為真正的高階Android開發者。以上內容全都已打包整理好都是免費分享,【點選這裡】即可免費獲取。