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