2015-07-02 132 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這個構建運行時,它會根據構建類型應用相應的值。