使用 APK 分析工具分析版本

Android Studio 內含 APK 分析工具,可在建構程序完成後立即提供 APK 或 Android App Bundle 組成項目的深入分析。使用 APK 分析工具可減少對應用程式中 DEX 檔案和資源問題偵錯花費的時間,並幫助縮減 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 或應用程式套件

查看檔案及大小資訊

APK 是採用 ZIP 檔案格式的檔案。APK 分析工具會將每個檔案或資料夾顯示為實體,並提供展開功能,可瀏覽資料夾。實體階層會反映 APK 檔案中的檔案和資料夾結構。

APK 分析工具會顯示每個實體的原始檔案大小並下載檔案大小值 (如圖 1 所示)。原始檔案大小代表磁碟上實體的未壓縮大小,而下載大小代表 Google Play 遞送的實體的預估壓縮大小。總下載大小 % 表示實體代表的 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 Method」(已定義方法) 和「Referenced Methods」(參照方法) 欄中。「Referenced Methods」(參照方法) 欄會計算 DEX 檔案參照的所有方法。通常包括程式碼中定義的方法、依附元件程式庫,以及程式碼使用的標準 Java 和 Android 套件中定義的方法,這些方法會計入每個 DEX 檔案中 64,000 個方法的限制。「Defined Methods」(已定義方法) 欄只會計算其中一個 DEX 檔案中定義的方法,因此這個數字是「Referenced Methods」(參照方法) 的子集。請注意,當您在應用程式中封裝依附元件時,依附元件中定義的方法會加入這兩個方法的計數。另外也請注意,壓縮和程式碼縮減兩者都可以在原始碼編譯完成後大幅變更 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 對應檔的來源版本必須與產生 DEX 檔案 (已啟用程式碼縮減) 的版本相同。詳情請參閱「縮減、模糊化及最佳化應用程式」

圖 5. 載入 ProGuard 對應

如要載入 ProGuard 對應檔,請按照下列步驟操作:

  1. 按一下「Load Proguard Mappings」(載入 Proguard 對應項目)
  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 (非 Java 程式碼) 位元碼表示法,如下所示:

圖 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」(比較對象)
  3. 在選項對話方塊中,找出上次發布給使用者的版本,然後按一下「OK」(確定)

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

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

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