针对调试版本重写android:vmSafeMode属性

8
在优化构建和部署速度以调试应用程序时,我发现安装期间执行大量时间的是/system/bin/dex2oat。这是ART ahead of time compiler
我发现当针对API 22时,您现在可以停止ART AOT编译:
<application
    ...
    android:vmSafeMode="true">
 </application>

我看到了明显的部署速度提升,但我对这种改变可能产生的副作用有所担忧。它必须会导致一定的运行时性能损失,但启用android:vmSafeMode选项是否还会有其他后果?
在gradle构建文件中,是否可以覆盖此属性以进行调试版本?或者创建一个特定于调试的清单文件是唯一的解决方案吗?
2个回答

8

仅为调试生成启用 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>

在添加了此调试清单并安装应用程序之后,您应该检查设备的日志输出,以确保在执行 dex2oat 进程时正确应用了 vmSafeMode 标志。查找参数 --compiler-filter=interpret-only。 此输出还报告了执行 dex2oat 进程所需的时间,因此您可以在更改前后进行比较。
I/dex2oat﹕ /system/bin/dex2oat --zip-fd=6 --zip-location=/data/app/com.testing.sample.myapp-1/base.apk --oat-fd=7 --oat-location=/data/dalvik-cache/arm/data@app@com.testing.sample.myapp-1@base.apk@classes.dex --instruction-set=arm --instruction-set-features=div --runtime-arg -Xms64m --runtime-arg -Xmx512m --compiler-filter=interpret-only --swap-fd=8
I/dex2oat﹕ dex2oat took 1.258ms (threads: 4) arena alloc=0B java alloc=2MB native alloc=502KB free=7MB

您可以使用aapt工具检查APK是否启用了vmSafeMode:

aapt list -a myapkfile.apk
...
A: android:vmSafeMode(0x010102b8)=(type 0x12)0xffffffff
...

我没有看到任何关于移除预编译引起的错误报告。但是,由于性能降低,您的应用程序可能会暴露之前不可见的问题。

如果您的应用程序需要进行非常密集的处理,可能会慢几倍。如果您的应用程序属于这个类别,最好不要移除预编译。


6

我为了记录而重新启用这个帖子,因为我知道有一种更简洁的方法。

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

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

default {
        manifestPlaceholders = [vmSafeModeEnabled: "true"]
}
buildTypes{
    release {
        manifestPlaceholders = [vmSafeModeEnabled: "false"]
    }
}

然后在清单中使用以下内容

android:vmSafeMode="${vmSafeModeEnabled}"

当Gradle构建运行时,它将根据构建类型应用适当的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接