重写调试版本的android:vmSafeMode属性

重写调试版本的android:vmSafeMode属性,android,android-gradle-plugin,android-runtime,Android,Android Gradle Plugin,Android Runtime,在尝试优化构建和部署速度以调试应用程序时,我发现在安装过程中执行/system/bin/dex2oat花费了大量时间。这是最新的 我发现,在瞄准API 22时,您现在可以停止ART AOT编译: <application ... android:vmSafeMode="true"> </application> 我看到部署速度有了明显的提高,但是我担心进行此更改可能会产生副作用。它一定会对运行时性能造成很小的影响,但是启用android:vmSaf

在尝试优化构建和部署速度以调试应用程序时,我发现在安装过程中执行
/system/bin/dex2oat
花费了大量时间。这是最新的

我发现,在瞄准API 22时,您现在可以停止ART AOT编译:

<application
    ...
    android:vmSafeMode="true">
 </application>

我看到部署速度有了明显的提高,但是我担心进行此更改可能会产生副作用。它一定会对运行时性能造成很小的影响,但是启用
android:vmSafeMode
选项是否还有其他后果


对于调试版本,是否可以在gradle生成文件中重写此属性?还是创建特定于调试的清单文件是唯一的解决方案?

仅为调试构建启用
android:vmSafeMode
的最佳方法是使用调试清单来补充主AndroidManifest.xml的内容

要添加此内容,请创建一个新文件
../app/src/debug/AndroidManifest.xml
,并添加以下xml:

<manifest
 xmlns:android="http://schemas.android.com/apk/res/android"> 
 <application android:vmSafeMode="true" />
</manifest>
还可以使用aapt工具检查APK是否启用了vmSafeMode:

aapt list -a myapkfile.apk
...
A: android:vmSafeMode(0x010102b8)=(type 0x12)0xffffffff
...
我没有看到任何关于删除提前编译导致的错误的报告。但是,您的应用程序可能会暴露由于性能降低而在进行此更改之前不可见的问题


非常密集的处理可能会慢很多倍。如果你的应用程序属于这一类,最好不要删除提前编译。

我正在为子孙后代恢复这一功能,因为我知道一种更干净的方法

您可以在gradle中使用清单占位符,以避免复制整个清单文件

在build.gradle中添加以下内容:

default {
        manifestPlaceholders = [vmSafeModeEnabled: "true"]
}
buildTypes{
    release {
        manifestPlaceholders = [vmSafeModeEnabled: "false"]
    }
}
然后在清单中使用这个

android:vmSafeMode="${vmSafeModeEnabled}"
当gradle构建运行时,它将根据构建类型应用适当的值

android:vmSafeMode="${vmSafeModeEnabled}"