1.Activity啟動流程 (7.0版本之前)
從startActivity()開始,最終都會呼叫startActivityForResult()
在該方法里面會呼叫Instrumentation.execStartActivity()執行(Instrumentation主要用來監控應用程式和系統的互動)啟動,execStartActivity()方法里面有2個方法,一個是ActivityManagerNative.getDefault().startActivity()這個方法是執行act啟動的,另外還有一個方法checkStartActivityResult(result, intent),這個方法是用來檢測啟動結果的,
再回到啟動流程上,ActivityManagerNative.getDefault()回傳的是IActivityManager,IActivityManager也是一個介面,他是實作類是一個代理類ActvityManagerProxy(他是AMS的代理,他會獲取到IBinder型別的AMS的參考),他通過IBinder向ActivityManagerService(以下簡稱AMS)發送啟動Act請求,
接著AMS會經過一系列處理,中間會將需要創建的activity的具體資訊初始化,并將其一路傳下去,最后通過app.thread.scheduleLauncherActivity來實作行程切換,啟動activity;
app.thread指的是IApplicationThread,它的實作是ActivityThread的內部類ApplicationThread,其中ApplicationThread繼承了IApplicationThread.Stub,app指的是傳入的要啟動Activity所在的應用程式(就是你自己當前的app行程),因為當前的AMS代碼運行在SystemServer行程中,通過這里切換回來,同時也說明ApplicationThread是應用程式與SystemServer行程溝通的橋梁,
ApplicationThread通過scheduleLauncherActivity()向名為H的hadnler發送型別為LAUNCH_ACTIVITY的訊息(此方法會將啟動act的引數封裝為ActivityClientRecord并傳遞過去),H的handleMessage里最后呼叫performLauncherActivity來完成act的啟動,
先獲取ActivityInfo(用于存盤代碼已以及manifest資訊,比如theme和launchmode),獲取LoadedApk,獲取ComponentName(包含Act的包名類名),啟動act背景關系環境,根據ComponentName獲取類名,用類加載器創建該activity實體,創建application(如果沒有的話),接著初始化act呼叫activity.attach(args...),這個方法會創建window物件,然后會將Decorview添加到window中,同時會創建viewRootImpl,將Decorview和viewRootImpl關聯起來,這個viewRootImpl是完成view繪制的三大流程的(具體的時機是onResume方法第一次執行后,這時候會呼叫WindowManager的addView()方法,這個方法里會創建viewRootImpl物件,隨后將他跟decorview關聯起來,然后呼叫setview(方法),這里面呼叫requestlayout()來執行繪制三個流程),
AMS內部維護者ActivityStack(act堆疊),同時AMS通過ActivityThread同步activity的生命周期,
2. app啟動流程:
①點擊桌面App圖示,Launcher行程采用Binder IPC向system_server行程發起startActivity請求;
②system_server行程接收到請求后判斷,如果不存在目標行程則通過AMS向zygote行程發送創建行程的請求(通過Socket);
③Zygote行程fork出新的子行程,即App行程;
④App行程,通過Binder IPC向sytem_server行程發起attachApplication請求;
⑤system_server行程在收到請求后,進行一系列準備作業后(同上),再通過binder IPC向App行程發送scheduleLaunchActivity請求;
⑥App行程的binder執行緒(ApplicationThread)在收到請求后,通過handler向主執行緒發送LAUNCH_ACTIVITY訊息;
⑦主執行緒在收到Message后,通過反射機制創建目標Activity,并回呼Activity.onCreate()等方法,
⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束后便可以看到App的主界面,
相關知識:
1.zygote
zygote意為“受精卵“,Android是基于Linux系統的,而在Linux中,所有的行程都是由init行程直接或者是間接fork出來的,zygote行程也不例外,
在Android系統里面,zygote是一個行程的名字,Android是基于Linux System的,當你的手機開機的時候,Linux的內核加載完成之后就會啟動一個叫“init“的行程(安卓的第一個行程),在Linux System里面,所有的行程都是由init行程fork出來的,我們的zygote行程也不例外,
我們都知道,每一個App其實都是
● 一個單獨的dalvik虛擬機
● 一個單獨的行程
所以當系統里面的第一個zygote行程運行之后,在這之后再開啟App,就相當于開啟一個新的行程,而為了實作資源共用和更快的啟動速度,Android系統開啟新行程的方式,是通過fork第一個zygote行程實作的,所以說,除了第一個zygote行程,其他應用所在的行程都是zygote的子行程,這下你明白為什么這個行程叫“受精卵”了吧?因為就像是一個受精卵一樣,它能快速的分裂,并且產生遺傳物質一樣的細胞!
2.system_server
SystemServer也是一個行程,而且是由zygote行程fork出來的,
知道了SystemServer的本質,我們對它就不算太陌生了,這個行程是Android Framework里面兩大非常重要的行程之一——另外一個行程就是上面的zygote行程,
為什么說SystemServer非常重要呢?因為系統里面重要的服務都是在這個行程里面開啟的,比如 ActivityManagerService、PackageManagerService、WindowManagerService等等,
3.ActivityManagerService
ActivityManagerService,簡稱AMS,服務端物件,負責系統中所有Activity的生命周期,
ActivityManagerService進行初始化的時機很明確,就是在SystemServer行程開啟的時候,就會初始化ActivityManagerService,
3.APK打包流程:
1.資源檔案打包(布局檔案xml,manifest),生成R.java,
2.AIDL檔案生成對應的java檔案
3.編譯專案原始碼,生成.class檔案
4.將java檔案轉換成dex檔案,將java位元組碼轉化為Dalvik自己餓啊,壓縮常量池
以及清除冗余資訊等,
5.通過該APKBuilder將資源檔案,dex生成apk檔案
6.keystore對apk簽名
7.如果是正式版的apk,還會作對齊處理,就是將所有的資源檔案其實距離4位元組
的整數倍,這樣通過記憶體訪問apk檔案會更快,

4. APK安裝程序
1、復制APK到/data/app目錄下,解壓并掃描安裝包,
2、資源管理器決議APK里的資源檔案,
3、決議AndroidManifest檔案,并在/data/data/目錄下創建對應的應用資料目錄,
4、然后對dex檔案進行優化,并保存在dalvik-cache目錄下,
5、將AndroidManifest檔案決議出的四大組件資訊注冊到PackageManagerService中,
6、安裝完成后,發送廣播,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/45644.html
標籤:Android
上一篇:Frida用法之函式操作
