Параграф 4: Тонке налаштування
zRAM
Android Go розрахований на меншу кількість оперативної пам'яті і досить сильно покладається на zRAM. На відміну від стандартного Android, де це 50%, тут розмір zRAM має дорівнювати 75% від розміру всієї оперативної пам'яті пристрою.
Приклад запису в fstab
:
/dev/block/zram0 none swap defaults zramsize=75%
Для мінімального навантаження на процесор і мінімізації часу обміну сторінок, для zRAM рекомендується використовувати алгоритм стиснення LZ4
. Увімкнути (додається в будь-який rc-скрипт у дереві пристрою або можна створити окремий):
on init
# Set zRAM compression to lz4
write /sys/block/zram0/comp_algorithm lz4
zRAM слід активувати після закінчення завантаження пристрою, що додається в будь-який rc-скрипт:
on property:sys.boot_completed=1
swapon_all /vendor/etc/fstab.swap
Приклад альтернативної реалізації шелл-скриптом: https://github.com/acroreiser/android_device_lenovo_a6010/commit/befa1eec66ac7163720d3383368fbaa69225a922
Також можна поекспериментувати з алгоритмом ZSTD
, якщо він підтримується ядром.
Збирач сміття (GC)
Щоб зменшити вплив збирача сміття на роботу інтерфейсу, можна знизити частоту його викликів для застосунків на передньому плані, device.mk
:
PRODUCT_PROPERTY_OVERRIDES += dalvik.vm.foreground-heap-growth-multiplier=2.0
Task Snapshots
Це ті самі картки із зображенням стану застосунку на момент його згортання, які видно під час переходу в "Недавні". Для економії пам'яті можна використовувати їхній більш "дешевий" для оперативної пам'яті варіант.
<!-- Feature flag to enable memory efficient task snapshots that are used in recents optimized
for low memory devices and replace the app transition starting window with the splash
screen. -->
<bool name="config_lowRamTaskSnapshotsAndRecents">true</bool>
<item name="config_highResTaskSnapshotScale" format="float" type="dimen">0.8</item>
<item name="config_lowResTaskSnapshotScale" format="float" type="dimen">0.3</item>
<bool name="config_use16BitTaskSnapshotPixelFormat">true</bool>
Для більшої економії можна відключити попереднє завантаження снапшотів у лончері додатковим оверлеєм: https://github.com/acroreiser/android_device_lenovo_a6010/commit/0bdf5e17914a938feeb37c6366454c0a64bbfaa5
Нещодавні
Кількість додатків, що відображаються в Нещодавніх, має сенс скоротити до 4. Це заощадить пам'ять. Так чи інакше, на слабких пристроях навряд чи вийде утримувати запущеними більше застосунків без шкоди загальній швидкості роботи.
<!-- The minimum number of visible recent tasks to be presented to the user through the
SystemUI. Can be -1 if there is no minimum limit. -->
<integer name="config_minNumVisibleRecentTasks_lowRam">-1</integer>
<!-- The maximum number of visible recent tasks to be presented to the user through the
SystemUI. Can be -1 if there is no maximum limit. -->
<integer name="config_maxNumVisibleRecentTasks_lowRam">4</integer>
Вимикаємо налагодження WiFi
<!-- Disable WiFi Debugging will save memory by reducing the volume of WiFi firmware debug information -->
<bool translatable="false" name="config_wifi_enable_wifi_firmware_debugging">false</bool>
<integer translatable="false" name="config_wifi_logger_ring_buffer_verbose_size_limit_kb">64</integer>
Pinner Service
Pinner - механізм утримання в оперативній пам'яті певних файлів або застосунків. Оскільки пам'яті у нас обмаль, цей сервіс слід вимкнути.
З оверлея overlay/frameworks/base/core/res/res/values/config.xml
видалимо таке:
<!-- Should the pinner service pin the Home application? -->
<bool name="config_pinnerHomeApp">true</bool>
<!-- Default list of files pinned by the Pinner Service -->
<string-array translatable="false" name="config_defaultPinnerServiceFiles">
<item>"..."</item>
<!-- ... -->
</string-array>
Позбавляємося від Configstore HAL
Configstore HAL - це сховище конфігурації графічної системи Android - SurfaceFlinger. Однак, він складніший у використанні та споживає зайву пам'ять. Конвертуємо його в набір системних властивостей (system properties).
- У дереві пристрою видалимо таке:
SF_START_GRAPHICS_ALLOCATOR_SERVICE := true
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS := true
TARGET_HAS_HDR_DISPLAY := false
TARGET_HAS_WIDE_COLOR_DISPLAY := false
TARGET_USE_CONTEXT_PRIORITY := true
PRODUCT_PACKAGES += android.hardware.configstore@1.1-service
<hal format="hidl">
<name>android.hardware.configstore</name>
<transport>hwbinder</transport>
<version>1.1</version>
<interface>
<name>ISurfaceFlingerConfigs</name>
<instance>default</instance>
</interface>
</hal>
- І додамо таке:
PRODUCT_PACKAGES += disable_configstore
PRODUCT_PROPERTY_OVERRIDES += \
ro.surface_flinger.force_hwc_copy_for_virtual_displays=true \
ro.surface_flinger.has_HDR_display=false \
ro.surface_flinger.has_wide_color_display=false \
ro.surface_flinger.start_graphics_allocator_service=true \
ro.surface_flinger.use_context_priority=true