我正在开发针对dex方法计数限制的Android应用程序。是否有一种简单的方法可以显示方法计数按包分组? 我可以得到总方法数,但我的应用程序有多个组件,我试图找出哪个组件是最大的贡献者。
答案 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/。它显示了方法计数和其他整洁的信息
我们使用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以图形方式查看每个包的方法计数。