【问题标题】:Check how many methods you have in Android Studio检查您在 Android Studio 中有多少方法
【发布时间】:2015-03-02 05:30:11
【问题描述】:

看起来我在调情 65K 的 dex 限制, 如果我写了一些新的方法我有一个 dex 错误,如果我删除了一些旧的东西,它就消失了。

有没有办法检查您目前在 Android Studio 中使用了多少方法?

【问题讨论】:

  • 您可以查看项目中使用的每个依赖项的方法计数一个android studio插件,请查看答案stackoverflow.com/questions/30648172/…
  • 那么有没有办法计算出依赖项包含的方法数量?

标签: android-studio dex


【解决方案1】:

Android Studio 提供了一种内置方式来执行此操作。切换到“项目”视图,导航到 /app/build/outputs/apk/flavor/type apk 的路径。双击APK。这将在编辑器中启动 apk,您可以在窗口的上半部分看到各种库及其相关大小。在此窗口中向下滚动,直到找到 classes.dex(或者如果您有多个,则为 classes2.dex 等)。单击此按钮,您将在窗口底部看到按包列出的方法引用。如果您使用多种风格或构建类型,您还可以使用此视图来分析构造的 Android 清单。更多信息可以找到on the android developer site

【讨论】:

  • 那么,哪些属于限制范围?
【解决方案2】:

我可以找到一种脆弱的方法来做到这一点,这也许总比没有好。将以下内容复制并粘贴到模块的 build.gradle 文件的底部,将 ANDROID_HOME 替换为您的 Android SDK 安装路径,将 BUILD_TOOLS_VERSION 替换为 buildToolsVersion 规范中指定的相同版本你的android 块:

buildscript {
    dependencies {
        classpath files("/Users/sbarta/sdk/build-tools/21.0.2/lib/dx.jar")
    }
}

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        variant.assemble.doLast {
            // Show the dex count after the assemble task is finished
            showDexCount(
                    [filename: output.outputFile],
            )
        }
    }
}

def showDexCount(Map... files) {
    def maxReferences = (int) Math.pow(2, 16);
    def buffer = 5000 // that's for safety, because you can't burn maxReferences

    println "\n\n***********************************************************************************"
    println "* DEX COUNTS                                                                      *"
    println "***********************************************************************************"
    files.each {
        def dex = new com.android.dex.Dex(it.filename)
        def count = dex.tableOfContents.methodIds.size
        if ((maxReferences - count - buffer) >= 0)
            println String.format('* %1$5d                 (there are still %2$5d references to burn...)             *',
                    count, maxReferences - count - buffer)
        else
            println String.format('* %1$5d  !!!WARNING!!!  Too many references, please decrease by %2$4d!             *',
                    count, -(maxReferences - count - buffer))
    }
    println "***********************************************************************************\n"
}

这会加载 dex 代码本身来评估 dex 文件并计算方法的数量;它将其工作添加到构建脚本中assemble 任务的末尾,因此您将在命令行构建中看到它,或者如果您实际从 Android Studio 运行它(它将显示在 Gradle 控制台中)。

我尝试使其更具弹性并使用 ANDROID_HOME 环境变量,而不是要求您对路径进行硬编码,但是在从 Android Studio 构建时使用环境变量是有问题的(尽管它可以从命令行工作)。同样,我尝试让它从构建脚本中引用它的其他位置拉入构建工具版本,并且我还尝试定义一个全局常量,但无法使范围和执行顺序起作用。如果有人可以对此进行改进,请评论或编辑答案。

这是改编自 Carlos Sobrinho 所写的内容;我找不到原始的可通过网络访问的参考。

【讨论】:

  • 有用,谢谢。必须在本地 mvn 安装 dx.jar 文件才能让 buildscript 类路径识别它。另请注意,如果您在库中需要此功能,请将 android.applicationVariants 更改为 android.testVariants,以便它可以在您的测试 apk 的 dex 上运行。
  • 我正在尝试使用它,但它显示“无法解析 com.android.dex.Dex 类”......有人可以帮助我或指导我吗?提前致谢。
  • plus.google.com/+JahirFiquitivaJDev/posts/8VXJzyLUiYs 我在这里找到了 Jahir 主题
【解决方案3】:

我使用了两种不同的工具来查找方法的数量:

1) 计算方法并显示不同包中方法数量的简单工具: https://github.com/mihaip/dex-method-counts

它将向您显示如下简单数据:

Read in 65490 method IDs.
<root>: 65490
    : 3
    android: 6837
        accessibilityservice: 6
        bluetooth: 2
        content: 248
            pm: 22
            res: 45
        ...
    com: 53881
        adjust: 283
            sdk: 283
        codebutler: 65
            android_websockets: 65
        ...
    Overall method count: 65490

2) 这是另一个更易于使用的工具,您必须在项目中添加一个依赖项,它会向您显示每次构建的方法。当你不需要它时,你可以简单地注释这个依赖行: https://github.com/KeepSafe/dexcount-gradle-plugin

methods  fields   package/class name
5037     1103     android.support.v4
29       1        android.support.v4.accessibilityservice
57       16       android.support.v4.animation

【讨论】:

    【解决方案4】:

    https://developer.android.com/studio/build/apk-analyzer.html#view_dex_files

    APK Analyzer 的 DEX 文件查看器可让您立即访问应用中 DEX 文件中的基础信息。查看器中提供了类、包、总引用和声明计数,可以帮助决定是否使用多 DEX 或如何删除依赖项以低于 64k DEX 限制。

    图 4 描绘了一个接近 64k DEX 限制的中型应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多