1. 程式人生 > >APK 檔案分析

APK 檔案分析

概述

我們通過 Android studio APK Analyze 可以展開一個APK檔案

  • META-INF
  • res
    • anim
    • color
    • drawable
    • drawable-hdpi
    • drawable-land
    • drawable-land-hdpi
    • drawable-mdpi
    • drawable-port
    • drawable-port-hdpi
    • layout
    • layout-land
    • layout-port
    • xml
  • AndroidManifest.xml
  • classes.dex
  • resources.arsc

META-INF

META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全。裡面包含了三個檔案,MANIFEST.MF、CERT.SF、CERT.RSA。

  • MANIFEST.MF

apk中的這個MANIFEST.MF,列出了apk的所有檔案,以及這些檔案內容所對應的base64-encoded SHA1 雜湊值,

Name: classes.dex
SHA1-Digest: l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=
複製程式碼

上述表示classes.dex這個檔案的SHA1的雜湊值為l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=

  • CERT.SF

CERT.SF和MANIFEST.MF很相似,但是它描述的不是檔案內容的hash值,而是列出了MANIFEST.MF這個檔案中每條資訊的hash值,舉例會明白些:

Name: classes.dex
SHA1-Digest: ubmMiUS24rU/6K5JloMVG4vHKIU=
複製程式碼

上面這條hash值ubmMiUS24rU/6K5JloMVG4vHKIU=對應的是MANIFEST.MF中下面這幾行字串的hash值

Name: classes.dex
SHA1-Digest: l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=
複製程式碼

注:計算SHA1-Digest-Manifest時,輸入的字串是三行,還要包括一行空白行,即’\r\n’。!

  • CERT.RSA

包含了公鑰和私鑰簽名後的一些資訊 它的基本格式是這樣的:

res目錄

res目錄存放資原始檔

目錄 資源型別
animator/ 用於定義屬性動畫的 XML 檔案。
anim/ 定義漸變動畫的 XML 檔案。(屬性動畫也可以儲存在此目錄中,但是為了區分這兩種型別,屬性動畫首選 animator/ 目錄。)
color/ 用於定義顏色狀態列表的 XML 檔案。請參閱顏色狀態列表資源
drawable/ 點陣圖檔案(.png.9.png.jpg.gif)或編譯為以下可繪製物件資源子型別的 XML 檔案:點陣圖檔案九宮格(可調整大小的點陣圖)狀態列表形狀動畫可繪製物件其他可繪製物件請參閱 可繪製物件資源
mipmap/ 適用於不同啟動器圖示密度的可繪製物件檔案。如需瞭解有關使用 mipmap/ 資料夾管理啟動器圖示的詳細資訊,請參閱管理專案概覽
layout/ 用於定義使用者介面佈局的 XML 檔案。 請參閱佈局資源
menu/ 用於定義應用選單(如選項選單、上下文選單或子選單)的 XML 檔案。請參閱選單資源
raw/ 要以原始形式儲存的任意檔案。要使用原始 InputStream 開啟這些資源,請使用資源 ID(即 R.raw.*filename*)呼叫 Resources.openRawResource()。但是,如需訪問原始檔名和檔案層次結構,則可以考慮將某些資源儲存在 assets/ 目錄下(而不是 res/raw/)。assets/ 中的檔案沒有資源 ID,因此您只能使用 AssetManager 讀取這些檔案。
values/ 包含字串、整型數和顏色等簡單值的 XML 檔案。其他 res/ 子目錄中的 XML 資原始檔是根據 XML 檔名定義單個資源,而 values/ 目錄中的檔案可描述多個資源。對於此目錄中的檔案,<resources> 元素的每個子元素均定義一個資源。例如,<string> 元素建立 R.string 資源,<color> 元素建立 R.color 資源。由於每個資源均用其自己的 XML 元素定義,因此您可以根據自己的需要命名檔案,並將不同的資源型別放在一個檔案中。但是,為了清晰起見,您可能需要將獨特的資源型別放在不同的檔案中。 例如,對於可在此目錄中建立的資源,下面給出了相應的檔名約定:arrays.xml,用於資源陣列(型別化陣列)。colors.xml:顏色值。dimens.xml:尺寸值。strings.xml:字串值。styles.xml:樣式。請參閱字串資源樣式資源更多資源型別
xml/ 可以在執行時通過呼叫 Resources.getXML() 讀取的任意 XML 檔案。各種 XML 配置檔案(如可搜尋配置)都必須儲存在此處。

resources.arsc

編譯後的二進位制資原始檔,主要作用是App的資源索引表,可以從二進位制的檔案中查詢到資源的相關資訊,或者根據資源的id可以定位到二進位制檔案中的位置

classes.dex檔案

簡單來說就是android系統的可執行檔案,類似於window系統的xx.exe,它包含應用程式的全部操作指令以及執行時資料

題外:ART 和 Dalvik

我們知道Java程式都是通過Java虛擬機器執行的,Android應用是採用Java開發的,基於移動裝置的特點,如記憶體以及電量等諸多方面跟一般的 PC 裝置都有本質的區別,所以需要開發更符合移動裝置的用於執行 Java 程式碼的虛擬機器,也就是Dalvik和 ART。 Dalvik和 ART 並不是完全按照JVM的規範開發的,一般JVM虛擬機器執行的是 .class 檔案,而 Dalvik和 ART 執行的是DEX檔案。

Java 虛擬機器執行 .class 格式的位元組碼。每一個 Java 檔案對應一個 .class 的位元組碼檔案,JVM 在執行時為每一個執行到的類裝載位元組碼。而 Android 裝置上為了提高執行效率,在編譯 Android 專案時,Android 通過 SDK 提供的工具 dex.jar 會把所有的 .class 檔案最終打包成一個或者多個 .dex 檔案

ART 和 Dalvik 區別

Dalvik 是 ART 的前身 ,從 Android L 開始,Android 開始啟用了新設計的虛擬機器 ART 。 ART 比起 Dalvik 有以下優勢:

  • 預先 (AOT) 編譯

ART 引入了預先編譯機制,可提高應用的效能。在安裝時,ART 使用裝置自帶的 dex2oat 工具來編譯應用,併為目標裝置生成經過編譯的應用可執行檔案

  • 垃圾回收方面的優化

我們知道執行GC操作的時候,任何執行緒的任何操作都會需要暫停,等待GC操作完成之後,其他操作才能夠繼續執行,所以GC在 Dalvik 時代也是經常被人詬病的,它會導致介面卡頓。而ART 在GC導致顯示不穩定、介面響應速度緩慢以及其他問題都做了優化

參考

android中籤名原理和安全性分析之meta-inf檔案講解 source.android.com/devices/tec…