Bre*_*ntM 7 android android-gradle-plugin android-runtime
在尝试优化调试应用程序的构建和部署速度时,我发现/system/bin/dex2oat在安装过程中花费了大量时间.这是ART提前编译器.
我发现在针对API 22时,您现在可以停止ART AOT编译:
<application
...
android:vmSafeMode="true">
</application>
Run Code Online (Sandbox Code Playgroud)
我看到了明显的部署速度改进,但是我担心这种改变可能会产生副作用.它必须导致小的运行时性能损失,但启用该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>
Run Code Online (Sandbox Code Playgroud)
添加此调试清单并安装应用程序后,应检查设备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
Run Code Online (Sandbox Code Playgroud)
也可以使用aapt工具检查APK是否启用了vmSafeMode:
aapt list -a myapkfile.apk
...
A: android:vmSafeMode(0x010102b8)=(type 0x12)0xffffffff
...
Run Code Online (Sandbox Code Playgroud)
我没有看到任何因删除提前编译而导致的错误的报告.但是,由于性能降低,您的应用程序可能会在进行此更改之前暴露出不可见的问题.
非常密集的处理可能会慢很多倍.如果您的应用符合此类别,则最好不要删除提前编译.
我将其恢复为后代,因为我知道一种更清洁的方法。
您可以在gradle中使用清单占位符,以避免重复整个清单文件。
在您的build.gradle中添加以下内容:
default {
manifestPlaceholders = [vmSafeModeEnabled: "true"]
}
buildTypes{
release {
manifestPlaceholders = [vmSafeModeEnabled: "false"]
}
}
Run Code Online (Sandbox Code Playgroud)
然后在清单中使用它代替
android:vmSafeMode="${vmSafeModeEnabled}"
Run Code Online (Sandbox Code Playgroud)
gradle构建运行时,它将基于构建类型应用适当的值。
| 归档时间: |
|
| 查看次数: |
2334 次 |
| 最近记录: |