34

我正在开发违反 dex 方法计数限制的 android 应用程序。有没有一种简单的方法来显示按包分组的方法计数?我可以获得总方法计数,但我的应用程序有多个组件,我试图找出哪个组件对此贡献最大。

4

6 回答 6

45

我编写了一个dex-method-counts工具,它比 JesusFreke 的答案中引用的基于 smali 的工具更快、更准确地输出每个包的方法计数。它可以从https://github.com/mihaip/dex-method-counts安装。

[1] 该脚本将 .dex 反汇编并按包重新组装,但这意味着被多个包引用的方法被计算两次

于 2014-05-18T22:16:25.480 回答
22

这将使您了解每个包层次结构对方法计数的贡献程度。结果包括该目录/包中的所有类和所有子目录/包。

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" \;
于 2013-06-13T23:05:24.970 回答
17

我和一位同事上个月发布了一项可以帮助您实现目标的服务:http ://www.methodscount.com/ 。它显示方法计数和其他简洁信息

在此处输入图像描述

在后台,我们使用gradlew获取依赖项和Android SDK 工具dx来计算 dex 信息。我们将该过程递归地应用于库及其依赖项。我们还保留已计算库的结果,以便加快后续请求的处理过程。

如果您使用 Android Studio 或 IntelliJ,您只需安装插件即可将所有信息作为方便的提示(插件也使用该服务)。

于 2016-01-28T16:17:10.560 回答
13

针对一个老问题,我编写了一个 Gradle 插件,它会在每次构建时报告 APK 中的方法数量。它使用与 AOSP 项目相同的 DEX 解析代码。你可以在https://github.com/KeepSafe/dexcount-gradle-plugin找到它。

于 2015-06-23T21:50:48.353 回答
8

我感谢上述所有开发人员的工作,我总是很高兴拥有如此出色的社区,但自从 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 文件。之后,您将能够看到所有库和项目中的方法计数。

于 2016-12-08T11:07:13.920 回答
1

您也可以尝试使用https://github.com/KeepSafe/dexcount-gradle-plugin,它允许您通过 html 以图形方式查看每个包的方法计数。

于 2017-05-14T12:45:15.617 回答