文章寫于以前,部分內容參考沒有記住來源,如有侵權聯系洗掉或注明出處,
大部分流程這篇文章有講點擊傳送

service_manager 行程
Binder IPC 通信程序中的守護行程 ServiceManager 行程主要是啟動 Binder,提供服務的查詢和注冊,
**surface_flinger 行程 ** SurfaceFlinger 負責影像繪制,其功能是合成所有 Surface 并渲染到顯示設備,
media_server 行程 MediaServer 行程主要是啟動 AudioFlinger 音頻服務
Zygote 行程
Zygote 行程范訓了所有的 Android 應用行程 Framework 框架初始化啟動的開始,
Zygote 服務行程的主要功能:
- 注冊底層功能的 JNI 函式到虛擬機
- 預加載 Java 類和資源
- fork 并啟動 system_server 核心行程
- 作為守護行程監聽處理“范訓新行程”的請求
系統服務在 ServiceManager 中已經注冊
應用安裝
應用安裝的時候,通過 PackageManagerService 決議 apk 的 AndroidManifest.xml 檔案,提取出這個 apk 的資訊寫入到 packages.xml 檔案中,這些資訊包括:權限、應用包名、icon、apk 的安裝位置、版本、userID 等等,packages.xml 檔案位于系統目錄下/data/system/packages.xml,
Lanucher點擊啟動流程

