禁用针对SDK 22+的Android库的ART运行时(vmSafeMode)和dex2oat?

时间:2016-06-01 21:21:59

标签: android gradle art-runtime

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

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

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

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

任何人都有任何见解?

同样,

dexOptions {
    preDexLibraries false
}

结果没有差异。我仍然看到dex2oat在每个应用启动时花费了大量时间。

当然,所有这些选项在应用程序上都可以正常工作,但对库/ SDK开发完全没有。

1 个答案:

答案 0 :(得分:4)

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

即时运行

这是IDE(即Android Studio)的一项功能,它与运行API 15的设备完全兼容(不同数量)。它只会影响应用程序调试/开发过程中使用的代码。 / p>

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

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

  

仅在部署调试版本变体时使用Instant Run,使用Gradle版本2.0.0或更高版本的Android插件,并将 minSdkVersion设置为15

<强> ART

这是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为目标,那么它执行代码的运行时与它们兼容的运行时没有区别。

<强> vmSafeMode

在ART上,这只会禁用AOT编译器。从普通用户角度来看,这是从Play商店安装时显示&#34;安装&#34;。这是ART正在对应用程序进行多次预处理以准备由处理器执行的那一刻。这次也发生在USB调试期间,但如果禁用,则必须动态执行。

<强> preDexLibraries

这只告诉构建系统(gradle)预处理库。这对于构建apk的情况很有用,该库已经处理完毕。但是,如果您要构建一个库,那么每次更改代码时,都必须重新处理它。

解决您的问题

有了这些概念,我想指出以下评论的不连贯性:

  

虽然可以简单地禁用即时运行,但如果存在使用ART编译作为依赖项设置的库,则会导致问题。当问题不在其中时,你不能告诉别人不要使用即时运行。

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

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

此外,我可以看到禁用ART的提前编译如何能够改变开发时间的调试时间,但仅限于此。

完成

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

  • 如果Instant Run耗时太长,只需在AndroidStudio上禁用它即可。它不会影响任何其他开发人员。
  • 我不相信它会产生任何重大影响,但如果您坚持,可以将vmSafeMode添加到您的&#34;示例应用中#34;在开发库时,该库仍然可以在其他开发人员开发的其他应用程序上运行而没有问题。
  • preDexLibraries预计在开发库时影响不大