使用 APK Analyzer 分析版本

Android Studio 內含 APK 分析工具,可在建構程序完成後立即提供 APK 或 Android App Bundle 組成項目的深入分析。使用 APK 分析工具可減少對應用程式中 DEX 檔案和資源問題偵錯花費的時間,同時有助於縮減 APK 大小。APK 分析工具也可透過加上 apkanalyzer 的指令列使用。


使用 APK 分析工具可以:

  • 查看應用程式中檔案的絕對大小和相對大小,例如 DEX 和 Android 資源檔案。
  • 瞭解 DEX 檔案的組成內容。
  • 快速查看應用程式中檔案的最終版本,例如 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」代表實體在 APK 大小中所佔的比例。「Download Size」代表由 Google Play 提供該實體時的預估壓縮大小。「% of Total Download Size」表示實體代表的 APK 總下載大小百分比。

圖 1. APK 分析工具中的檔案大小。

查看 AndroidManifest.xml

如果專案含有多個 AndroidManifest.xml 檔案 (例如用於多個變種版本) 或內含的程式庫也提供資訊清單檔案,系統會將這些檔案合併為應用程式中的單一檔案。這個資訊清單檔案在 APK 或應用程式套件中通常是二進位檔案,但如果在 APK 分析工具中選取該檔案,系統就會重新建構並呈現這個實體的 XML 格式。

這個檢視器可協助您瞭解在建構期間可能已對應用程式進行的任何變更。例如,您可以瞭解應用程式所依附程式庫中的 AndroidManifest.xml 檔案是如何合併至最終的 AndroidManifest.xml 檔案。

此外,這個檢視器提供部分 Lint 功能,並在右上角顯示警告或錯誤。圖 2 顯示針對所選資訊清單檔案回報的錯誤。

圖 2. 所選資訊清單檔案的右上方顯示錯誤圖示。

查看 DEX 檔案

APK 分析工具的 DEX 檔案檢視器可讓您立即存取應用程式中 DEX 檔案的基礎資訊。檢視器會提供類別、套件、總參照和宣告數量,有助於判斷是否要使用 Multidex,或是如何移除依附元件,才能低於 64K DEX 上限

圖 3 顯示低於 64k DEX 上限的中等大小應用程式。DEX 檔案中每個套件、類別和方法的計數,都會列在「Defined Methods」和「Referenced Methods」欄中。

「Referenced Methods」欄會計算 DEX 檔案參照的所有方法。通常包括程式碼中定義的方法、依附元件程式庫,以及程式碼使用的標準 Java 和 Android 套件中定義的方法。這些方法會計入每個 DEX 檔案中 64,000 個方法的數量限制。

「Defined Methods」欄只會計算其中一個 DEX 檔案中定義的方法,因此這個數字是「Referenced Methods」的子集。

圖 3. 中等大小應用程式。

篩選 DEX 檔案樹狀檢視

在「Class」清單的上方,APK 分析工具提供篩選器,方便您查看所選 DEX 檔案的內容,如圖 4 所示。

圖 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 圖示會顯示為灰色,直到您載入一組 ProGuard 對應檔,將功能新增至 DEX 檢視器,例如去模糊化名稱 (mapping.txt)、顯示已移除的節點 (usage.txt),以及標示無法移除的節點 (seeds.txt)。

所匯入 ProGuard 對應檔的來源版本,必須是在啟用程式碼縮減功能時所產生 DEX 檔案版本。

圖 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」清單檢視中的任何節點上按一下滑鼠右鍵,即可顯示相關內容選單。

顯示位元碼:反編譯所選類別、方法或欄位,並在對話方塊中顯示 Smali 位元碼表示法,如下所示:

圖 6. init 方法的 DEX 位元碼。

查看使用情形:顯示 DEX 程式碼中還有哪些部分參照了所選類別或方法,如圖 7 所示。如果已載入 seeds.txt,則表示根據 ProGuard 設定,以粗體顯示的節點不會在縮減期間遭到移除:

圖 7.MyClass 的參照。

產生 ProGuard Keep 規則:顯示 ProGuard 規則,您可以將這些規則複製及貼到專案的 ProGuard 設定檔中,如圖 8 所示。 這樣可防止特定套件、類別、方法或欄位在程式碼縮減階段遭到移除。詳情請參閱「自訂要保留的程式碼」相關說明。

圖 8. 可從對話方塊複製到 ProGuard 設定檔的 ProGuard 規則。

查看程式碼和資源實體

多項建構工作會變更應用程式中的最終實體。舉例來說,ProGuard 縮減規則可能會修改最終程式碼,而圖片資源也可以遭到變種版本的資源覆寫。

如要使用 APK 分析工具查看檔案的最終版本,只要點選實體即可預覽文字或圖片實體,如圖 9 所示。

圖 9. 最終圖片資源的預覽畫面。

APK 分析工具也可以顯示各種文字和二進位檔案。例如,resources.arsc 實體檢視器可讓您查看設定專用的值,例如字串資源的語言翻譯。在圖 10 中,您可以看到每個字串資源的翻譯。

圖 10. 字串資源翻譯的預覽畫面。

比較檔案

APK 分析工具會比較兩個不同 APK 或應用程式套件檔案中的實體大小。如果您需要瞭解應用程式比先前版本更大的原因,這項工具非常實用。

發布更新的應用程式前,請先執行下列操作:

  1. 在 APK 分析工具中載入即將發布的應用程式版本。
  2. 按一下 APK 分析工具右上角的「Compare with previous APK...」
  3. 在選項對話方塊中,找出上次發布給使用者的構件,然後按一下「OK」

    系統會顯示類似圖 11 的對話方塊,幫助您評估這項更新可能對使用者造成的影響。

圖 11 顯示了特定應用程式的偵錯版本和發布子版本之間的差異。這些建構類型使用了不同的建構選項,因而以不同方式改變了基礎實體。

圖 11. 偵錯版本和發布版本 APK 之間的差異。