
簡評:65k 限制確實(shí)是個令人不爽的事情,這里就讓你知道是哪些庫用了大量的方法,并該
現(xiàn)在的應(yīng)用越來越大,方法數(shù)經(jīng)常達(dá)到 65k 限制。這里就介紹下如何可視化 library 方法數(shù)和減少方法數(shù)的方法。
可視化方法數(shù)
可視化各 library 方法數(shù)的簡單辦法就是使用 Dexcount Gradle Plugin,只需要在 app/build.gradle 中簡單的集成:
buildscript {
repositories {
mavenCentral() // or jcenter()
}
dependencies {
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4'
}
}
// make sure this line comes *after* you apply the Android plugin
apply plugin: 'com.getkeepsafe.dexcount'
在項(xiàng)目中運(yùn)行 ./gradlew assembleDebug 就會在 console 中輸出:

并會在 build/outputs/dexcount/debugChart 中生成一個可交互的圖形報(bào)告:

減少方法數(shù)
在我們選用 library 之前,有必要考慮其方法數(shù),原因有二:
- 更換現(xiàn)有程序中已使用的庫非常有挑戰(zhàn)性,所以最好之前就想好。
- 很多人引入了一個很大的 library,但只是為了做很簡單的事(Strings.isNullOrEmpty()),通常你都用不到 library 的所有方法。
這里可以用 methodscount.com 來查詢常用庫的方法數(shù)。
對于一個功能,通常都會有好幾個庫能完成這一個功能。這里以圖片加載為例:

這些庫都有各自的優(yōu)缺點(diǎn),所以清楚了解自己的需求,并選擇庫很有必要。
那對于已經(jīng)使用的庫,有沒有辦法來減少方法數(shù)呢?
我們可以用 Proguard 來剔除庫中未使用的部分。這里我們用 Guava 來舉例,首先我們需要知道項(xiàng)目實(shí)際用到了哪些部分,在 src 文件夾下運(yùn)行下面的命令:
grep -roh . -e 'com.google.common.*' | sort | uniq
也就是根據(jù)庫的前綴來查找所有的 import 語句(對于 Guava 來說就是 com.google.common)。
之后,創(chuàng)建一個 Proguard 配置:
-dontoptimize
-dontobfuscate
-keep public class com.google.common.base.** {
public *;
}
-keep public class com.google.common.collect.** {
public *;
}
-keep public class com.google.common.primitives.** {
public *;
}
-keep public class com.google.common.util.** {
public *;
}
...
執(zhí)行一個 Gradle 腳本,就可以生成一個縮小版的庫,再將其復(fù)制到項(xiàng)目的 libs 文件夾中進(jìn)行使用。
上面的技巧一定要謹(jǐn)慎使用,因?yàn)槭俏覀兪謩訄?zhí)行的,所以更容易出錯,一定要多多測試。
詳細(xì)用法可以進(jìn)一步參考作者的項(xiàng)目
原文:EFFICIENTLY REDUCING YOUR METHOD COUNT
歡迎關(guān)注知乎專欄「極光日報(bào)」,每天為 Makers 導(dǎo)讀三篇優(yōu)質(zhì)英文文章。
延伸閱讀: