Android 11 開發者預覽版現已推出;快來測試并分享您的反饋吧

使用 APK 分析器分析您的構建

Android Studio 包含一個 APK 分析器,可讓您在構建流程完成后立即了解 APK 的組成。使用 APK 分析器可以減少調試應用的 DEX 文件和資源相關問題所用的時間,并且有助于減小 APK 的大小。您也可以使用 apkanalyzer 從命令行運行該工具。

通過 APK 分析器,您可以完成以下操作:

  • 查看 APK 中的文件(如 DEX 和 Android 資源文件)的絕對大小和相對大小。
  • 了解 DEX 文件的組成。
  • 快速查看 APK 中的文件(如 AndroidManifest.xml 文件)的最終版本。
  • 對兩個 APK 進行并排比較。

當某個項目處于打開狀態時,您可以通過以下三種方式訪問 APK 分析器:

  • 將 APK 拖動到 Android Studio 的 Editor 窗口中。
  • Project 窗口中切換到 Project 透視圖,然后在默認的 build/output/apks/ 目錄中雙擊相應 APK。
  • 在菜單欄中依次選擇 Build > Analyze APK,然后選擇您的 APK。

查看文件和大小信息

APK 是遵循 ZIP 文件格式的文件。APK 分析器將每個文件或文件夾顯示為一個實體,這些實體具有可用于導航到文件夾中的展開功能。這些實體的層次結構反映了 APK 中的文件和文件夾的結構。

APK 分析器會顯示每個實體的原始文件大小和下載文件大小值,如圖 1 所示。Raw File Size 表示實體在磁盤上未經壓縮時的大小,而 Download Size 則表示實體由 Google Play 提供時估計壓縮后的大小。% of Total Download Size 表示實體占 APK 總下載大小的百分比。

圖 1. APK 分析器中的文件大小

查看 AndroidManifest.xml

如果您的項目包含多個 AndroidManifest.xml 文件(如產品變種的清單文件)或者包含的庫也提供清單文件,這些文件會在您的 APK 中合并成一個文件。此清單文件在 APK 中通常是二進制文件,但在 APK 分析器中選擇此文件后,會重構并呈現此實體的 XML 格式。在此查看器中,您可以了解在構建期間可能對您的應用所做的任何更改。例如,您可以看到應用所依賴的某個庫中的 AndroidManifest.xml 文件是如何合并到最終 AndroidManifest.xml 文件中的。

此外,此查看器還提供了一些 Lint 功能,并且會在右上角顯示相關警告或錯誤。圖 2 顯示了正在報告選定清單文件中的一條錯誤。

圖 2. 選定清單文件的右側空白處顯示了一個錯誤圖標

查看 DEX 文件

在 APK 分析器的 DEX 文件查看器中,您可以立即查看應用的 DEX 文件中的底層信息。該查看器中提供了類、軟件包、總引用和聲明計數,這有助于決定是否使用多 dex 文件或如何移除依賴項以低于 64K DEX 限制

圖 3 描繪了一個低于 64k DEX 限制的中等大小的應用。Defined MethodsReferenced Methods 列中列出了 DEX 文件中每個軟件包、類和方法的相關計數。Referenced Methods 列統計由 DEX 文件引用的所有方法。這通常包括在您的代碼和依賴項庫中定義的方法,以及在代碼使用的標準 Java 和 Android 軟件包中定義的方法 - 這些方法計入每個 DEX 文件中的 64k 方法限制。Defined Methods 列僅統計在某一個 DEX 文件中定義的方法,所以此數字是 Referenced Methods 的子集。請注意,如果將某個依賴項打包在 APK 中,這兩個方法計數都會加上在該依賴項中定義的方法。另請注意,縮減大小和代碼縮減功能也會在源代碼經過編譯后顯著改變 DEX 文件的內容。

圖 3. 一個中等大小的應用

過濾 DEX 文件樹狀視圖

Class 列表正上方,APK 分析器提供了用于查看選定 DEX 文件內容的過濾器。

圖 4. 設置 DEX 過濾器來顯示 BuildConfig 的字段和方法

要使用過濾器來顯示某個類中的所有方法和字段,請執行以下操作:

  1. File 列表中,選擇 classes.dex 文件。
  2. Class 列表中,導航到一個類并選擇該類。
  3. 展開您選擇的類。
  4. 切換 Show fields 圖標 以顯示或隱藏類字段。
  5. 切換 Show methods 圖標 以顯示或隱藏類方法。
  6. 切換 Show all referenced methods or fields 圖標 以顯示或隱藏引用的軟件包、類、方法和字段。在樹狀視圖中,斜體節點是在選定 DEX 文件中沒有定義的引用。

    DEX 文件可以引用在其他文件中定義的方法和字段。例如,System.out.println() 是對 Android 框架中的 println() 方法的引用。

