显示dex方法按包计数

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

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

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

这个稍微修改过的版本是相似的,除了它只针对特定目录/包中的类,不包括任何subdirs /子包

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

我已经编写了一个dex-method-counts工具,输出per-package方法的次数比JesusFreke的回答中提到的基于smali的工具更快,更准确。 它可以从https://github.com/mihaip/dex-method-counts进行安装。;

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

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

在这里输入图像说明

在这个引擎下,我们使用gradlew获取依赖和Android SDK工具dx来计算dex信息。 我们将该过程recursion地应用于库及其依赖项。 我们还坚持已经计算的库的结果,以加快后续请求的过程。

如果你使用的是Android Studio或者IntelliJ,你可以直接安装这个插件来获得所有的信息(插件也使用这个服务)。

重复一个老问题,我已经写了一个Gradle插件,它会在每个构build中报告APK中的方法数量。 它使用与AOSP项目使用的相同的DEX分析代码。 你可以在https://github.com/KeepSafe/dexcount-gradle-pluginfind它。;

我赞赏上述所有开发人员的工作,并且我总是很高兴能有如此出色的社区,但是由于Android Studio 2.2 Google团队发布了APK分析器 – > https://developer.android.com/studio/build/apk-analyzer。; HTML

现在我们都已经build立了工具来分析出方法数量,资源大小,甚至可以把两个.apk文件相互比较。 最后,我们都有这个工具。安卓开发将变得更加容易和简单。

顺便说一句:要find你有多less方法,打开Android Studio中的.apk文件(仅支持2.2+),然后单击classes.dex文件。 之后,您将能够看到所有图书馆和项目中的方法。

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