流程
launcher onclick -> START_ACTIVITY_TRANSACTION ->AMS->startActivity->fork行程->
加載ActivityThread.main() ->AT.attach ->ATTACH_APPLICATION_TRANSACTION->AMS(attachApplication)
系結創建成功
AMS->BIND_APPLICATION_TRANSACTION ->app行程->ActivityThread.bindApplication()->sendMessage->ActivityThread.handleMeaasge-> AplicationThread.handleBindApplication
AMS-> SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令->ApplicationThread.scheduleLaunchActivity()->sendMessage->ActivityThread.handleLaunchActivity()->ActivityThread.performLaunchActivity() ->Activity.performCreate() -> onCreate()->Activity.setContentView()->ActivityThread.performResumeActivity()
fork行程
launcher onclick startActivity
在 system_server 行程中的服務端 ActivityManagerService 收到 START_ACTIVITY_TRANSACTION 命令后進行處理,呼叫 startActivity() 方法,
如果應用沒有啟動過,則會 fork 一個新行程,創建新行程的時候,AMS保存一個 ProcessRecord 資訊
應用程式uid + process (默認使用 package 的名稱,Manifest.xml可指定)
如果已經存在就不會新建行程了,這就屬于應用內打開 Activity 的程序了,
行程創建成功切換至 App 行程,進入 app 行程后將 ActivityThread 類加載到新行程,并呼叫 ActivityThread.main() 方法
此時只創建了應用程式的 ActivityThread 和 ApplicationThread,和開啟了 Handler 訊息回圈機制
ActivityThread.attach(false) 又會最終到 ActivityMangerService 的 attachApplication,這個工程其實是將本地的 ApplicationThread(Binder) 傳遞到 ActivityMangerService,然后 ActivityMangerService 就可以通過 ApplicationThread 的代理 ApplicationThreadProxy 來呼叫應用程式 ApplicationThread.bindApplication,通知應用程式的 ApplicationThread 已和 ActivityMangerService 系結,可以不借助其他行程幫助Binder直接通信了,此時 Launcher 的任務也算是完成了,
在 system_server 行程中的服務端 ActivityManagerService 收到 ATTACH_APPLICATION_TRANSACTION 命令后進行處理,呼叫 attachApplication(),
發送送完 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,還會發送 BIND_APPLICATION_TRANSACTION 命令來創建 Application,
app行程初始化
在 app 行程中,收到 BIND_APPLICATION_TRANSACTION 命令后呼叫 ActivityThread.bindApplication(),
ActivityThread.bindApplication()
//快取 Service,初始化 AppBindData,發送訊息 H.BIND_APPLICATION,
ApplicationThreadProxy.bindApplication(…) 會傳來這個應用的一些資訊,如ApplicationInfo,Configuration 等**,在 ApplicationThread.bindApplication 里會待資訊封裝成A ppBindData**,通過
sendMessage(H.BIND_APPLICATION, data)
將資訊放到應用里的訊息佇列里,通過 Handler 訊息機制,**在 ActivityThread.handleMeaasge 里處理 H.BIND_APPLICATION 的資訊,呼叫 AplicationThread.handleBindApplication,**進而創建application,
Activity
上面 fork 行程時會發送 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,在 app 行程中,收到 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令后呼叫 ApplicationThread.scheduleLaunchActivity(),
ApplicationThread.scheduleLaunchActivity()
//發送訊息 H.LAUNCH_ACTIVITY,
sendMessage(H.LAUNCH_ACTIVITY, r);
ActivityThread.handleLaunchActivity()
//最侄訓呼目標 Activity 的 onConfigurationChanged(),初始化 WindowManagerService,
//呼叫 ActivityThread.performLaunchActivity()
ActivityThread.performLaunchActivity() {
//類似 Application 的創建程序,通過 classLoader 加載到 activity.
activity = mInstrumentation.newActivity(classLoader,
component.getClassName(), r.intent);
//因為 Activity 有界面,所以其 Context 是 ContextThemeWrapper 型別,但實作類仍是ContextImpl.
Context appContext = createBaseContextForActivity(r, activity);
activity.attach(context,mInstrumentation,application,...);
//與 Window 進行關聯
//attach 后呼叫 activity 的 onCreate()方法,
mInstrumentation.callActivityOnCreate(activity,...)
}
//在ActivityThread.handleLaunchActivity里,接著呼叫
Activity.performCreate() -> onCreate()
//最侄訓呼目標 Activity 的 onCreate(),
Activity.setContentView()
//設定 layout 布局
ActivityThread.performResumeActivity()
//最侄訓呼目標 Activity 的 onResume(),
- ActivityThread 是什么,它是一個執行緒嗎,如何被啟動的?
它不是一個執行緒,它是運行在 App 行程中的主執行緒中的一個方法中,(ActivityThread類是Android APP行程的初始類,它的main函式是這個APP行程的入口)
ActivityThread 并呼叫 ActivityThread.attach() 方法告訴 ActivityManagerService.創建了一個應用 并將 ApplicationThread 傳給 ActivityManagerService
ApplicationThread是ActivityThread的內部類,也是一個Binder物件,在此處它是作為Activitythread和AMS通信的橋梁.
- ActivityClientRecord 與 ActivityRecord 是什么?
記錄 Activity 相關資訊,比如:Window,configuration,ActivityInfo 等,
ActivityClientRecord 是客戶端的,ActivityRecord 是 ActivityManagerService 服務端的,
- Context 是什么,ContextImpl,ContextWapper 是什么?
Context 定義了 App 行程的相關環境,Context 是一個介面,ContextImpl 是子類,ContextWapper 是具體實作,
應用資源是在 Application 初始化的時候,也就是創建 Application,ContextImpl 的時候,ContextImpl 就包含這個路徑,主要就是對就是 ResourcesManager 這個單例的參考,
可以看出每次創建 Application 和 Acitvity 以及 Service 時就會有一個 ContextImpl 實體,ContentProvider 和B roadcastReceiver 的 Context 是其他地方傳入的,
所以 Context 數量 = Application 數量 + Activity 數量 + Service 數量,單行程情況下 Application 數量就是 1,
- Instrumentation 是什么?
管理著組件Application,Activity,Service等的創建,生命周期呼叫,
- Application 是什么,什么時候創建的,每個應用程式有幾個 Application?
Application 是在 ActivityThread**.handleBindApplication()** 中創建的,一個行程只會創建一個 Application,但是一個應用如果有多個行程就會創建多個 Application 物件,
- 點擊 Launcher 啟動 Activity 和應用內部啟動 Activity 的區別?
點擊 Launcher 時會創建一個新行程來開啟 Activity,而應用內打開 Activity,如果 Activity 不指定新行程,將在原來行程打開
- Activity 啟動程序,onCreate(),onResume() 回呼時機及具體作用?
Activity.onCreate() 完成了 App 行程,Application,Activity 的創建,呼叫 setContentView() 給 Activity 設定了 layout 布局,是否開啟新行程實在 ActivityManagerService 進行控制的 應用包名 + 應用UID
Activity.onResume() 完成了 Activity 中 Window 與 WindowManager 的關聯,并對所有子 View 進行渲染并顯示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/279282.html
標籤:其他
上一篇:QGraphicsScene 圖元移除后有概率不重繪的問題(多邊形)
下一篇:安卓APP_ Fragment(5)—— Fragment + ViewPager2 模擬微信首頁 (2)兩者聯動實作翻頁
