按包显示dex方法计数

时间:2013-06-13 18:09:32

标签: android dex dex-limit

我正在开发针对dex方法计数限制的Android应用程序。是否有一种简单的方法可以显示方法计数按包分组? 我可以得到总方法数,但我的应用程序有多个组件,我试图找出哪个组件是最大的贡献者。

6 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:21)

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

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" \;

答案 2 :(得分:17)

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

enter image description here

我们使用gradlew来获取依赖关系,使用Android SDK tool dx来计算dex信息。我们以递归方式将该过程应用于库及其依赖项。 我们还会保留已经计算过的库的结果,以便加快后续请求的过程。

如果你使用的是Android Studio或IntelliJ,你可以install the plugin将所有信息作为一个方便的提示(该插件也使用该服务)。

答案 3 :(得分:13)

回答一个老问题,我写了一个Gradle插件,它将在每个版本中报告APK中的方法数量。它使用与AOSP项目使用的相同的DEX解析代码。您可以在https://github.com/KeepSafe/dexcount-gradle-plugin找到它。

答案 4 :(得分:8)

我赞赏上述所有开发人员的工作,我总是乐于拥有如此优秀的社区,但自从Android工作室2.2 Google团队发布了APK分析器 - > https://developer.android.com/studio/build/apk-analyzer.html

现在我们都有内置工具来分析方法计数,我们的资源大小,甚至我们可以相互比较两个.apk文件。 最后,我们都内置了这个工具.Android开发变得更容易,更容易。

BTW:要查找您拥有的方法,请在Android Studio中打开.apk文件(仅支持2.2+),然后单击classes.dex文件。之后,您将能够在所有库和项目中看到方法计数。

答案 5 :(得分:1)

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