有效減少 Android 應用的方法數
簡評:65k 限制確實是個令人不爽的事情,這裡就讓你知道是哪些庫用了大量的方法,並該怎麼減少這些庫的方法數。
現在的應用越來越大,方法數經常達到 65k 限制。這裡就介紹下如何可視化 library 方法數和減少方法數的方法。
可視化方法數
可視化各 library 方法數的簡單辦法就是使用 Dexcount Gradle Plugin,只需要在 app/build.gradle 中簡單的集成:
buildscript {n repositories {n mavenCentral() // or jcenter()n }nn dependencies {n classpath com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4n }n}nn// make sure this line comes *after* you apply the Android pluginnapply plugin: com.getkeepsafe.dexcountn
在項目中運行 ./gradlew assembleDebug 就會在 console 中輸出:
並會在 build/outputs/dexcount/debugChart 中生成一個可交互的圖形報告:
減少方法數
在我們選用 library 之前,有必要考慮其方法數,原因有二:
- 更換現有程序中已使用的庫非常有挑戰性,所以最好之前就想好。
- 很多人引入了一個很大的 library,但只是為了做很簡單的事(Strings.isNullOrEmpty()),通常你都用不到 library 的所有方法。
對於一個功能,通常都會有好幾個庫能完成這一個功能。這裡以圖片載入為例:
那對於已經使用的庫,有沒有辦法來減少方法數呢?
我們可以用 Proguard 來剔除庫中未使用的部分。這裡我們用 Guava 來舉例,首先我們需要知道項目實際用到了哪些部分,在 src 文件夾下運行下面的命令:
grep -roh . -e com.google.common.* | sort | uniqn
也就是根據庫的前綴來查找所有的 import 語句(對於 Guava 來說就是 com.google.common)。
之後,創建一個 Proguard 配置:
-dontoptimizen-dontobfuscatenn-keep public class com.google.common.base.** {n public *;n}nn-keep public class com.google.common.collect.** {n public *;n}nn-keep public class com.google.common.primitives.** {n public *;n}nn-keep public class com.google.common.util.** {n public *;n}n...n
執行一個 Gradle 腳本,就可以生成一個縮小版的庫,再將其複製到項目的 libs 文件夾中進行使用。
上面的技巧一定要謹慎使用,因為是我們手動執行的,所以更容易出錯,一定要多多測試。
詳細用法可以進一步參考作者的項目:https://github.com/JeroenMols/MethodCountExample原文:EFFICIENTLY REDUCING YOUR METHOD COUNT
擴展閱讀:
- 認識 android-job
歡迎關註:知乎專欄「極光日報」,每天為 Makers 導讀三篇優質英文文章。
推薦閱讀: