有没有办法计算jar文件中使用的数字方法的数量

fre*_*ky9 33 java android dex

我可以计算jar文件中使用的所有方法.我的APK使用某些外部JARS,并且有大约100个类是精确的.

我使用dex2jar JAD等反编译器等等,但它们似乎只在特定的类文件中显示方法.

有没有办法可以获得总数?

Jes*_*eke 81

您可以将jar转换为dex文件,然后从标头中提取方法引用的数量.它存储为无符号小端整数,偏移量为88(0x58).

dx --dex --output=temp.dex orig.jar
cat temp.dex | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"'
Run Code Online (Sandbox Code Playgroud)

请记住,这是引用的唯一方法的数量,而不是方法引用的数量.换句话说,如果在dex文件中引用了两次特定方法,则它只会在标头中的计数中计数一次.当你将这个jar导入你的apk时,两者之间常见的方法引用是重复数据删除的,所以最终合并的apk的总方法引用数将是<=两者的总和.

  • 这是我的答案:android-sdk-macosx/build-tools/17.0.0/dx (2认同)
  • 不需要猫/头/尾:`hexdump -s 88 -n 4 -e'1/4"%d \n"'temp.dex` (2认同)

pat*_*ckf 11

此gradle插件https://github.com/KeepSafe/dexcount-gradle-plugin将显示汇编后的总方法计数,并生成包含每个包的方法计数的报告.排序之后看起来像这样:

30145    com
27704    org
20950    android
17140    org.spongycastle
16605    android.support
9760     com.google
8930     com.fasterxml.jackson
8930     com.fasterxml
8633     android.support.v4
7020     com.fasterxml.jackson.databind
6426     android.support.v7
5311     com.google.protobuf
4705     org.spongycastle.crypto
...
Run Code Online (Sandbox Code Playgroud)

与gradle命令结合使用

.\gradlew app:dependencies
Run Code Online (Sandbox Code Playgroud)

打印出依赖关系树,您将很好地了解哪个依赖关系需要多少方法.