2015-07-02 91 views
5

在尝试优化构建和部署速度以调试应用程序时,我发现大部分时间花费在安装过程中执行/system/bin/dex2oat。这是ART ahead of time compiler覆盖调试版本的android:vmSafeMode属性

我发现针对API 22,当你现在可以停止ART AOT编译:

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

我看到一个明显的部署速度提升,但是我有顾虑,以使这种变化可能带来的副作用。它必须导致运行时性能下降,但启用android:vmSafeMode选件会产生其他后果吗?

是否有可能在gradle构建文件中覆盖该属性,用于调试构建?或者正在创建一个调试特定清单文件的唯一解决方案?

回答

6

为您的调试版本启用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输出之后,以确保vmSafeMode标志是在执行dex2oat进程时正确应用。查找参数--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/[email protected]@[email protected]@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 
... 

我还没有看到造成除去名列前茅的时间编制错误的任何报告。但是,由于性能下降,您的应用程序可能会暴露在进行此更改之前不可见的问题。

这可能是非常密集的处理可能会慢许多倍。如果您的应用适合此类别,最好不要删除提前编译。

1

我正在重振这为后代,因为我知道一个更清洁的方法。

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

在你的build.gradle

添加以下内容:

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

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

android:vmSafeMode="${vmSafeModeEnabled}" 

的gradle这个构建运行时,它会根据构建类型应用相应的值。