當你安裝一個APK包時,有沒有思考過此時你的手機做了哪些操作呢?做完這些操作後,一個應用就算在手機上安裝成功,進而這個應用就可以被執行呢?下面我們來一步步的探討下。
當你點選安裝後,首先是APK中的AndroidManifest.xml
被解析,解析的內容會被儲存到/data/system/packages.xml
和/data/system/packages.list
中。我們開啟packages.list和packages.xml,找到Demo應用包名,如下圖
packages.list中指名了該應用預設儲存的位置/data/data/cn.hadcn.example
,packages.xml中包含了該應用申請的許可權、簽名和程式碼所在位置等資訊,並且兩者都有一個userId為10060。之所以每個應用都有一個userId,是因為Android在系統設計上把每個應用當作Linux系統上的一個使用者對待,這樣就可以利用已有的Linux上使用者管理機制來設計Android應用,比如應用目錄,應用許可權,應用程式管理等。
做完以上操作,就相當於應用在系統註冊了,可以被系統識別。接下來就得儲存應用的執行檔案了,根據packages.xml
中指定的codePath
,建立一個目錄,apk會被命名成base.apk
並拷貝到此,其中lib目錄用來存放native庫。如下圖所示
注:目錄是由 包名-1 組成,有時候此處是 -2。這是為了升級使用,升級時會新建立一個-1 或 -2的目錄,如果升級成功,則刪除原目錄並更改packages.xml中codePath到新目錄
此時應用就可以執行了,但如果每次應用執行還得去base.apk中取dex檔案,效率就太低了。為了提升效率,Android系統在應用安裝時還會做些優化操作,把所有可執行的dex檔案單獨提取放在一塊並做些優化。在Dalvik模式下,會使用dexopt把base.apk中的dex檔案優化為odex,儲存在/data/dalvik-cache
中,如果是ART模式,則會使用dex2oat優化成oat檔案也儲存在該目錄下,並且檔名一樣,但檔案大小會大很多,因為ART模式會在安裝時把dex優化為機器碼,所以在ART模式下的應用執行更快,但apk安裝速度相對Dalvik模式下變慢,並且會佔用更多的ROM。
優化後的dex檔案被載入到虛擬機器中就可以執行。
參考
http://stackoverflow.com/questions/12442979/android-understanding-the-apk-installation-process
作者簡介 彭濤(@彭濤me) 致力於讓技術變得易懂且有趣 個人部落格:http://pengtao.me, GitHub地址:https://github.com/CPPAlien