APK 文件分析

概述

咱們經過 Android studio APK Analyze 能夠展開一個APK文件 html

  • 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。java

  • MANIFEST.MF

apk中的這個MANIFEST.MF,列出了apk的全部文件,以及這些文件內容所對應的base64-encoded SHA1 哈希值,android

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值ide

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…

相關文章
相關標籤/搜索