App 安裝
Android App的安裝可以分為有界面的安裝和無(wú)界面的安裝旅敷。
有界面的安裝其實(shí)就是調(diào)用系統(tǒng)App(PackageInstaller)去安裝apk嚷缭,打開(kāi)安裝apk應(yīng)用之后蛇捌,點(diǎn)擊安裝按鈕執(zhí)行startInstall方法,然后就進(jìn)入安裝中界面開(kāi)始安裝衙伶,安裝成功或者失敗都會(huì)有對(duì)應(yīng)的回調(diào)栋猖。內(nèi)部其實(shí)也是使用PackageManager的installExistingPackage方法,通過(guò)binder機(jī)制像啼,調(diào)用到PackageManagerService的installExistingPackage方法俘闯,最終調(diào)用到installExistingPackageAsUser方法安裝,而安裝的核心原理其實(shí)就是將apk文件拷貝到系統(tǒng)可識(shí)別的重要的文件目錄:
- /data/data/packageName/xxx.apk
- /data/data/packageName/(db,cache等)
- /data/dalvik-cache/(profiles,x86)
無(wú)界面安裝是調(diào)用adb命令忽冻,執(zhí)行到一個(gè)c寫的commandline腳本真朗,調(diào)用install_app
方法,然后再調(diào)用pm_command
僧诚,然后執(zhí)行到pm腳本遮婶,執(zhí)行run
方法,調(diào)用runinstall
湖笨,然后調(diào)用installPackageAsUser
通過(guò)AMS執(zhí)行安裝旗扑。
App應(yīng)用啟動(dòng)流程
說(shuō)到App的啟動(dòng),就需要從開(kāi)機(jī)開(kāi)始說(shuō)起慈省,Android開(kāi)機(jī)會(huì)先把所有應(yīng)用安裝一遍就是把a(bǔ)pk拷貝到對(duì)應(yīng)的目錄(這也是Android開(kāi)機(jī)慢的原因)臀防。
整個(gè)流程如下:
- 激活linux內(nèi)核
- linux內(nèi)核激活引導(dǎo)進(jìn)程
- 引導(dǎo)進(jìn)程經(jīng)過(guò)一系列操作激活init進(jìn)程
- init進(jìn)程創(chuàng)建zygote進(jìn)程
- zygote進(jìn)程孵化SystemService進(jìn)程,SystemService會(huì)先創(chuàng)建好所有系統(tǒng)服務(wù)
- 系統(tǒng)服務(wù)啟動(dòng)完成之后辫呻,SystenService會(huì)激活Launch進(jìn)程
- Launch進(jìn)程就會(huì)先請(qǐng)求PMS清钥,獲取到安裝的所有apk的信息并展示
- 這時(shí)候就可以點(diǎn)擊某個(gè)應(yīng)用來(lái)啟動(dòng)
- 啟動(dòng)就會(huì)調(diào)用startActivity
- 然后使用binder機(jī)制調(diào)用AMS,從應(yīng)用進(jìn)程進(jìn)入系統(tǒng)進(jìn)程
- 如果該Activity的應(yīng)用沒(méi)有被創(chuàng)建放闺,就會(huì)通過(guò)socket通知zygote進(jìn)程孵化一個(gè)新的進(jìn)程作為該應(yīng)用的進(jìn)程
- 然后再通過(guò)socket把新創(chuàng)建的進(jìn)程傳遞給AMS祟昭,這時(shí)候應(yīng)用進(jìn)程存在了,就會(huì)對(duì)該進(jìn)程的權(quán)限校驗(yàn)怖侦,信息的檢查等
- 接著調(diào)用ApplicationThread也是通過(guò)binder機(jī)制調(diào)用到ActivityThread篡悟,從系統(tǒng)進(jìn)程回到應(yīng)用進(jìn)程
- 最終創(chuàng)建出Activity并執(zhí)行其onCreate方法谜叹,啟動(dòng)完成
其實(shí)App的啟動(dòng),除了剛開(kāi)機(jī)是不一樣之外搬葬,正常時(shí)候基本與Activity的啟動(dòng)非常接近荷腊。
總結(jié)
- apk的安裝其實(shí)是文件拷貝的過(guò)程
- 桌面Launcher其實(shí)也是一個(gè)應(yīng)用程序,啟動(dòng)一個(gè)app急凰,大致流程與Activity的啟動(dòng)非常相似女仰,無(wú)非會(huì)多一個(gè)孵化應(yīng)用進(jìn)程的過(guò)程