Параграф 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