Android性能優化——使用 APK Analyzer 分析你的 APK


Android Studio 2.2包含了APK Analyzer,通過它我們能夠直觀地看到APK的組成。使用APK Analyzer不僅能夠減少你花在debug上的時間,而且還能減少你的APK大小。使用APK Analyzer,你能夠實現:

  • 查看APK中文件的絕對大小和相對大小。(譯注:相對大小指的是該文件占整個APK大小的百分比)

  • 理解DEX文件的組成。(譯注:能看到DEX文件中包含了哪些類)

  • 快速查看APK中文件的最終版本(比如AndroidManifest.xml)。(譯注:AndroidManifest.xml、resources.arsc本來是二進制形式顯示的,APK Analyzer能夠解析並顯示這些文件的內容)

  • 對比兩個APK。(譯注:新版APK和舊版APK之間文件大小的差異)

這里有3種方法訪問APK Analyzer:

  • 拖拽APK到Android Studio的編輯窗口。

  • 切換到Project視圖,並且雙擊APK文件。

  • 在菜單欄中選擇Build > Analyzer APK,並且選擇APK。

注意:當使用APK Analyzer分析debug的APK,請使用Build > Build APK生成的APK。點擊Run將會生成Instant Run的APK。APK Analyzer不能分析通過Instant Run生成的APK,判斷APK是否是Intant Run生成的可以通過看APK中是否有instant-run.zip文件。

譯注:APK Analyzer是讓我們更有效地制定減包方案的實用工具,它能夠讓我們發現使得APK變大的元凶。

查看文件和大小信息

APK就是一個zip包。APK Analyzer顯示每個文件或目錄作為一個實體,實體的層級說明了APK文件的結構。

如圖1,APK Analyzer對每個實體顯示了raw file size和download file size。Raw File Size表示實體在磁盤中解壓后的大小,而Download Size表示實體在Google Play中壓縮后的大小。% of Total Download Size表示實體的download size占APK總的download size的百分比。

譯注:圖1中,最上面的5.8M是指APK在磁盤中的大小,而4.9M是指從Google Play中下載的大小。

圖1:在APK Analyzer中的文件大小

譯注:通過查看各個目錄或文件的大小,我們能發現APK中哪個區域的文件太大了,比如如果dex太大,我們是不是引入了重復功能的第三方庫(比如Glide和Fresco),或者抽取出一個精簡的第三方庫(精簡ffmpeg庫);如果res目錄太大,我們可以看看哪些圖片過大了,需要通過tinypng壓縮,或者用webp代替。

查看AndroidManifest.xml

如果項目中包含了多個AndroidManifest.xml或者包含提供manifest文件的library,在APK中他們將被合並為一個manifest文件。在APK中manifest文件是普通的二進制文件,但是在APK Analyzer中查看manifest文件,該文件是以XML形式顯示的。這種顯示形式讓我們能理解應用中的任何變化。比如,你能看到library中的AndroidManifest.xml是怎么合入最后的AndroidManifest.xml的。

另外,這種顯示形式提供了lint的能力,會在右上角顯示警告、錯誤提示。圖2顯示了manifest文件的錯誤提示。

圖2:manifest文件的一個錯誤

查看代碼和資源實體

不同的構建任務會改變APK文件最后的實體。比如混淆壓縮規則能改變你最后的代碼和圖片資源。在APK Analyzer中能夠快速查看文件的最終版本:點擊實體,就能在下面看到文件的內容,包含文字和圖片實體的預覽。

圖3:最終圖片資源的預覽

APK Analyzer也能展示文本或二進制文件。比如點擊resources.arsc能夠讓你看到針對配置特定的值(例如一個字符串資源的特定語言的翻譯)。如圖4,你能看到每個字符串資源的翻譯。

圖4:翻譯的字符串資源預覽

查看DEX文件

APK Analyzer的DEX文件瀏覽器讓你能夠快速了解DEX文件的信息。我們能看到類、包、總的引用和聲明個數,這些信息能夠幫助我們決定是否使用multi-dex或者移除依賴使得滿足64K方法數限制。

圖5展示了一個中等大小的APP(方法數接近64K)。每個包、類、方法都列有Defined Method和Referenced Method。Referenced Method列是DEX文件中引用的全部方法,它包含了你定義的方法、依賴的library、定義在標准Java和Android包中的方法。Defined Method列只包含了定義在DEX文件中方法,因此它是Referenced Method方法的子集。注意當你引入一個依賴,在依賴中定義的方法會包含在Defined Method和Referenced Method中。還要注意,混淆壓縮也會改變DEX文件的內容。

圖5:一個使用了multi-dex的應用

比較APK文件

APK Analyzer能比較兩個不同APK中各個實體的大小。這對於我們了解為何你的APP相比上個版本變大了是很有用的。

在發布一個新版APK之前,在APK Analyzer中導入你即將發布的APK。在右上角點擊Compare With,選擇上一個版本的APK,點擊OK。然后就會出現類似圖6的對話框,允許你比較之間的差別。

圖6顯示了一個APP的debug和release包的差別,不同的編譯類型會導致實體的不同。

譯注:Old Size是先選擇的APK,New Size是后選擇的APK。

圖6:debug和release的APK之間的差別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM