背景
在大项目合作中,我们会提供SDK给业务App使用,如果导致主Dex方法数超过65536,会导致打包不过,这个时候引入的方法数会成为一个衡量标准(考虑到应用稳定性等因素,MutiDex不会被优先考虑,比如手机淘宝)。
步骤
生成aar
1)使用命令assemble生成aar
./gradlew assemble
2)在${module}/build/outputs/aar目录下找到aar文件,如下:
生成dex
1)先解压aar文件,定位到对应的classes.jar
unzip telescopebase-debug.aar -d telescopebase-debug.aar.dir
cd telescopebase-debug.aar.dir
2)使用dx命令,这个在android sdk的build-tools文件夹中,例如我的在/Users/yuanchang/Library/Android/sdk/build-tools/23.0.3/dx
。命令如下:
dx --dex --verbose --no-strict --output=classes.jar.dex classes.jar
到这一步,得到目标dex文件classes.jar.dex
统计dex的方法数
1)下载dex-method-count来统计方法数,链接:
https://github.com/mihaip/dex-method-counts
2)使用dex-method-count来统计方法数
$ dex-method-counts --output-style=flat --max-depth=3 classes.jar.dex
Processing classes.jar.dex
Read in 1792 method IDs.
15 android.app
15 android.content
4 android.content.res
1 android.database
3 android.graphics
1 android.opengl
82 android.os
2 android.text
5 android.util
57 android.view
5 android.widget
38 com.ali.telescope.api
6 com.ali.telescope.base.KV
......
35 com.ali.telescope.internal.report
4 com.ali.telescope.spi
65 com.ali.telescope.util
2 com.ali.telescopesdk
4 dalvik.system
53 java.io
135 java.lang
2 java.lang.ref
23 java.lang.reflect
16 java.net
2 java.nio.charset
4 java.security
2 java.text
71 java.util
5 java.util.concurrent
6 java.util.zip
68 libcore.io
20 org.json
2 reflect.android.app
2 reflect.android.os
37 reflecthelper
Overall method count: 1792
可以看到这个模块对应的方法数是1792个,--output-style=flat 表示使用扁平输出风格(对应的是树状) --max-depth=3 表示最大层次是3层包名深度
附录
除了上面提到的dex-method-count之外,还可以通过一个gradle插件来实现项目方法数统计(统计的是整包的,包含android库,support-v4,v7等等),好处是有一个图形界面显示,如下:
参考链接:https://github.com/KeepSafe/dexcount-gradle-plugin/blob/master/README.md