简评:65k 限制确实是个令人不爽的事情,这里就让你知道是哪些库用了大量的方法,并该
现在的应用越来越大,方法数经常达到 65k 限制。这里就介绍下如何可视化 library 方法数和减少方法数的方法。
可视化方法数
可视化各 library 方法数的简单办法就是使用 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'
在项目中运行 ./gradlew assembleDebug 就会在 console 中输出:
并会在 build/outputs/dexcount/debugChart 中生成一个可交互的图形报告:
减少方法数
在我们选用 library 之前,有必要考虑其方法数,原因有二:
- 更换现有程序中已使用的库非常有挑战性,所以最好之前就想好。
- 很多人引入了一个很大的 library,但只是为了做很简单的事(Strings.isNullOrEmpty()),通常你都用不到 library 的所有方法。
这里可以用 methodscount.com 来查询常用库的方法数。
对于一个功能,通常都会有好几个库能完成这一个功能。这里以图片加载为例:
这些库都有各自的优缺点,所以清楚了解自己的需求,并选择库很有必要。
那对于已经使用的库,有没有办法来减少方法数呢?
我们可以用 Proguard 来剔除库中未使用的部分。这里我们用 Guava 来举例,首先我们需要知道项目实际用到了哪些部分,在 src 文件夹下运行下面的命令:
grep -roh . -e 'com.google.common.*' | sort | uniq
也就是根据库的前缀来查找所有的 import 语句(对于 Guava 来说就是 com.google.common)。
之后,创建一个 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 *;
}
...
执行一个 Gradle 脚本,就可以生成一个缩小版的库,再将其复制到项目的 libs 文件夹中进行使用。
上面的技巧一定要谨慎使用,因为是我们手动执行的,所以更容易出错,一定要多多测试。
详细用法可以进一步参考作者的项目
原文:EFFICIENTLY REDUCING YOUR METHOD COUNT
欢迎关注知乎专栏「极光日报」,每天为 Makers 导读三篇优质英文文章。
延伸阅读: