【问题标题】:Showing dex method count by package按包显示 dex 方法计数
【发布时间】:2013-06-10 06:04:47
【问题描述】:

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

【问题讨论】:

  • 哇。抱歉,我不知道答案,但我很好奇限制是什么?你在 DEX 编译器运行的时候打到了吗?
  • 64k :) 65k 将是一个相当奇怪的限制。
  • 您是如何获得方法总数的?
  • 它实际上是 >64,000,但 64k 引用只是名称:“在计算机科学的上下文中,术语 Kilo, K 表示 1024(或 2^10)。因为 65,536 等于64 X 1024,这个限制被称为'64K参考限制'”所以你是对的,但你一定知道他也是:)

标签: android dex dex-limit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 嗨 Nicola ,有没有机会查看我的包中使用的方法总数?我可以看到每一个依赖方法的计数,但我看不到我的包的任何总数。你的插件很棒,伙计们 +1
      • 嗨@Sniper,该功能还没有,但我们可能会在未来实现它。感谢您的反馈顺便说一句:)
      • 链接已失效。
      【解决方案4】:

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

      【讨论】:

      • 你太容易了!
      【解决方案5】:

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

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

      【讨论】:

      • 像魅力一样工作!节省了我几个小时!非常感谢!
      • 是的,我的解决方案更多的是快速和肮脏的类型。尽管我可能不得不与您争论它的准确性:)。但不能争论速度。
      • @nadavfima 使用说明 - 1) 从 GitHub 下载源代码:github.com/mihaip/dex-method-counts。 2) 提取目录中的文件。 3)打开终端窗口并导航到该目录。 4) 运行米海READMEgithub.com/mihaip/dex-method-counts/blob/master/README.md中给出的相关命令
      【解决方案6】:

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

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

      【讨论】:

      • ...如果你和我一样还没有 smali 工具,这很简单:转到code.google.com/p/smali,找到二进制下载(目前是 bitbucket 链接),下载smali 和 baksmali JAR,将它们重命名为 smali.jar 和 baksmali.jar,下载包装脚本,将它们修改为可执行文件,差不多就完成了。
      • 您也可以使用AS中的methodscount插件查看build.gradle文件中特定依赖的方法计数。或者使用来自 mihaip (github.com/mihaip/dex-method-counts) 的 Dexcount 查看每个构建的方法数量。希望有人觉得这很有用。
      • Beemo - 应该作为答案发布,而不是对另一个答案的评论:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多