因此,要正确禁用 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.
aar
后文件和其他开发人员正在使用,是否使用即时运行没有区别。 考虑到所有这些以及您最初的问题。我可以看到,由于即时运行的工作方式,开发库可能会产生相反的效果。由于库可能会在应用程序中传播,任何更改都将强制进行新的完整构建,因此需要更长的时间。
我还可以看到在 ART 上禁用提前编译可以如何改变开发调试时间,但仅限于很多。
完成
我希望一切都清楚,您的问题的解决方案是:
vmSafeMode
在开发库时添加到您的“示例应用程序”,并且该库仍然可以在其他开发人员开发的其他应用程序上运行而不会出现问题。 关于android - 为面向 SDK 22+ 的 Android 库禁用 ART 运行时 (vmSafeMode) 和 dex2oat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37578997/