目錄html
Markdown版本筆記 | 個人GitHub首頁 | 個人博客 | 個人微信 | 個人郵箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
官方文檔java
[Analyze your build with APK Analyzer]node
Android Studio包含一個APK分析器,可在構建過程完成後當即深刻了解APK的組成。使用APK分析器能夠減小您調試應用的DEX文件
和資源
相關問題所花費的時間,並有助於減小您的APK大小。您也能夠經過命令行 apkanalyzer
使用。android
使用APK分析器,您能夠完成如下操做:git
AndroidManifest.xml
文件。項目打開時,有三種方法能夠訪問APK Analyzer:github
重要:分析調試版本時,請使用經過選擇
Build> Build APK
或gradle命令
建立的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
文件(如 product flavors 的清單文件)或者包含的庫也提供清單文件,這些文件會在您的 APK 中合併成一個文件。此清單文件一般是 APK 中的二進制文件,但在 APK 分析器中選擇此文件後,會重構
並呈現此實體的 XML 格式。在此查看器中,您能夠了解在編譯期間可能對您的應用所作的任何更改。例如,您能夠看到應用所依賴的某個庫中的 AndroidManifest.xml
文件是如何合併到最終 AndroidManifest.xml
文件中的。
此外,此查看器還提供了一些 Lint 功能,而且會在右上角顯示相關警告或錯誤。圖 2 顯示了正在報告選定清單文件中的一條錯誤。
圖 2. 選定清單文件的右側空白處顯示了一個錯誤圖標
在 APK 分析器的 DEX 文件查看器中,您能夠當即查看應用的 DEX 文件中的底層信息。該查看器中提供了類、軟件包、總引用和聲明計數
,這有助於決定是否使用 multidex 或如何移除依賴項以低於 64K DEX 限制。
圖 3 描繪了一個低於 64k DEX 限制的中等大小的應用。
在您的代碼和依賴項庫中定義的方法
,以及在代碼使用的標準 Java 和 Android 軟件包中定義的方法
- 這些方法計入每一個 DEX 文件中的 64k 方法限制。請注意,若是將某個依賴項打包在 APK 中,這兩個方法計數都會加上在該依賴項中定義的方法。
另請注意,縮減大小[minification]和 Proguard 壓縮 功能也會在源代碼通過編譯後大大改變 DEX 文件的內容。
Figure 3. A medium-sized app
[Filter the DEX file tree view]
在 Class 列表正上方,APK 分析器提供了用於查看選定 DEX 文件內容的過濾器。
要使用過濾器來顯示某個類中的全部方法和字段,請執行如下操做:
classes.dex
文件。斜體節點是在選定 DEX 文件中沒有定義的引用
。DEX 文件能夠引用在其餘文件中定義的方法和字段。例如,
System.out.println()
是對 Android 框架中的println()
方法的引用。
過濾器圖標旁邊是 Proguard 映射圖標。它們處於灰顯狀態,直到您加載一組 Proguard 映射文件來向 DEX 查看器添加一些功能,如對名稱進行反混淆處理 (mapping.txt
)、顯示已移除的節點 (usage.txt
),以及指示沒法移除的節點 (seeds.txt
)。
Proguard 映射文件將應用於在啓用了 Proguard 的狀況下編譯的 APK,而且它們來自的編譯版本必須與生成相應 APK 的編譯版本相同。
要加載 Proguard 映射文件,請執行如下操做:
全部文件、文件的任意組合或包含文件的文件夾
。映射文件一般位於
project/app/build/outputs/mappings/release/
。若是文件選擇器檢測到此項目結構,會默認選擇 release 文件夾。首先,文件選擇器會檢查與mapping.txt
、seeds.txt
和usage.txt
徹底匹配的文件名。接下來,文件選擇器會檢查在任意位置包含文本mapping
、usage
或seeds
且以.txt
結尾的文件名。例如,release-seeds-1.10.15.txt
就是一個匹配項。
如下列表介紹了映射文件:
seeds.txt
:Proguard 配置阻止在壓縮過程當中移除的節點以粗體顯示
。mapping.txt
:啓用 Deobfuscate names(點擊 圖標),以便恢復由 Proguard 進行了混淆處理的節點的原始名稱
。例如,您能夠將 a
、b
和 c
之類進行了混淆處理的節點名稱恢復爲 MyClass
、MainActivity
和 myMethod()
。usage.txt
:啓用 Show removed nodes(點擊 圖標),以便顯示 Proguard 在壓縮過程當中移除的類、方法和字段。恢復的節點帶刪除線
。例如如下工程中,MainActivity、SecondActivity是不被混淆的類(以粗體顯示),OtherClass爲未被使用、會被移除的類(帶刪除線),OtherClass爲會被混淆的類:
反混淆前:
反混淆後:
如需詳細瞭解如何使用 Proguard 對代碼進行混淆處理並最大限度地減少其大小,請參閱 壓縮代碼和資源。
[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 以前,請執行如下操做:
此時將顯示一個相似於圖 11 中的對話框,幫助您評估更新可能會對用戶產生的影響。
圖 11 顯示了特定應用的調試版本和發佈版本之間的差別。這兩種版本類型使用不一樣的編譯選項,於是會以不一樣的方式改變底層實體。
2019-10-20