Переопределить атрибут android:vmSafeMode для отладочных сборок

Пытаясь оптимизировать скорость сборки и развертывания для отладки приложения, я обнаружил, что на его выполнение ушло много времени /system/bin/dex2oat во время установки. Это АРТ опережает время компилятора.

Я обнаружил, что при настройке API 22 теперь можно остановить компиляцию ART AOT:

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

Я заметил заметное улучшение скорости развертывания, однако у меня есть опасения относительно возможных побочных эффектов от внесения этих изменений. Это должно привести к небольшому падению производительности во время выполнения, но есть ли другие последствия включения android:vmSafeMode вариант?

Можно ли переопределить этот атрибут для отладочных сборок в файле сборки Gradle? Или создание файла манифеста для отладки - единственное решение?

2 ответа

Решение

Лучший способ включить 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/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, чтобы избежать дублирования всего файла манифеста.

в вашем build.gradle добавьте следующее:

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

а затем в манифесте используйте это вместо

android:vmSafeMode="${vmSafeModeEnabled}"

при запуске сборки gradle будет применяться соответствующее значение в зависимости от типа сборки.

Другие вопросы по тегам