【SealDEV 傾情奉獻】Android APK 安裝過程詳解

開發 Android 應用後,一般都會安裝到手機上去運行,瞭解應用是如何安裝到手機上的,可以更好的理解應用的本質,理解應用是如何運行的,在自己開發的應用遇到一些問題時,會從更深層次去分析,快速定位找到原因。這一篇文章中我們就來詳細分析一下應用是如何安裝的。

背景知識

要想詳細瞭解 APK 的安裝過程,需要了解一些基礎概念,包括:

  1. 什麼是 APK
  2. 什麼是 DEX 文件和 ODEX 文件
  3. 什麼是 OAT 文件
  4. 什麼是 Dalvik 和 ART

總體來說是:APK 是 Android 應用安裝包,Dalvik 和 ART 都是 Android 運行環境,但是由於 Dalvik 存在一些不足,ART 是在高版本手機上替換 Dalvik 的。應用的安裝過程就是將 APK 中內容解壓處理的過程,Dalvik 會將 APK 中內容 DEX 轉化爲 ODEX,ART 會將其轉化爲 OAT。下面對這些問題分別進行分析。

什麼是 APK

APK,即 Android Package,Android 安裝包。不同平臺的安裝文件格式都不同,類似於 Windows 的安裝包是二進制的 exe 格式,Mac 的安裝包是 dmg 格式。APK 的可以在 Android 上執行安裝,APK 的本質是一個 Zip 壓縮包,只是後綴被修改爲 apk,其中打包了源代碼編譯出的 class.dex、一些圖片視頻資源文件和一些 Native 庫文件。APK 文件與 Zip 文件最大的一個不同是 APK 包含簽名信息,用於保證安裝包安全不被修改。

什麼是 DEX 文件和 ODEX 文件

說起 DEX 文件,不得不提 class 文件。Java 跨平臺是由源代碼編譯出的 class 文件分別運行在不同平臺的虛擬機上,由虛擬機屏蔽了不同平臺的差異。如圖:

Java 跨平臺

但是由於 Android 系統針對手持設備,對 Dalvik 虛擬機進行了優化,主要包括:

  1. 將原來 class 文件進行優化,例如將其中的常量冗餘信息進行合併,提高虛擬機解析效率;
  2. 修改 JVM 運行時基於棧的數據結構修改爲 Dalvik 基於寄存器的數據結構,數據訪問方式更快,運行效率更高。

這種情況下,原來的 .class 文件就有些不適用了,因此,出現了 dex 文件格式,它是源代碼編譯後打包生成的文件。它是 APK 的一個組成部分。

ODEX 文件是 Dalvik 將 DEX 文件中可執行文件——class.dex——文件解壓出來後,存儲在本地後生成的。因爲 Android 系統無法直接運行 APK 文件,需要將其解壓後找到 class.dex 文件後纔可以運行,因此在安裝時就將其取出放在本地,可以提高應用啓動速度。除了這個原因,其實在將 class.dex 轉換成 ODEX 文件過程中,還根據當前系統進行了優化(直接複製到其他系統不一定可以運行),文件大小會減少,ODEX 文件比 DEX 文件更難反編譯,這也在一定程度上提高了安全性,因此在一些系統預裝或系統級應用大多采用了 ODEX 優化。

一般 ODEX 不直接運行,在 Dalvik 運行 ODEX 時,需要通過 JIT 進行優化,提高運行效率。JIT 是一種在運行時同步將字節碼轉化成機器碼的過程,Dalvik 直接運行轉化後的機器碼,這會導致部分的內存和時間開銷,但是整體來說,在某些情況下是會提高系統性能的。(有些動態編譯器,可能根據經驗或嘗試編譯,優化這一過程,可能運行次數越多,優化效果越好)

什麼是 OAT 文件

OAT 文件是 ART 運行的文件,是一種二進制可運行文件,包含 DEX 文件和編譯出的本地機器指令文件,其文件格式類似於網絡數據報文,包含文件頭和文件體,文件頭的 oatdata、oatexec 和 oatlastword 字段分別描述 DEX 文件位置和本地機器指令的起止位置。因爲 OAT 文件包含 DEX 文件,因此比 ODEX 文件佔用空間更大,由於其在安裝時經過了 ART 的處理,ART 加載 OAT 文件後不需要經過處理就可以直接運行,它沒有了從字節碼裝換成機器碼的過程,因此運行速度更快。可以理解爲 JIT 從運行時才解析提前到了安裝時解析,安裝變慢,運行變快。

什麼是 Dalvik 和 ART

上面提到了 Dalvik 和 ART,Dalvik 和 ART 是 Android 平臺實現的 JAVA 虛擬機。用於解析 DEX 文件、ODEX 文件和OAT 文件。

JVM Dalvik and ART

ART 即 Android Runtime,Android 運行時,由於 Android 系統會運行在不同的設備上,底層硬件不同,Linux 系統屏蔽了一些這些系統的細節,但是直接在 Linux 上開發應用太難,實現成本太高,爲了屏蔽 Linux 的細節,Google 創建出了 Dalvik 和 ART,對 Linux 進行了再一次封裝,這樣,使用 Google 提供的集成開發環境 SDK,就可以輕鬆開發應用了,Dalvik 與 ART 的關係是 ART 用來替換 Dalvik 的。Dalvik 在低版本(4.4 以下)的手機上使用作爲 Android 運行環境,但是由於其有一些不足,在高版本的 Android 系統上 ART 用來替換 Dalvik,現在市場上 ART 的佔有率已經超過了 70%。

ART 是 Android 應用的運行模式,在這種模式下,Android 應用在安裝後,會進行一次預編譯,將應用安裝包中的字節碼轉換成機器語言存儲在本地(系統只能運行二進制程序),這樣,應用在運行時,可以直接執行這些二進制程序。相比較於 Dalvik 來說,Dalvik 的做法是在應用安裝後,直接將字節碼存儲起來,在每次運行時,需要將代碼編譯成機器語言,這樣在運行程序時,就比 ART 慢了一些。ART 這樣做導致了安裝後應用所佔的空間更大,安裝時間更長,但是對於經常使用的應用,這樣做是值得的。

APK 是如何安裝的呢?

瞭解了以上的知識,理解應用安裝就簡單了,我們整體看一下應用是如何安裝的。

程序的源代碼,首先經過 SDK 編譯成 DEX 文件,DEX 文件和一些資源文件(圖片、視頻等)、Native Code(C 語言等編譯出的 .so 文件)會直接打包進 APK。安裝 APK 的過程,其實是安裝包解壓過程。資源文件、二進制庫等解壓後直接存儲在本地,DEX 文件不僅僅解壓,會根據系統的運行環境,採用不同的處理方式,被處理成不同格式的文件存儲在本地,等待程序啓動調用,這樣就完成了應用的安裝過程。

The Life of Apk

總結

這一篇文章中,我們詳細介紹了 Android APK 的安裝過程,分析了 Dalvik 和 ART 的不同以及安裝過程的不同。

注:本文部分圖片來自網絡。

知其然,更要知其所以然,SealDEV 傾情出品。

二維碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章