【工具】统计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目录位于: # $ANDROID_HOME/sdk/build-tools/android-4.3.1/dx dx --dex --verbose --no-strict --output=temp.dex $JAR_FILE > /dev/null # 计算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包而言的,值得注意!