Android Activity啟動流程, app啟動流程片挂,APK打包流程幻林, APK安裝過程

1.Activity啟動流程 (7.0版本之前)

從startActivity()開始贞盯,最終都會調(diào)用startActivityForResult()

在該方法里面會調(diào)用Instrumentation.execStartActivity()執(zhí)行(Instrumentation主要用來監(jiān)控應用程序和系統(tǒng)的交互)啟動,execStartActivity()方法里面有2個方法沪饺,一個是ActivityManagerNative.getDefault().startActivity()這個方法是執(zhí)行act啟動的躏敢,另外還有一個方法checkStartActivityResult(result, intent),這個方法是用來檢測啟動結果的整葡。

再回到啟動流程上件余,ActivityManagerNative.getDefault()返回的是IActivityManager,IActivityManager也是一個接口掘宪,他是實現(xiàn)類是一個代理類ActvityManagerProxy(他是AMS的代理蛾扇,他會獲取到IBinder類型的AMS的引用)攘烛,他通過IBinder向ActivityManagerService(以下簡稱AMS)發(fā)送啟動Act請求魏滚,
接著AMS會經(jīng)過一系列處理,中間會將需要創(chuàng)建的activity的具體信息初始化坟漱,并將其一路傳下去鼠次。最后通過app.thread.scheduleLauncherActivity來實現(xiàn)進程切換,啟動activity芋齿;

app.thread指的是IApplicationThread腥寇,它的實現(xiàn)是ActivityThread的內(nèi)部類ApplicationThread,其中ApplicationThread繼承了IApplicationThread.Stub。app指的是傳入的要啟動Activity所在的應用程序(就是你自己當前的app進程)觅捆。因為當前的AMS代碼運行在SystemServer進程中赦役,通過這里切換回來。同時也說明ApplicationThread是應用程序與SystemServer進程溝通的橋梁栅炒。

ApplicationThread通過scheduleLauncherActivity()向名為H的hadnler發(fā)送類型為LAUNCH_ACTIVITY的消息(此方法會將啟動act的參數(shù)封裝為ActivityClientRecord并傳遞過去)掂摔,H的handleMessage里最后調(diào)用performLauncherActivity來完成act的啟動。

先獲取ActivityInfo(用于存儲代碼已以及manifest信息赢赊,比如theme和launchmode)乙漓,獲取LoadedApk,獲取ComponentName(包含Act的包名類名)释移,啟動act上下文環(huán)境叭披,根據(jù)ComponentName獲取類名,用類加載器創(chuàng)建該activity實例玩讳,創(chuàng)建application(如果沒有的話)涩蜘,接著初始化act調(diào)用activity.attach(args...),這個方法會創(chuàng)建window對象熏纯,然后會將Decorview添加到window中同诫,同時會創(chuàng)建viewRootImpl,將Decorview和viewRootImpl關聯(lián)起來豆巨。這個viewRootImpl是完成view繪制的三大流程的(具體的時機是onResume方法第一次執(zhí)行后剩辟,這時候會調(diào)用WindowManager的addView()方法,這個方法里會創(chuàng)建viewRootImpl對象,隨后將他跟decorview關聯(lián)起來贩猎,然后調(diào)用setview(方法)熊户,這里面調(diào)用requestlayout()來執(zhí)行繪制三個流程)。

AMS內(nèi)部維護者ActivityStack(act棧)吭服,同時AMS通過ActivityThread同步activity的生命周期嚷堡。

2. app啟動流程:

①點擊桌面App圖標,Launcher進程采用Binder IPC向system_server進程發(fā)起startActivity請求艇棕;
②system_server進程接收到請求后判斷蝌戒,如果不存在目標進程則通過AMS向zygote進程發(fā)送創(chuàng)建進程的請求(通過Socket);
③Zygote進程fork出新的子進程沼琉,即App進程北苟;
④App進程,通過Binder IPC向sytem_server進程發(fā)起attachApplication請求打瘪;
⑤system_server進程在收到請求后友鼻,進行一系列準備工作后(同上),再通過binder IPC向App進程發(fā)送scheduleLaunchActivity請求闺骚;
⑥App進程的binder線程(ApplicationThread)在收到請求后彩扔,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;
⑦主線程在收到Message后僻爽,通過反射機制創(chuàng)建目標Activity虫碉,并回調(diào)Activity.onCreate()等方法。
⑧到此胸梆,App便正式啟動敦捧,開始進入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法乳绕,UI渲染結束后便可以看到App的主界面绞惦。

相關知識:

1.zygote

zygote意為“受精卵“。Android是基于Linux系統(tǒng)的洋措,而在Linux中济蝉,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外菠发。
在Android系統(tǒng)里面王滤,zygote是一個進程的名字。Android是基于Linux System的滓鸠,當你的手機開機的時候雁乡,Linux的內(nèi)核加載完成之后就會啟動一個叫“init“的進程(安卓的第一個進程)。在Linux System里面糜俗,所有的進程都是由init進程fork出來的踱稍,我們的zygote進程也不例外曲饱。
我們都知道,每一個App其實都是
● 一個單獨的dalvik虛擬機
● 一個單獨的進程
所以當系統(tǒng)里面的第一個zygote進程運行之后珠月,在這之后再開啟App扩淀,就相當于開啟一個新的進程。而為了實現(xiàn)資源共用和更快的啟動速度啤挎,Android系統(tǒng)開啟新進程的方式驻谆,是通過fork第一個zygote進程實現(xiàn)的。所以說庆聘,除了第一個zygote進程胜臊,其他應用所在的進程都是zygote的子進程,這下你明白為什么這個進程叫“受精卵”了吧伙判?因為就像是一個受精卵一樣象对,它能快速的分裂,并且產(chǎn)生遺傳物質一樣的細胞澳腹!

