转自:http://www.baidufe.com/item/5891ec6f737268c7f675.html
【工具】统计jar包和apk中的java方法数进入全屏

这两天被Unable to excute DX的问题缠身,工程太大,方法数量超过65536限制,开发正常build都是you有问题的!纳闷儿为什么Google要搞这个64K方法数的限制?一般大点儿的工程,引入的jar包不少的话,都会超过这个限制。
今天弄了两个小工具,分别用于统计jar包和apk中java方法的数量,工具名称分别为:jarmethod.sh 和 apkmethod.sh,两个工具在Linux环境下跑,分享给大家:
1、jarmethod.sh工具,用于统计jar包中的方法数,脚本内容如下,将其保存为jarmethod.sh即可:
#!
/bin/sh #
获得输入的jar文件 JAR_FILE=$1; #
这里直接使用dx命令,是因为我已经提前配置好了环境变量,dx目录位于:
#
计算jar包中的方法数 METHOD_COUNT=` cat temp.dex
| head -c
92 | tail -c
4 | hexdump -e '1/4
"%d\n"' ` #
显示结果 echo $METHOD_COUNT #
删除临时文件temp.dex rm -f
temp.dex |
为了使用起来更方便,建议将其添加一个软链到bin目录,比如可以这样:
#
先更改下权限 chmod 0755
jarmethod.sh #
软连到bin目录,这样可以在任何目录直接执行该工具 cd /usr/local/bin ln -s
~ /Document/Tool/jarmethod .sh
jarmethod |
OK ,这个时候可以到任何目录去使用该工具了,如:
#
直接在工具后面指定jar包地址即可 jarmethod
~ /tieba/libs/browser-sdk .jar |
如上命令执行后,将会输出方法数:4245
2、apkmethod.sh工具,用于统计apk包中的java方法数,脚本内容如下,将其保存为apkmethod.sh即可:
#!
/bin/sh #
获得完整apk路径 APK_PATH=$1 #
创建一个临时目录,来解压这个apk文件 rm -rf
apk_temp mkdir apk_temp cp $APK_PATH
apk_temp/ cd apk_temp #
获得apk的名称 APK_NAME= "$(basename
*.apk)" #
重命名为zip mv $APK_NAME
$APK_NAME.zip #
解压apk,得到classes.dex包 unzip
-x $APK_NAME.zip > /dev/null #
计算dex中的method数量 METHOD_COUNT=` cat classes.dex
| head -c
92 | tail -c
4 | hexdump -e '1/4
"%d\n"' ` #
输出method数量 echo $METHOD_COUNT #
删除无用目录 cd ..
&& rm -rf
apk_temp |
使用方法同jarmethod,软链方式略,使用方式如下:
#
直接在工具后面指定apk地址即可 apkmethod
~ /tieba/tieba .apk |
如上命令执行后,会输出apk包中的方法数:58370
apk在打包的时候,是可以进行混淆的(proguard),而这个混淆的工作,是在生成dex包后进行的!所以,这个65536的限制,是对混淆之前的dex包而言的,值得注意!