有没有办法获取jar文件中使用的数字方法的计数

2022-09-01 08:01:47

我可以计算jar文件中使用的所有方法吗?我的APK使用某些外部JARS,确切地说,有许多类大约一百个。

我使用过像dex2jar JAD这样的反编译器和其他反编译器,但它们似乎都只在特定的类文件中显示方法。

有没有办法得到一个总数?


答案 1

您可以将 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"'

请记住,这是引用的唯一方法的数量,而不是方法引用的数量。换句话说,如果在 dex 文件中引用了两次特定方法,则该方法在标头的计数中只会被计数一次。当您将此jar导入apk时,两者之间通用的方法引用将被重复数据删除,因此最终合并的apk的总方法引用计数将为<=两者的总和。


答案 2

这个 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
...

与 gradle 命令结合使用

.\gradlew app:dependencies

它打印出依赖关系树,您将获得哪些依赖关系需要多少种方法的良好概述。


推荐