为调试构建覆盖android:vmSafeMode属性



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

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

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

我看到部署速度有了明显的提高,但我担心做出这一改变可能会产生副作用。它一定会对运行时性能造成小的影响,但启用android:vmSafeMode选项会产生其他后果吗?

对于调试构建,是否可以在渐变构建文件中覆盖此属性?或者创建一个特定于调试的清单文件是唯一的解决方案吗?

仅为调试构建启用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>

添加此调试清单并安装应用程序后,您应该检查设备的logcat输出,以确保在执行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
...

我没有看到任何关于删除提前编译导致的错误的报告。但是,由于性能降低,您的应用程序可能会暴露出在进行此更改之前不可见的问题。

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

我正在为子孙后代复兴这一点,因为我知道一种更清洁的方法。

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

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

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

然后在清单中使用这个替代

android:vmSafeMode="${vmSafeModeEnabled}"

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

最新更新