Created
November 27, 2015 09:12
-
-
Save Jhenxu/dbbe5cfcb45a46f8a0a0 to your computer and use it in GitHub Desktop.
apk和jar方法数脚本
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
这两天被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包而言的,值得注意! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment