0

因此,要正确禁用 ART 运行时,请将android:vmSafeMode="true"添加到应用程序的清单标记中。

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

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

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

有人有任何见解吗?

相似地,

dexOptions {
    preDexLibraries false
}

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

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

4

1 回答 1

4

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

即时运行

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

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

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

仅当您部署调试构建变体、使用 Android Plugin for Gradle 版本 2.0.0 或更高版本并将minSdkVersion 设置为 15时才支持 Instant Run

艺术

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

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

ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此为 Dalvik 开发的应用程序在使用 ART 运行时应该可以工作

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

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

虚拟机安全模式

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

preDex 库

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

对你的问题

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

虽然可以简单地禁用即时运行,但如果有一个库将 ART 编译设置为依赖项,则会导致问题。当问题本身并不存在时,您不能告诉人们根本不使用即时运行。

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

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

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

敲定

我希望一切都清楚,您的问题的解决方案是:

  • 如果 Instant Run 耗时过长,只需在您的 AndroidStudio 上禁用它即可。它不会影响任何其他开发人员。
  • 我不相信这会有什么大的不同,但如果你坚持,你可以vmSafeMode在开发库时添加到你的“示例应用程序”中,并且该库仍然可以在其他开发人员开发的其他应用程序上运行而不会出现问题。
  • preDexLibraries 预计在开发库时影响不大
于 2016-06-06T19:19:49.127 回答