加載 ProGuard 映射

過濾器圖標旁邊是 ProGuard 映射圖標。它們處于灰顯狀態,直到您加載一組 ProGuard 映射文件來向 DEX 查看器添加一些功能,如對名稱進行反混淆處理 (mapping.txt)、顯示已移除的節點 (usage.txt),以及指示無法移除的節點 (seeds.txt)。您導入的 ProGuard 映射文件的構建版本必須與啟用了代碼縮減功能后生成的 APK 的構建版本相同。要了解詳情,請參閱壓縮、混淆和優化應用

圖 5. 加載 ProGuard 映射

要加載 ProGuard 映射文件,請執行以下操作:

  1. 點擊 Load Proguard Mappings
  2. 導航到包含映射文件的項目文件夾,然后加載所有文件、文件的任意組合或包含文件的文件夾。

    映射文件通常位于 project/app/build/outputs/mappings/release/。如果文件選擇器檢測到此項目結構,會默認選擇 release 文件夾。首先,文件選擇器會檢查與 mapping.txtseeds.txtusage.txt 完全匹配的文件名。接下來,文件選擇器會檢查在任意位置包含文本 mappingusageseeds 且以.txt 結尾的文件名。例如,release-seeds-1.10.15.txt 就是一個匹配項。

以下列表介紹了映射文件:

  • seeds.txt:ProGuard 配置阻止在壓縮過程中移除的節點以粗體顯示。
  • mapping.txt:啟用 Deobfuscate names(點擊 圖標),以便恢復由 R8 進行了混淆處理的節點的原始名稱。例如,可以將 abc 之類進行了混淆處理的節點名稱恢復為 MyClassMainActivitymyMethod()
  • usage.txt:啟用 Show removed nodes(點擊 圖標),以便顯示 R8 在壓縮過程中移除的類、方法和字段。恢復的節點帶刪除線。

    如需詳細了解如何使用 R8 對代碼進行混淆處理并最大限度地減小其大小,請參閱壓縮、混淆和優化應用

顯示字節碼、查找用法以及生成 Keep 規則

Class 列表視圖中的節點具有一個上下文菜單,其中包含以下選項,可用于查看字節碼、查找用法以及顯示一個對話框(其中顯示了您可以為選定節點復制并粘貼的 ProGuard 規則)。右鍵點擊 Class 列表視圖中的任意節點即可顯示其上下文菜單。

Show bytecode:對選定的類、方法或字段進行反編譯,并在對話框中顯示 smali 字節碼(而不是 Java 代碼)表示形式,如下所示:

圖 6. init 方法的 DEX 字節碼

Find usages:顯示 DEX 代碼的哪些其他部分對選定的類或方法進行了引用(圖 7)。如果加載了 seeds.txt,以粗體顯示的節點表示 Proguard 配置阻止在壓縮過程中移除這些節點:

圖 7.MyClass 的引用

Generate Proguard Keep rule:顯示您可以復制并粘貼到項目 Proguard 配置文件中的 Proguard 規則,這些規則可阻止在代碼縮減階段移除給定的軟件包、類、方法或字段(圖 8)。如需了解詳情,請參閱自定義要保留的代碼

圖 8. 您可以從對話框復制到 Proguard 配置文件中的 Proguard 規則

查看代碼和資源實體

各種構建任務會更改 APK 文件中的最終實體。例如,Proguard 壓縮規則可以改變您的最終代碼,而圖片資源可以由產品變種中的資源替換。使用 APK 分析器可以輕松查看文件的最終版本:只需點擊相應實體,下方便會顯示文本或圖片實體的預覽,如圖 9 所示。

圖 9. 最終圖片資源的預覽

APK 分析器還可以顯示各種文本和二進制文件。例如,在 resources.arsc 實體查看器中,您可以查看配置專用的值,如字符串資源的語言翻譯。在圖 10 中,您可以看到每個字符串資源的翻譯。

圖 10. 已翻譯字符串資源的預覽

比較 APK 文件

APK 分析器可以比較兩個不同 APK 文件中的實體大小。當您需要了解為什么您的應用較之先前版本有所增大時,這非常有用。在發布經過更新的 APK 之前,請執行以下操作:

  1. 將要發布的 APK 版本加載到 APK 分析器中。
  2. 點擊 APK 分析器右上角的 Compare With
  3. 在選擇對話框中,找到上次向用戶發布的 APK,然后點擊 OK

    此時將顯示一個類似于圖 11 中的對話框,幫助您評估更新可能會對用戶產生的影響。

圖 11 顯示了特定應用的調試版本和發布版本之間的差異。這兩種版本類型使用不同的構建選項,因而會以不同的方式改變底層實體。

圖 11. 調試版本 APK 和發布版本 APK 之間的差異