APK (Android Package) 文件,是一個后綴名為.apk的壓縮文件,APK文件中包含了一個Android應用程序的所有內容,是Android平台用於安裝應用程序的文件。
- assets 存放需要打包到 APK 中的靜態文件
- lib 存放應用程序所依賴的 native 庫
- res 存放應用程序的資源文件
- META-INF 存放應用程序的簽名和證書
- AndroidManifest.xml 應用程序配置文件
- classes.dex dex 可執行文件
- resources.arse 資源索引表,記錄資源文件和資源 ID 之間的映射關系
res
是resource的縮寫,存放資源文件,存在這個文件夾下的所有文件都會映射到Android工程的.R文件中,生成對應的ID,訪問的時候直接使用資源ID,即R.id.filename。
res 文件夾下可以包含多個文件夾,其中
aim
存放動畫文件drawable
目錄存放圖像資源layout
目錄存放布局文件values
目錄存放一些特征值,colors.xml
存放color顏色值,dimens.xml
定義尺寸值,string.xml
定義字符串的值,styles.xml
定義樣式對象xml
文件夾存放任意 xml 文件,在運行時可以通過 Resources.getXML() 讀取raw
是可以直接賦值到設備中的任意文件,無需編譯
lib
存放應用程序依賴的native庫文件,一般是用C/C++編寫,這里的lib庫可能包含4中不同類型,根據CPU型號的不同,大體可以分為ARM
,ARM-v7a
,MIPS
,X86
,分別對應着ARM架構,ARM-V7架構,MIPS架構和X86架構。
不同的CPU架構對應着不同的目錄,每個目錄中可以放很多對應版本的so庫,且這個目錄的結構固定,用戶只能按照這個目錄存放自己的so庫。目前市場上使用的移動終端大多是基於ARM或者ARM-V7a架構的,X86和MIPS架構的移動智能終端比較少,所以有些應用程序lib目錄下只包含armeabi目錄或者armeabi-v7a目錄。
META-INF
保存應用的簽名信息,簽名信息可以驗證APK文件的完整性。AndroidSDK在打包APK時會計算APK包中所有文件的完整性,並且把這些完整性保存到META-INF文件夾下,應用程序在安裝的時候首先會根據META-INF文件夾校驗APK的完整性,這樣就可以保證APK中的每一個文件都不能被篡改。以此來確保APK應用程序不被惡意修改或者病毒感染,有利於確保Android應用的完整性和系統的安全性。
META-INF目錄下包含的文件有CERT.RSA
,CERT.DSA
,CERT.SF
和MANIFEST.MF
,其中CERT.RSA是開發者利用私鑰對APK進行簽名的簽名文件,CERT.SF、MANIFEST.MF記錄了文件中文件的SHA-1哈希值。
AndroidManifest.xml
是Android應用程序的配置文件,是一個用來描述Android應用“整體資訊”的設定文件,簡單來說,相當於Android應用向Android系統“自我介紹”的配置文件,Android系統可以根據這個“自我介紹”完整地了解APK應用程序的資訊,每個Android應用程序都必須包含一個AndroidManifest.xml文件,且它的名字是固定的,不能修改。
我們在開發Android應用程序的時候,一般都把代碼中的每一個Activity,Service,Provider和Receiver在AndroidManifest.xml中注冊,只有這樣系統才能啟動對應的組件,另外這個文件還包含一些權限聲明以及使用的SDK版本信息等等。
程序打包時,會把AndroidManifest.xml進行簡單的編譯,便於Android系統識別,編譯之后的格式是AXML格式,如下圖所示:
axml頭:是固定表示 axml 文件的,其值固定是 0x00080003
axml文件長度:標識 axml 文件的大小
StringDataSegment:xml文件中所有字符串類型保存在此。
ResourceIdSegment:xml文件中聲明的資源文件ID保存於此。
XmlContentSegment:是xml的內容段,按照xml文件中的結構依次排開,保存xml的數據內容。
classes.dex
傳統的Java程序,首先先把Java文件編譯成class文件,字節碼都保存在了class文件中,Java虛擬機可以通過解釋執行這些class文件。
而Dalvik虛擬機是在Java虛擬機進行了優化,執行的是Dalvik字節碼,而這些Dalvik字節碼是由Java字節碼轉換而來,一般情況下,Android應用在打包時通過AndroidSDK中的dx工具將Java字節碼轉換為Dalvik字節碼。
dx工具可以對多個class文件進行合並,重組,優化,可以達到減小體積,縮短運行時間的目的。dx工具的轉換過程,如下圖所示:
如上圖所示,dx工具把每個.class文件的每個區域的內容進行去重,重組,優化重排后生成dex文件,生成的dex文件可以在Dalvik虛擬機執行,且速度比較快。
resources.arsc
用來記錄資源文件和資源ID之間的映射關系,用來根據資源ID尋找資源。
Android的開發是分模塊的,res目錄專門用來存放資源文件,當在代碼中需要調用資源文件時,只需要調用findviewbyId()就可以得到資源文件,每當在res文件夾下放一個文件,aapt就會自動生成對應的ID保存在.R文件,我們調用這個ID就可以,但是只有這個ID還不夠,.R文件只是保證編譯程序不報錯,實際上在程序運行時,系統要根據ID去尋找對應的資源路徑,而resources.arsc文件就是用來記錄這些ID和資源文件位置對應關系的文件。
以上內容轉載自https://blog.csdn.net/aha_jasper/article/details/104944929