【问题标题】:Over 64k Methods Non-Multidex Debug Solution超过 64k 方法非 Multidex 调试解决方案
【发布时间】:2020-06-15 23:20:34
【问题描述】:

我遇到了标题中所述的问题,即我的应用程序达到了 64k 方法引用限制。搜索SO后,我意识到DEX文件的限制。我的问题仅与调试模式有关。在发布时,我只有一小部分方法,所以没有问题。

我希望能够在不打开multidex 的情况下调试我的应用程序。我看到有人建议仅在调试时启用multidex。不过,我已经读到启用 multidex 在 API21 之前的设备上进行调试时会出现问题。所以,我试图避免它。

我正在测试以下内容:

    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

我的想法是在发布时使用最小化调试。从长远来看,此修复程序会导致我出现任何问题吗?另外,是否可以使用不同的规则进行调试?

谢谢。

【问题讨论】:

  • "我读到启用 multidex 会在 API21 之前的设备上调试时出现问题" - 什么问题?这工作正常。
  • 感谢您的回复。我在另一个问题上读过。他们还提到multidex 会降低 API21 之前的设备速度。请问您是否在您的产品上使用了multidex?
  • 当然。 minifyEnabled 意味着每次构建都要等待很多分钟。发展起来似乎很糟糕。
  • 感谢您的信息。你给了我一些思考。现在,我正在考虑使用 multidex 进行调试。使用 multidex 进行调试会比使用minifyEnabled true 更快吗?

标签: java android


【解决方案1】:

My idea is to use minimification on debug as I do release.

是的,只需缩小您的应用程序。这将大大减少库方法的数量。这就是包括我在内的许多公司减少我们的 App Bundle 的大小和方法数量的原因。只需将 minifyEnabled 设置为 true,就像您在指定的 gradle 文件上设置的那样。

Do you use minifyEnabled true for debug, too, to bypass the 64k on debug builds?

当您将 minifyEnabled 设置为 true 时,您并没有绕过 64k,而是从构建中消除了所有不使用的方法。如果您正在对发布的调试版本进行一些最终测试,我只会将其设置为 true。这是因为如果在调试版本中始终将 minifyEnabled 值设置为 true,您的构建时间将会非常长

Will this fix cause me any issues in the long run?

不,如果您提供正确的 Proguard 规则,您的应用程序应该完全没问题。 Proguard 可能令人望而生畏,但随着 Android Studio 的新版本以及网上无数的 Proguard 文章,你应该会没事的。在应用 Proguard 时您绝对应该考虑的一些常见情况是:

  • 应用规则来保护基于反射的代码
  • 应用规则来保护您的 Kotlin 枚举器
  • 查看您的每个库并确保您访问他们的 github API 页面并确保您正在应用任何库特定规则。一些流行的示例库包括 Glide 和 Koin

Also, is it possible to use different rules for debug?

我假设您的意思是您是否可以应用不同的 Proguard 规则进行调试。是的,您可以看到您可以指定要从中提取规则的 proguard 规则文件,只需创建一个包含您要应用于调试模式的规则的新文件

【讨论】:

  • 很抱歉,但我想确保我理解正确。您是否也使用minifyEnabled true 进行调试以绕过调试版本的 64k?另外,我想了解 proguard 规则行。我知道proguard-rules.pro 是文件名,但我不明白“proguard-android.txt”部分。如果我要为调试创建单独的规则应该是我的行就像proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-debug-rules.pro'(例如)保持'proguard-android.txt'原样?谢谢。
  • 是的,正如您所指定的,您只需创建一个新的 proguard-debug-rules.pro 文件。然而,我这样做的方式是在我从调试和发布版本来回移动时,简单地在 Proguard 规则中注释掉/评论(例如打开/关闭混淆)。
  • 我已编辑帖子以回答您评论中的第一个问题
  • 感谢您提供的信息。关于调试minifyEnabled true 选项。我有点困惑。您说您仅将其用于最终阶段调试测试。你在日常调试中做什么?我的意思是,如果您达到 64k 限制,您将无法在您的设备上调试应用程序,除非您通过正常方式或使用 minifyEnabled true 或使用 multidex 选项减少方法。您可能没有进行日常调试,还是我遗漏了什么?
  • 这对我来说没关系,因为我正在构建的应用程序的最小 sdk 高于 21,其中默认启用了 multidex。随着您的应用程序变得更加复杂/模块化,由于您的模块,您有多个 minify 进程正在运行,因此 Minify(ing) 您的开发构建会使您的构建时间越来越长。然而,加快构建时间超出了这个问题的范围,网上有很多资源,例如stackoverflow.com/questions/30776671/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多