1. 程式人生 > 其它 >Android Framework層——App啟動過程

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開發者。以上內容全都已打包整理好都是免費分享,【點選這裡】即可免費獲取。