Android-APK安裝實質

dex

  • 關于dex先說幾點,我們知道java生成的是class文件,jvm也是基于棧的虛擬機,而Dalvik和ART都是基于寄存器的虛擬機,所以在build的時候,不僅僅是簡單合并和去除重復,還要轉變指令和數據結構

apk

  • apk實質上就是一個zip文件,只是改了后綴名而已,apk里面放著dex文件、native代碼文件(.so)、資源文件、Manifest.xml

apk的安裝過程

  • 當通過SD卡上的APK安裝時,會先把apk復制到/data/app下,然后執行下面的操作
  • 安裝過程其實就是一個解壓過程,對于Dalvik和ART兩種虛擬機對dex文件有不同的優化處理,這個過程叫做optdex,生成的優化后的文件就會放在/data/dalvik-cache下面,同時optdex過程還會驗證字節碼,同時向Android系統中注冊這個app,即Android會解析Android Manifest并向它自己的package.xml寫入對應的注冊信息
  • 對于Dalvik,會把dex從apk文件內提取出來放到某個文件夾下,這樣每次啟動的時候就減少了一個從apk提取dex文件的動作
  • 對于ART(6.0),不會生成odex文件,取而代之的是oat文件,我們知道ART(6.0)在安裝的時候會花費更多的時間,這個時間是干嘛用的呢?其實就是用來從apk里面提取出來dex之后,把dex轉化成機器碼,這樣得以讓設備直接執行,也就是說不再執行字節碼了
    • 那是不是意味著ART就沒用了?都可以直接執行機器嗎了,還用啥虛擬機?
    • 其實ART主要的作用就是用來創建對象和GC,就相當于ART充當了操作系統進程里堆的管理者,實現了一種垃圾收集機制和堆內存管理機制(包括分配內存、整理內存碎片)
  • 對于ART(7.0),不會把dex直接變成oat文件了,即不采用AOT的方法,也不是單純的JIT,而是說把OAT和JIT結合起來,當執行了JIT后,會把它產生的機器碼保存下來,這樣既保證了安裝速度,又讓app越用越快
  • aot文件里面不僅僅包含可執行文件,還包含了原來的dex文件和資源文件等文件,所以占用的空間更大,aot同樣也是放在某個緩存文件夾下面的,在啟動某一個Android進程時都是去相應的文件夾下去load對應的odex / oat文件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容