Переопределить атрибут 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 будет применяться соответствующее значение в зависимости от типа сборки.