统计Android apk和jar的方法数

今天遇到了统计Android apk和jar包种方法数的问题,然后搜索到了github上一个很普及的方法dex-method-counts,下载之后使用如下方法

1. 到下载后的目录, 执行  ant jar(提前配置ant环境,可移步Mac Ant安装) 

2. 然后就可以执行 ./dex-method-counts your_app.apk 就出来结果了。



但是想通过这个方法来统计jar包种的方法数就会报错  

Magic number is wrong -- are you sure this is a DEX file?

不知道如何解决这个问题,于是另寻它法

今天弄了两个小工具,分别用于统计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 ~ /路径/jarmethod .sh jarmethod

如果表示没有权限,可以在ln这行最前面添加sudo ,然后输入密码即可 

OK ,这个时候可以到任何目录去使用该工具了,如:

# 直接在工具后面指定jar包地址即可
jarmethod ~ /路径/browser-sdk .jar
这里我遇到了两个问题 

1. r文件: command not found

 可以直接开打jarmethod.sh方法,然后第一行会出现一个“r文件”的字段,不知道怎么出来的,删掉即可。

 2. dx: command not found

 这个是dx指令环境的问题,如果配置过了adb环境和Android环境就比较清楚了,在bash_profile中再添加dx的环境变量,一般是在build-tools里面的

所以多添加一条$PATH即可

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 ~ /路径/your_app .apk

apk在打包的时候,是可以进行混淆的(proguard),而这个混淆的工作,是在生成dex包后进行的!所以,这个65536的限制,是对混淆之前的dex包而言的,值得注意!


你可能感兴趣的:(android,jar)