Skip to content

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

makefile
PRODUCT_PROPERTY_OVERRIDES += dalvik.vm.foreground-heap-growth-multiplier=2.0

Task Snapshots

Это те самые карточки с изображением состояния приложения на момент его сворачивания, которые видны при переходе в Недавние. Для экономии памяти можно использовать их более "дешёвый" для оперативной памяти вариант.

xml
    <!-- 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. Это сэкономит память. Так или иначе, на слабых устройствах вряд ли получится удерживать запущенными больше приложений без ущерба общей скорости работы.

xml
    <!-- 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

xml
    <!-- 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 удалим следующее:

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).

  1. В дереве устройства удалим следующее:
makefile
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
makefile
PRODUCT_PACKAGES += android.hardware.configstore@1.1-service
xml
<hal format="hidl">
    <name>android.hardware.configstore</name>
    <transport>hwbinder</transport>
    <version>1.1</version>
    <interface>
        <name>ISurfaceFlingerConfigs</name>
        <instance>default</instance>
    </interface>
</hal>
  1. И добавим следующее:
makefile
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