Android Activity啟動流程, app啟動流程,APK打包流程, APK安裝過程

来源:https://www.cnblogs.com/ganchuanpu/archive/2019/12/11/12021191.html
-Advertisement-
Play Games

1.Activity啟動流程 (7.0版本之前) 從startActivity()開始,最終都會調用startActivityForResult() 在該方法裡面會調用Instrumentation.execStartActivity()執行(Instrumentation主要用來監控應用程式和系統 ...


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、安裝完成後,發送廣播。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 解析:在mysql 工具 搜索或者插入數據時報下麵錯誤: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database_tl ...
  • 2019-12-11對varchar類型排序問題的解決 在mysql預設order by 只對數字與日期類型可以排序,但對於varchar字元型類型排序好像沒有用了,下麵我來給各位同學介紹varchar類型排序問題如何解決。 現象描述: select * from resultgroup where ...
  • #內連接select * from auth_user u inner join auth_group g on u.id = g.id; #左連接select * from auth_user a left join auth_group b on a.id = b.id; #右連接select ...
  • 問題描述:做scn恢復備庫的測試,吭哧了幾天,今天終於可以記錄一下,遇到了很多坑,作為初學者可以更好地理解DG,主要先關閉備庫,在主庫做歸檔丟失備庫無法同步,備庫產生GAP,然後增量備份恢復備庫,版本:SQL*Plus: Release 11.2.0.4.0 Production on Thu No ...
  • SELECT B.NAME,A.ROW_COUNT FROM SYS.DM_DB_PARTITION_STATS A,SYS.OBJECTS BWHERE A.OBJECT_ID=B.OBJECT_ID AND A.INDEX_ID<=1AND B.TYPE='U'AND A.ROW_COUNT>8 ...
  • 基礎數據所對應的類型不同 在Oracle中有一些基礎類型與Sqlserver中名字一樣,但是所存儲的數據格式不同,Date類型在Oracle中精確到秒,在Sqlserver中只能精確到分 表的結構 Oracle中所有的表都有一個共同的欄位,rowid這是在物理上存在的,記錄了每一條記錄的行位置,ro ...
  • 一、Word、Excel、PPT 展示 1. 微軟Office公開Api介面 如果文檔內容不是很機密或者只是需要實現預覽文檔的話,可以考慮使用微軟的公共Api介面實現。 微軟Office公開Api地址為:https://view.officeapps.live.com/op/view.aspx? 在 ...
  • 混淆導致的數據綁定庫錯誤 問題摘要 AbstractMethodError: abstract method "androidx.databinding.ViewDataBinding androidx.databinding.DataBinderMapper.getDataBinder(andro ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...