我正在开发违反 dex 方法计数限制的 android 应用程序。有没有一种简单的方法来显示按包分组的方法计数?我可以获得总方法计数,但我的应用程序有多个组件,我试图找出哪个组件对此贡献最大。
6 回答
我编写了一个dex-method-counts
工具,它比 JesusFreke 的答案中引用的基于 smali 的工具更快、更准确地输出每个包的方法计数。它可以从https://github.com/mihaip/dex-method-counts安装。
[1] 该脚本将 .dex 反汇编并按包重新组装,但这意味着被多个包引用的方法被计算两次
这将使您了解每个包层次结构对方法计数的贡献程度。结果包括该目录/包中的所有类和所有子目录/包。
baksmali blah.apk -o out
cd out
find * -type d -print -exec sh -c "smali {} -o {}/classes.dex && sh -c \"dexdump -f {}/classes.dex | grep method_ids_size\"" \;
这个稍作修改的版本是类似的,只是它仅适用于该特定目录/包中的类,不包括任何子目录/子包
baksmali blah.apk -o out
cd out
find * -type d -print0 | xargs -0 -I{} sh -c "echo {} && find {} -maxdepth 1 -name \"*.smali\" -print0 | xargs -r -0 smali -o {}/classes.dex"
find -name "*.dex" -print -exec sh -c "dexdump -f {} | grep method_ids_size" \;
我和一位同事上个月发布了一项可以帮助您实现目标的服务:http ://www.methodscount.com/ 。它显示方法计数和其他简洁信息
在后台,我们使用gradlew
获取依赖项和Android SDK 工具dx
来计算 dex 信息。我们将该过程递归地应用于库及其依赖项。我们还保留已计算库的结果,以便加快后续请求的处理过程。
如果您使用 Android Studio 或 IntelliJ,您只需安装插件即可将所有信息作为方便的提示(插件也使用该服务)。
针对一个老问题,我编写了一个 Gradle 插件,它会在每次构建时报告 APK 中的方法数量。它使用与 AOSP 项目相同的 DEX 解析代码。你可以在https://github.com/KeepSafe/dexcount-gradle-plugin找到它。
我感谢上述所有开发人员的工作,我总是很高兴拥有如此出色的社区,但自从 Android Studio 2.2 以来,Google 团队已经发布了 APK Analyzer -> https://developer.android.com/studio/build/apk-analyzer。 html
现在我们都有内置工具来分析方法计数、我们的资源大小,甚至我们可以相互比较两个 .apk 文件。最后,我们都内置了这个工具。Android 开发变得越来越容易。
顺便说一句:要查找您有多少方法,请在 Android Studio 中打开您的 .apk 文件(仅支持 2.2+)并单击 classes.dex 文件。之后,您将能够看到所有库和项目中的方法计数。
您也可以尝试使用https://github.com/KeepSafe/dexcount-gradle-plugin,它允许您通过 html 以图形方式查看每个包的方法计数。