1. 程式人生 > >Android APK安裝過程學習筆記

Android APK安裝過程學習筆記

屏蔽 組成 學習 二進制 替換 壓縮包 基於 壓縮 方式

1.什麽是APK

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

2.什麽是DEX文件和ODEX文件

  Java卡平臺是由源代碼編譯出的class文件分別運行在不同平臺的虛擬機上,由虛擬機屏蔽了不同平臺的差異。但是由於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直接運行轉化後的機器碼,這會導致部分的內存和時間開銷,但是整體來說,在某些情況下是會提高系統性能的。(有些動態編譯器,可能根據經驗或嘗試編譯,優化這一過程,可能運行次數越多,優化效果越好)。

3.什麽是OAT文件

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

4.什麽是Dalvik和ART

  Dalvik和ART都是Android運行環境,但是由於Dalvik存在一些不足,ART是在高版本手機上替換Dalvik的。Dalvik和ART是Android平臺實現的JAVA虛擬機。用於解析DEX文件、ODEX文件和OAT文件。ART即Android Runtime,Android運行時,由於Android系統運行在不同的設備上,底層硬件不同,Linux系統屏蔽了一些這些系統的細節,但是直接在Linux上開發應用太難,實現成本太高,為了屏蔽Linux的細節,Google創建出了Dalvik和ART,對Linux進行了再一次封裝,這樣,
使用Google提供的集成開發環境SDK,就可以輕松開發應用了,Dalvik與ART的關系是ART用來替換Dalvik,現在市場上ART的占用率已經超過了70%。ART是Android應用的運行模式,在這種模式下,Android應用在安裝後,會進行一次預編譯,將應用安裝包中的字節碼轉換成機器語言存儲在本地(系統只能運行二進制程序),這樣,應用在運行時,可以直接執行這些二進制程序。相比較於Dalvik來說,Dalvik的做法是在應用安裝後,直接將字節碼存儲起來,在每次運行時,需要將代碼編譯成機器語言,這樣在運行程序時,就比ART慢了一些。ART這樣做導致了安裝後應用所占的空間更大,安裝時間更長,但是對於經常使用的應用,這樣做是值得的。

5.APK是如何安裝的?

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

總結:APK是Android安裝包,Dalvik和ART都是Android運行環境,ART是在高版本手機上替換Dalvik的。dex文件是源代碼編譯後打包生成的文件,是APK的一個組成部分,安裝時Dalvik將dex文件中可執行文件class.dex解壓存儲在本地的文件就是ODEX文件。ART運行生成的文件是OAT。

Dalvik與ART比較
(1)Dalvik和ART是Android平臺實現的JAVA虛擬機。用於解析DEX文件、ODEX文件和OAT文件。
(2)ART解析模式是Android應用在安裝後,會進行一次預編譯,將應用安裝包中的字節碼轉換成機器語言存儲在本地。
(3)Dalvik解析模式是在應用安裝後,直接將字節碼存儲起來,每次運行時,需要將代碼編譯成機器語言。
(4)運行程序時,Dalvik比ART慢,ART安裝後應用所占的空間更大,安裝時間長。


ODEX文件與OAT文件比較:
(1)Dalvik將APK中的內容轉化成ODEX,ART將其轉化成OAT。
(2)ODEX需要通過JIT進行優化,提高運行效率。
(3)OAT包含DEX文件和編譯出的本地機器指令文件,比ODEX文件占用空間大,不需要經過處理就可以直接運行,運行速度快。


學習文章:http://mp.weixin.qq.com/s/37wjSQs1HWVfX0xL27NjBg

Android APK安裝過程學習筆記