APK安裝過程

當你安裝一個APK包時,有沒有思考過此時你的手機作了哪些操做呢?作完這些操做後,一個應用就算在手機上安裝成功,進而這個應用就能夠被運行呢?下面咱們來一步步的探討下。android

當你點擊安裝後,首先是APK中的AndroidManifest.xml被解析,解析的內容會被存儲到/data/system/packages.xml/data/system/packages.list中。咱們打開packages.list和packages.xml,找到Demo應用包名,以下圖git

packages.list

packages.xml

packages.list中指名了該應用默認存儲的位置/data/data/cn.hadcn.example,packages.xml中包含了該應用申請的權限、簽名和代碼所在位置等信息,而且二者都有一個userId爲10060。之因此每一個應用都有一個userId,是由於Android在系統設計上把每一個應用看成Linux系統上的一個用戶對待,這樣就能夠利用已有的Linux上用戶管理機制來設計Android應用,好比應用目錄,應用權限,應用進程管理等。github

作完以上操做,就至關於應用在系統註冊了,能夠被系統識別。接下來就得保存應用的執行文件了,根據packages.xml中指定的codePath,建立一個目錄,apk會被命名成base.apk並拷貝到此,其中lib目錄用來存放native庫。以下圖所示優化

注:目錄是由 包名-1 組成,有時候此處是 -2。這是爲了升級使用,升級時會新建立一個-1 或 -2的目錄,若是升級成功,則刪除原目錄並更改packages.xml中codePath到新目錄spa

此時應用就能夠運行了,但若是每次應用運行還得去base.apk中取dex文件,效率就過低了。爲了提高效率,Android系統在應用安裝時還會作些優化操做,把全部可運行的dex文件單獨提取放在一塊並作些優化。在Dalvik模式下,會使用dexopt把base.apk中的dex文件優化爲odex,存儲在/data/dalvik-cache中,若是是ART模式,則會使用dex2oat優化成oat文件也存儲在該目錄下,而且文件名同樣,但文件大小會大不少,由於ART模式會在安裝時把dex優化爲機器碼,因此在ART模式下的應用運行更快,但apk安裝速度相對Dalvik模式下變慢,而且會佔用更多的ROM。設計

dalvik-cache

優化後的dex文件被載入到虛擬機中就能夠運行。code

參考cdn

http://stackoverflow.com/questions/12442979/android-understanding-the-apk-installation-processxml

做者簡介 彭濤(@彭濤me) 致力於讓技術變得易懂且有趣 我的博客:http://pengtao.me, GitHub地址:https://github.com/CPPAlienblog

相關文章
相關標籤/搜索