apkanalyzer

APK 分析工具的指令列版本可在建構程序完成後立即提供 APK 組成情形的洞察資訊,方便您比較兩個 APK 的差異。使用 APK 分析工具可減少對應用程式中 DEX 檔案和資源問題進行偵錯所花費的時間,並縮減 APK 的大小。

apkanalyzer 包含在 android_sdk/cmdline-tools/version/bin/apkanalyzerAndroid SDK 指令列工具套件中。此外,您也可以在 Android Studio 中存取 APK 分析工具,詳情請參閱「使用 APK 分析工具分析版本」一文。

語法

apkanalyzer 的語法如下:

apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]

subject 是您想要查詢的內容,可以是整個 APK 或 APK 的一部分。主旨可以是下列任一值:

  • apk:分析 APK 檔案屬性,例如應用程式 ID、版本代碼和版本名稱。
  • files:分析 APK 檔案中的檔案。
  • manifest:分析 APK 檔案中的資訊清單內容。
  • dex:分析 APK 檔案中的 DEX 檔案。
  • resources:查看文字、圖片和字串資源。

verb 是這個主題的相關事項。您可以參考下方「指令」一節的說明,進一步瞭解主旨、動詞及其選項。

每個指令都需要指定 APK 檔案。只有 apk compare 指令會要求您指定第二個 APK。

只要選項很明確,就可以縮短每個選項。舉例來說,--human-readable 全域選項可縮短為 -h

下列範例會分析 apk (主旨) 以便取得其 file-size (動詞),然後以使用者可理解的格式 (-h 選項) 列印檔案大小:

apkanalyzer -h apk file-size myapk.apk

指令

下方的指令說明會按照主旨分類,並列出每個主旨的可用動詞和選項組合:

查看 APK 檔案屬性 說明
apk summary apk-file 列印應用程式 ID、版本代碼及版本名稱。

輸出內容範例:

com.myapp 5 1.1-beta

apk file-size apk-file 列印 APK 的檔案總大小。
apk download-size apk-file 列印 APK 下載大小的預估資料。
apk features [--not-required] apk-file 顯示觸發 Play 商店篩選功能的 APK 使用的列印功能。新增 --not-required 選項,即可在輸出中加入標示為不需要的特徵。

輸出內容範例:

android.hardware.type.watch
android.hardware.microphone implied:
    requested android.permission.RECORD_AUDIO permission

apk compare [options] apk-file apk-file2 比較 apk-fileapk-file2 的大小。您可以加入下列選項:
  • --different-only:列印差異目錄和檔案。
  • --files-only:不要列印目錄項目。
  • --patch-size:顯示每個檔案修補程式 (而非原始差異) 的預估值。

輸出範例 (舊大小 / 新大小 / 大小差異 / 路徑):

39086736 48855615 9768879 /
10678448 11039232 360784 /classes.dex
18968956 18968956 0 /lib/
110576 110100 -476 /AndroidManifest.xml
...

查看 APK 檔案系統 說明
files list apk-file 列出 APK 中的所有檔案。

輸出內容範例:

/
/classes2.dex
/classes.dex
/assets/
/assets/asset.data
/AndroidManifest.xml
/resources.arsc
/res/
...

files cat --file path apk-file 列印檔案內容。您必須使用 --file path 選項 (例如 --file /AndroidManifest.xml ) 在 APK 中指定路徑
查看資訊清單中的資訊 說明
manifest print apk-file 以 XML 格式列印 APK 資訊清單。
manifest application-id apk-file 列印應用程式 ID 值。
manifest version-name apk-file 列印版本名稱值。
manifest version-code apk-file 列印版本代碼值。
manifest min-sdk apk-file 列印最低 SDK 版本。
manifest target-sdk apk-file 列印目標 SDK 版本。
manifest permissions apk-file 列印權限清單。
manifest debuggable apk-file 顯示應用程式是否可供偵錯。
存取 DEX 檔案資訊 說明
dex list apk-file 列印 APK 中的 DEX 檔案清單。
dex references [--files path] [--files path2] apk-file 列印指定 DEX 檔案中的方法參照數量。 預設值為所有 DEX 檔案。加入 --files 選項以指明您想要納入的特定檔案。

輸出內容範例:

classes.dex 59598
classes2.dex 8042

dex packages [option1 option2 ...] apk-file 列印 DEX 中的類別樹狀結構。輸出結果中,PCMF 分別是套件、類別、方法和欄位。而 xkrd 分別代表已移除、保留、參照和定義節點。

新增下列選項,修正輸出結果:

  • --defined-only:只包含輸出內容在 APK 中定義的類別。
  • --files:指定要納入的 DEX 檔案名稱。預設值:所有 DEX 檔案。
  • --proguard-folder file:指定 Proguard 輸出資料夾,藉此搜尋對應。
  • --proguard-mappings file:指定 Proguard 對應檔案。
  • --proguard-seeds file:指定 Proguard 種子檔案。
  • --proguard-usages file:指定 Proguard 使用檔案。
  • --show-removed:顯示由 Proguard 移除的類別和成員。

輸出範例 (類型/狀態/定義方法/參照方法) /位元組大小/名稱):

P d 1 1 85 g
P d 1 1 85 g.a
C d 1 1 85 g.a.a
M d 1 1 45 g.a.a java.lang.Object get()
C r 0 1 40 byte[]
M r 0 1 40 byte[] java.lang.Object clone()

dex code --class class [--method method] 以 Smali 格式列印類別或方法的位元碼。需要類別名稱並列印完整類別名稱,以便解壓縮。新增 --method 選項,指定要解碼的方法。

該方法的編譯格式為 name(params)returnType,例如 someMethod(Ljava/lang/String;I)V

查看 res/ 和 Resources 中儲存的資源。arsc 說明
resources packages 列印資源資料表中定義的套件清單。
resources configs --type type [--package package] apk-file 列印指定 type 的設定清單。 type 是資源類型,例如 string。如要指定資源資料表套件名稱,請加入 --package 選項,否則系統會使用第一個定義的套件。
resources value --config config --name name --type type [--package package] apk-file 列印 confignametype 指定資源的值。type 選項是資源類型,例如 string

如要指定資源資料表套件名稱,請加入 --package 選項,否則系統會使用第一個定義的套件。

resources names --config config --type type [--package package] apk-file 列印設定與類型的資源名稱清單。type 選項是資源類型,例如 string。 如要指定資源資料表套件名稱,請加入 --package 選項,否則系統會使用第一個定義的套件。
resources xml --file path apk-file 列印使用者可理解的二進位 XML 檔案。 加入 file 選項即可指定檔案的路徑。