- Gradle 翻譯 Analyzer APK文件分析 MD

Markdown版本筆記 個人GitHub首頁 個人博客 個人微信 個人郵箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目錄

APK文件分析

官方文檔java

使用 APK 分析器分析您的編譯版本

[Analyze your build with APK Analyzer]node

Android Studio包含一個APK分析器,可在構建過程完成後當即深刻了解APK的組成。使用APK分析器能夠減小您調試應用的DEX文件資源相關問題所花費的時間,並有助於減小您的APK大小。您也能夠經過命令行 apkanalyzer 使用。android

使用APK分析器,您能夠完成如下操做:git

  • 查看APK中文件的絕對大小和相對大小,例如DEX和Android資源文件。
  • 瞭解DEX文件的組成。
  • 快速查看APK中文件的最終版本,例如AndroidManifest.xml文件。
  • 對兩個APK進行並排比較[side-by-side comparison]。

項目打開時,有三種方法能夠訪問APK Analyzer:github

  • 將APK拖到Android Studio的編輯器窗口中。
  • 在 Project 窗口中切換到 Project 透視圖,而後在默認的 build/output/apks/ 目錄中雙擊相應 APK。
  • 在菜單欄中選擇Build> Analyze APK,而後選擇您的APK。

重要:分析調試版本時,請使用經過選擇Build> Build APKgradle命令建立的APK。單擊工具欄中的 Run 會生成啓用了Instant Run的APK,這些APK不該與APK Analyzer一塊兒用於優化任務,由於它們僅供開發使用,並動態加載大多數資源。您能夠經過是否有 instant-run.zip 文件嵌入在APK中來識別即時運行APK。微信

查看文件和大小信息

[View file and size information]app

APK是遵循ZIP文件格式的文件[APKs are files that follow the ZIP file format]。APK 分析器將每一個文件或文件夾顯示爲一個實體,這些實體具備可用於導航到文件夾中的展開功能。這些實體的層次結構反映了 APK 中的文件和文件夾的結構。框架

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

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

查看 AndroidManifest.xml

若是您的項目包含多個 AndroidManifest.xml 文件(如 product flavors 的清單文件)或者包含的庫也提供清單文件,這些文件會在您的 APK 中合併成一個文件。此清單文件一般是 APK 中的二進制文件,但在 APK 分析器中選擇此文件後,會重構並呈現此實體的 XML 格式。在此查看器中,您能夠了解在編譯期間可能對您的應用所作的任何更改。例如,您能夠看到應用所依賴的某個庫中的 AndroidManifest.xml 文件是如何合併到最終 AndroidManifest.xml 文件中的。

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

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

查看 DEX 文件

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

圖 3 描繪了一個低於 64k DEX 限制的中等大小的應用。

  • Defined MethodsReferenced Methods 列中列出了 DEX 文件中每一個軟件包、類和方法的相關計數。
  • Referenced Methods 列統計由 DEX 文件引用的全部方法。這一般包括在您的代碼和依賴項庫中定義的方法以及在代碼使用的標準 Java 和 Android 軟件包中定義的方法 - 這些方法計入每一個 DEX 文件中的 64k 方法限制。
  • Defined Methods 列僅統計在某一個 DEX 文件中定義的方法,因此此數字是 Referenced Methods 的子集。

請注意,若是將某個依賴項打包在 APK 中,這兩個方法計數都會加上在該依賴項中定義的方法。
另請注意,縮減大小[minification]和 Proguard 壓縮 功能也會在源代碼通過編譯後大大改變 DEX 文件的內容。

Figure 3. A medium-sized app

過濾DEX文件樹視圖

[Filter the DEX file tree view]

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

要使用過濾器來顯示某個類中的全部方法和字段,請執行如下操做:

  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 映射文件將應用於在啓用了 Proguard 的狀況下編譯的 APK,而且它們來自的編譯版本必須與生成相應 APK 的編譯版本相同。

要加載 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(點擊 圖標),以便恢復由 Proguard 進行了混淆處理的節點的原始名稱。例如,您能夠將 abc 之類進行了混淆處理的節點名稱恢復爲 MyClassMainActivitymyMethod()
  • usage.txt:啓用 Show removed nodes(點擊 圖標),以便顯示 Proguard 在壓縮過程當中移除的類、方法和字段。恢復的節點帶刪除線

例如如下工程中,MainActivity、SecondActivity是不被混淆的類(以粗體顯示),OtherClass爲未被使用、會被移除的類(帶刪除線),OtherClass爲會被混淆的類:

反混淆前:

反混淆後:

如需詳細瞭解如何使用 Proguard 對代碼進行混淆處理並最大限度地減少其大小,請參閱 壓縮代碼和資源

顯示字節碼,查找用法,生成Keep規則

[Show bytecode, find usages, and generate Keep rule]

Class 列表視圖中的節點具備一個上下文菜單,其中包含如下選項,可用於查看字節碼、查找用法以及顯示一個對話框(其中顯示了您能夠爲選定節點複製並粘貼的 Proguard 規則)。右鍵點擊 Class 列表視圖中的任意節點便可顯示其上下文菜單。

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

.class public Lcom/bqt/lock/MainActivity;
.super Landroid/support/v4/app/FragmentActivity;
.source "MainActivity.java"


# static fields
.field private static final REQUEST_PACKAGE_USAGE_STATS:I = 0x44d


# direct methods
.method public constructor <init>()V
    .registers 1

    .line 18
    invoke-direct {p0}, Landroid/support/v4/app/FragmentActivity;-><init>()V

    return-void
.end method

原始代碼:

public void a() {
    System.out.println("GoodBye");
}

對應的 smali 字節碼:

.method public a()V
    .registers 3
​
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
​
    const-string v1, "GoodBye"
​
    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
​
    return-void
.end method

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


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

例如對於 OtherClass2,在彈窗中生成的信息爲:

# Add *one* of the following rules to your Proguard configuration file.
# Alternatively做爲選擇, you can annotate classes and class members with @android.support.annotation.Keep
​
# keep the 【class and specified members】 from being removed or renamed 類和類成員不能夠被移除也不能夠被重命名
-keep class com.bqt.test.OtherClass2 { *; }
​
# keep the 【specified class members】 from being removed or renamed only if the class is preserved
-keepclassmembers class com.bqt.test.OtherClass2 { *; }
​
# keep the 【class and specified members】 from being 【renamed】 only 類和類成員不能夠被重命名,但能夠被移除
-keepnames class com.bqt.test.OtherClass2 { *; }
​
# keep the 【specified class members】 from being 【renamed】 only 類成員不能夠被重命名,但能夠被移除
-keepclassmembernames class com.bqt.test.OtherClass2 { *; }

查看代碼和資源實體

各類編譯任務會更改 APK 文件中的最終實體。例如,Proguard 壓縮規則能夠改變您的最終代碼,而圖片資源能夠由 product-flavors 中的資源替換。使用 APK 分析器能夠輕鬆查看文件的最終版本:只需點擊相應實體,下方便會顯示文本或圖片實體的預覽,如圖 9 所示。

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

PS:若是你沒有設置不一樣語言下的值,則只有 default 列有值,其餘類沒有值。

比較APK文件

APK 分析器能夠比較兩個不一樣 APK 文件中的實體大小。當您須要瞭解爲何您的應用較之先前版本有所增大時,這很是有用。在發佈通過更新的 APK 以前,請執行如下操做:

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

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

圖 11 顯示了特定應用的調試版本和發佈版本之間的差別。這兩種版本類型使用不一樣的編譯選項,於是會以不一樣的方式改變底層實體。

2019-10-20

相關文章
相關標籤/搜索