2.system_server

SystemServer也是一個進程织盼,而且是由zygote進程fork出來的。
知道了SystemServer的本質酱塔,我們對它就不算太陌生了,這個進程是Android Framework里面兩大非常重要的進程之一——另外一個進程就是上面的zygote進程危虱。
為什么說SystemServer非常重要呢羊娃?因為系統(tǒng)里面重要的服務都是在這個進程里面開啟的,比如 ActivityManagerService埃跷、PackageManagerService蕊玷、WindowManagerService等等。

3.ActivityManagerService

ActivityManagerService弥雹,簡稱AMS垃帅,服務端對象,負責系統(tǒng)中所有Activity的生命周期剪勿。
ActivityManagerService進行初始化的時機很明確贸诚,就是在SystemServer進程開啟的時候,就會初始化ActivityManagerService厕吉。

3.APK打包流程:

1.資源文件打包(布局文件xml酱固,manifest),生成R.java头朱。
2.AIDL文件生成對應的java文件
3.編譯項目源碼运悲,生成.class文件
4.將java文件轉換成dex文件,將java字節(jié)碼轉化為Dalvik自己餓啊项钮,壓縮常量池
以及清除冗余信息等班眯。
5.通過該APKBuilder將資源文件希停,dex生成apk文件
6.keystore對apk簽名
7.如果是正式版的apk,還會作對齊處理署隘,就是將所有的資源文件其實距離4字節(jié)
的整數(shù)倍脖苏,這樣通過內(nèi)存訪問apk文件會更快。

4. APK安裝過程

1定踱、復制APK到/data/app目錄下棍潘,解壓并掃描安裝包。
2崖媚、資源管理器解析APK里的資源文件亦歉。
3、解析AndroidManifest文件畅哑,并在/data/data/目錄下創(chuàng)建對應的應用數(shù)據(jù)目錄肴楷。
4、然后對dex文件進行優(yōu)化荠呐,并保存在dalvik-cache目錄下赛蔫。
5、將AndroidManifest文件解析出的四大組件信息注冊到PackageManagerService中泥张。
6呵恢、安裝完成后,發(fā)送廣播媚创。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渗钉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钞钙,更是在濱河造成了極大的恐慌鳄橘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芒炼,死亡現(xiàn)場離奇詭異瘫怜,居然都是意外死亡,警方通過查閱死者的電腦和手機本刽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門鲸湃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盅安,你說我怎么就攤上這事唤锉。” “怎么了别瞭?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵窿祥,是天一觀的道長。 經(jīng)常有香客問我蝙寨,道長晒衩,這世上最難降的妖魔是什么嗤瞎? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮听系,結果婚禮上贝奇,老公的妹妹穿的比我還像新娘。我一直安慰自己靠胜,他們只是感情好掉瞳,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浪漠,像睡著了一般陕习。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上址愿,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天该镣,我揣著相機與錄音,去河邊找鬼响谓。 笑死损合,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的娘纷。 我是一名探鬼主播嫁审,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼失驶!你這毒婦竟也來了土居?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嬉探,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棉圈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩堤,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年分瘾,在試婚紗的時候發(fā)現(xiàn)自己被綠了胎围。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡德召,死狀恐怖白魂,靈堂內(nèi)的尸體忽然破棺而出送膳,到底是詐尸還是另有隱情狠鸳,我是刑警寧澤褂萧,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布描融,位于F島的核電站镇匀,受9級特大地震影響,放射性物質發(fā)生泄漏闰非。R本人自食惡果不足惜剩盒,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望台夺。 院中可真熱鬧径玖,春花似錦、人聲如沸颤介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滚朵。三九已至冤灾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間始绍,已是汗流浹背瞳购。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亏推,地道東北人学赛。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吞杭,于是被迫代替她去往敵國和親盏浇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • Zygote是什么芽狗?有什么作用绢掰? Android系統(tǒng)底層基于Linux Kernel, 當Kernel啟動過程會創(chuàng)...
    Mr槑閱讀 2,810評論 4 18
  • 1.應用啟動流程分析: 1.1流程 一個Activity的啟動過程。以Launcher中啟動一個App為例童擎,比如在...
    android之子閱讀 7,552評論 5 29
  • AndroidSmall框架是android中一個非常優(yōu)秀的插件化框架滴劲,有時我們不僅要學會使用它,也要去理解它的原...
    柴犬大人閱讀 1,255評論 0 6
  • 16歲顾复,‘媽媽班挖,我有女朋友了’‘你們太小了,分了吧’ 18歲芯砸,‘媽媽萧芙,我有女朋友了’‘耽誤高考,分了吧’ 20歲假丧,...
    Amarantine丶閱讀 68評論 0 0
  • 天格外藍 漂浮著白云 好像無際的大海 微風拂過 帶來朵朵浪花 綠色和白色 如此和諧 就像五線譜和音符 合奏出 清新...
    南風魚兒閱讀 222評論 0 3