APK 文件結構


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型號的不同,大體可以分為ARMARM-v7aMIPSX86,分別對應着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.RSACERT.DSACERT.SFMANIFEST.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM