標籤:source http hive 支援 訪問 values 參考 使用者 不一致
參考這個部落格
http://www.cnblogs.com/wangtianxj/archive/2010/06/13/1757639.html
APK檔案結構:
AndroidManifest.xml 配置清單
META-INF 簽名
assets 資源
classes.dex java經過源碼編譯後產生的java位元組碼檔案
res 資產庫
lib native 動態庫 so
smali classes.dex
resources.arsc 記錄這些ID和資源檔位置對應關係的檔案
apktool.yml 重新打包必須檔案
META-INF目錄:存放的是簽名資訊,用來保證apk包的完整性和系統的安全。
在編譯產生一個api包時,會對所有要打包的檔案做一個校正計算,並把計算結果放在META-INF目錄下。在安裝時,如果校正結果與META-INF下的內容不一致,系統就不會安裝這個apk。保證了apk包裡的檔案不能被隨意替換。
META-INF目錄下包含的檔案有CERT.RSA,CERT.DSA,CERT.SF和MANIFEST.MF。
CERT.RSA |
是開發人員利用私密金鑰對APK進行簽名的簽名檔案 |
CERT.SF,MANIFEST.MF |
記錄了檔案中檔案的SHA-1雜湊值 |
assets目錄:用於存放需要打包到APK中的靜態檔案
assets目錄支援任意深度的子目錄,使用者可以根據自己的需求任意部署檔案夾架構。
而且res目錄下的檔案會在.R檔案中產生對應的資源ID,assets不會自動產生對應的ID,訪問的時候需要AssetManager類。
lib目錄:這裡存放應用程式依賴的native庫檔案,一般是用C/C++編寫,這裡的lib庫可能包含4中不同類型,根據CPU型號的不同,大體可以分為ARM架構,ARM-V7a架構,MIPS架構和X86架構。
不同的CPU架構對應著不同的目錄,目前市場上使用的移動終端大多是基於ARM或者ARM-V7a架構的,X86和MIPS架構的移動智能終端比較少,這四個目錄要根據CPU的架構來選,而市面上ARM架構的手機佔大多數,所以一般的APK只包含ARM和ARM-V7a的so。
res目錄:res是resource的縮寫,這個目錄存放資源檔,存在這個檔案夾下的所有檔案都會映射到Android工程的.R檔案中,產生對應的ID,訪問的時候直接使用資源ID即R.id.filename,res檔案夾下可以包含多個檔案夾。
檔案名稱 |
儲存內容 |
anim |
存放動畫檔案; |
drawable |
目錄存放映像資源; |
layout |
目錄存放布局檔案; |
values |
目錄存放一些特徵值; |
colors.xml |
存放color顏色值; |
dimens.xml |
定義尺寸值; |
string.xml |
定義字串的值; |
styles.xml |
定義樣式對象; |
xml |
檔案夾存放任意xml檔案,在運行時可以通過Resources.getXML()讀取; |
raw |
是可以直接複製到裝置中的任意檔案,他們無需編譯。 |
AndroidManifest.xml:是Android應用程式的設定檔,是一個用來描述Android應用“整體資訊”的設定檔案, Android系統可以根據這個“自我介紹”完整地瞭解APK應用程式的資訊,每個Android應用程式都必須包含一個AndroidManifest.xml檔案,且它的名字是固定的,不能修改。我們在開發Android應用程式的時候,一般都把代碼中的每一個Activity,Service,Provider和Receiver在AndroidManifest.xml中註冊,只有這樣系統才能啟動對應的組件,另外這個檔案還包含一些許可權聲明以及使用的SDK版本資訊等等。程式打包時,會把AndroidManifest.xml進行簡單的編譯,便於Android系統識別,編譯之後的格式是AXML格式,如1所示:
圖1 AXML格式
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工具的轉換過程2所示:
圖2 dx工具把.class檔案轉換成dex檔案
dx工具把每個.class檔案的每個地區的內容進行去重,重組,最佳化重排後產生dex檔案,產生的dex檔案可以在Dalvik虛擬機器執行,且速度比較快。
resources.arsc:用來記錄資源檔和資源ID之間的映射關係,用來根據資源ID尋找資源。Android的開發是分模組的,res目錄專門用來存放資源檔,當在代碼中需要調用資源檔時,只需要調用findviewbyId()就可以得到資源檔,每當在res檔案夾下放一個檔案,aapt就會自動產生對應的ID儲存在.R檔案,我們調用這個ID就可以,但是只有這個ID還不夠,.R檔案只是保證編譯器不報錯,實際上在程式運行時,系統要根據ID去尋找對應的資源路徑,而resources.arsc檔案就是用來記錄這些ID和資源檔位置對應關係的檔案。
Android逆向基礎----APK檔案結構