android - 为面向 SDK 22+ 的 Android 库禁用 ART 运行时 (vmSafeMode) 和 dex2oat?

标签 android gradle art-runtime

因此,要正确禁用 ART 运行时,请添加 android:vmSafeMode="true"到您的应用程序的 list 标签。

我个人遇到的问题是我开发了一个 Android 库,因此我没有应用程序标签。

这意味着当使用即时运行(dex2oat 必须运行所有内容)或使用该库的人正在使用即时运行时,我的调试非常慢。

我尝试使用 manifestPlaceholders = [vmSafeModeEnabled: "true"]在我的 build.gradle 中,但这没有效果。

有人有任何见解吗?

相似地,

dexOptions {
    preDexLibraries false
}

产生的结果没有差异。我仍然看到 dex2oat 在每次应用启动时都花​​费大量时间。

当然,所有这些选项在应用程序上都可以正常工作,但对于库/SDK 开发则根本不行。

最佳答案

正如我在评论中提到的,我相信你混合了一些概念,所以我会花时间分别解释它们。

即时运行

这是 IDE(即 Android Studio)的一个功能,并且它一直兼容(以不同的数量)回到运行 API 15 的设备。它只影响在应用程序的调试/开发期间使用的代码。

它通过强制应用程序的调试版本为 multidex 来工作。并从新的 dex 文件通过 USB 动态加载代码更改。此功能永远不会更改最终编译的代码(无论库或应用程序)。

见这里:https://developer.android.com/studio/run/index.html#instant-run

Instant Run is supported only when you deploy the debug build variant, use Android Plugin for Gradle version 2.0.0 or higher, and set minSdkVersion to 15



艺术

这是 Android 运行的当前运行时。那是从 APK 读取字节码并将其转换为处理器指令的核心系统。

见这里:https://source.android.com/devices/tech/dalvik/

ART and Dalvik are compatible runtimes running Dex bytecode, so apps developed for Dalvik should work when running with ART



所以有一些边缘情况的差异,但如果你检查这个链接( https://developer.android.com/guide/practices/verifying-apps-art.html )你会发现大部分都是在处理 native 代码,并且不会对仅 java 的库产生影响。

这意味着只要代码以正确的 API 为目标,它执行代码的运行时没有区别,因为它们是兼容的运行时。

vmSafeMode

在 ART 上,这只会禁用 AOT 编译器。从普通用户的角度来看,这是从 Play 商店安装期间显示“正在安装”的时间。那是 ART 对应用程序进行多项预处理以准备由处理器执行的时刻。这个时间也发生在 USB 调试期间,但如果禁用,它将必须即时执行。

preDex 库

这只会告诉构建系统(gradle)对库进行预处理。这在要构建 apk 的情况下很有帮助,该库已被处理。但是,如果您正在构建一个库,则每次更改其代码时,无论如何都必须对其进行重新处理。

您的问题

有了这些概念,我想指出以下评论中的不一致之处:

While one could simply disable instant run, if there is a library that is setup with ART compilation as a dependency, it causes issues. You can't tell people to simply not use instant run when the issue is not inherently within it.


  • 库永远不会使用运行时作为依赖项进行编译。它可能取决于 API 级别(它可以调用哪些方法)或某些设备功能(需要 GPS 或加速器)。运行时(ART 和 Dalvik)是兼容的,并且会以相同的结果执行相同的代码(ART 更高效/更快)。
  • 此外,如前所述,即时运行是您开发/调试期间 Android Studio 的一项功能。将库打包到 aar 后文件和其他开发人员正在使用,是否使用即时运行没有区别。

  • 考虑到所有这些以及您最初的问题。我可以看到,由于即时运行的工作方式,开发库可能会产生相反的效果。由于库可能会在应用程序中传播,任何更改都将强制进行新的完整构建,因此需要更长的时间。

    我还可以看到在 ART 上禁用提前编译可以如何改变开发调试时间,但仅限于很多。

    完成

    我希望一切都清楚,您的问题的解决方案是:
  • 如果 Instant Run 耗时过长,只需在您的 AndroidStudio 上禁用它即可。它不会影响任何其他开发人员。
  • 我不相信它会有什么大的不同,但如果你坚持,你可以添加vmSafeMode在开发库时添加到您的“示例应用程序”,并且该库仍然可以在其他开发人员开发的其他应用程序上运行而不会出现问题。
  • preDexLibraries 预计在开发库时影响不大
  • 关于android - 为面向 SDK 22+ 的 Android 库禁用 ART 运行时 (vmSafeMode) 和 dex2oat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37578997/

    相关文章:

    gradle - Gradle依赖性仅对注释处理器可见

    android - Android ART 是否像 Dalvik 一样支持运行时动态类加载?

    android - android 在启动应用程序时执行什么过程以及它在运行时如何与 R 类交互?

    android - 无法在 Android 模拟器上使用 ART

    java - Android keystore 签名问题

    gradle - Gradle 。检测依赖问题

    android - 屏幕中央的TextView

    java - Gradle 构建错误

    android - 为什么不鼓励使用 Resources.getIdentifier()

    java - 生成 JSON 字符串