8

/system/bin/dex2oatアプリをデバッグするためにビルドと展開の速度を最適化しようとしているときに、インストール中の実行にかなりの時間が費やされていることがわかりました。これはART 事前コンパイラーです。

API 22 をターゲットにすると、ART AOT コンパイルを停止できるようになりました。

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

導入速度が大幅に向上しましたが、この変更による副作用の可能性が懸念されます。実行時のパフォーマンスにわずかな影響を与えるに違いありませんが、android:vmSafeModeオプションを有効にすることで他に何か影響はありますか?

gradle ビルド ファイルで、デバッグ ビルドのこの属性をオーバーライドすることは可能ですか? または、デバッグ固有のマニフェスト ファイルを作成することが唯一の解決策ですか?

4

2 に答える 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>

このデバッグ マニフェストを追加してアプリをインストールしたら、デバイスの 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
...

事前コンパイルを削除したことによるバグの報告は見たことがありません。ただし、パフォーマンスの低下により、この変更を行う前には見えなかった問題がアプリケーションで明らかになる可能性があります。

非常に集中的な処理が何倍も遅くなる可能性があります。アプリがこのカテゴリに当てはまる場合は、事前コンパイルを削除しないことをお勧めします。

于 2015-07-06T05:40:52.327 に答える