Используйте следующие параметры конфигурации в качестве основы для конфигурации ядра Android. Настройки организованы в файлы .cfg
для android-base
, android-base- ARCH
и android-recommended
:
- Параметры
android-base
включают основные функции Android и должны быть настроены так, как указано на всех устройствах. - Параметры
android-base- ARCH
включают основные функции Android и должны быть настроены так, как указано для всех устройств с архитектурой ARCH . Не для всех архитектур имеется соответствующий файл с обязательными параметрами для конкретной архитектуры. Если в вашей архитектуре нет файла, у нее нет дополнительных требований к конфигурации ядра для Android, специфичных для этой архитектуры. -
android-recommended
. Эти параметры включают расширенные функции Android и являются необязательными для устройств.
Эти файлы конфигурации расположены в репозитории kernel/configs
. Используйте набор файлов конфигурации, соответствующий используемой вами версии ядра.
Подробную информацию о мерах контроля, уже предпринятых для усиления ядра на ваших устройствах, см. в разделе Безопасность системы и ядра . Подробную информацию о необходимых настройках см. в документе определения совместимости Android (CDD) .
Сгенерировать конфигурацию ядра
Для устройств с минималистским форматом defconfig
используйте сценарий merge_config.sh
в дереве ядра, чтобы включить параметры:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
При этом создается файл .config
, который можно использовать для сохранения нового файла defconfig
или для компиляции нового ядра с включенными функциями Android.
Дополнительные требования к конфигурации ядра
В некоторых случаях сопровождающий платформы может выбирать из нескольких функций ядра, чтобы удовлетворить зависимость Android. Такие зависимости не могут быть выражены в файлах фрагментов конфигурации ядра (описанных выше), поскольку формат этих файлов не поддерживает логические выражения. В Android 9 и более поздних версиях набор тестов совместимости (CTS) и набор тестов поставщиков (VTS) проверяют выполнение следующих требований:
-
CONFIG_OF=y
илиCONFIG_ACPI=y
- Ядра 4.4 и 4.9 имеют
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
ИЛИ имеютCONFIG_MEMCG=y
иCONFIG_MEMCG_SWAP=y
-
CONFIG_DEBUG_RODATA=y
илиCONFIG_STRICT_KERNEL_RWX=y
-
CONFIG_DEBUG_SET_MODULE_RONX=y
илиCONFIG_STRICT_MODULE_RWX=y
- Только для ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
илиCONFIG_ARM64_PAN=y
Кроме того, опция CONFIG_INET_UDP_DIAG
должна быть установлена на y
для 4.9 ядра в Android 9 и выше.
Включить параметры режима USB-хоста
Для аудио режима хоста USB включите следующие параметры:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
Для MIDI для USB -хоста MIDI включите следующую опцию:
CONFIG_SND_USB_MIDI=y
Seccomp BPF с TSYNC
Фильтр пакетов Беркли Secure Computing (Seccomp BPF) — это технология безопасности ядра, которая позволяет создавать песочницы, определяющие контекст, в котором процесс может выполнять системные вызовы. Функция синхронизации потока (TSYNC) позволяет использовать SECCOMP BPF из многопоточных программ. This ability is limited to architectures that have Seccomp support upstream (ARM, ARM64, x86, and x86_64).
Демон блокировки Android в реальном времени
Android 10 includes the Android live-lock daemon ( llkd
), which is designed to catch and mitigate kernel deadlocks. Подробную информацию об использовании llkd
см. в разделе демон живой блокировки Android .
vDSO32 на ARM64
Виртуальный динамический общий объект (vDSO) — это альтернатива системным вызовам, которая при правильном использовании и настройке может снизить затраты на цикл. В Android 10 добавлена поддержка vDSO32 в 64-битных ядрах (Android уже поддерживает vDSO64 в 64-битных ядрах и vDSO32 в 32-битных ядрах). Использование vDSO32 ( CONFIG_VDSO_COMPAT
) в архитектуре ARM64 обеспечивает увеличение времени автономной работы на 0,4 процента и другие улучшения производительности.
Сообщество Linux активно работает над унификацией vDSO для разных архитектур . Вы можете настроить vDSO в ядре Linux, включив vDSO32 с помощью CONFIG_COMPAT
и CONFIG_CROSS_COMPILE_COMPAT_VDSO
с помощью триплета компилятора Arm32. Команда Android Kernel перенесла старые версии серии патчей vDSO на устройства Pixel, поэтому вы можете найти примеры в сборках ядра Pixel (путь LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
, ссылка CROSS_COMPILE_ARM32
и конфигурация CONFIG_CROSS_COMPILE_ARM32
).
Low RAM configuration
Настройте ядро и ActivityManager, чтобы уменьшить количество прямого восстановления.
Прямое восстановление происходит, когда процесс или ядро пытается выделить страницу памяти (напрямую или из-за ошибки на новой странице), и ядро использовало всю доступную свободную память. Это требует, чтобы ядро заблокировало выделение, пока оно освобождает страницу. Это, в свою очередь, часто требует дискового ввода-вывода для очистки грязной страницы с файловой поддержкой или ожидания, пока lowmemorykiller
остановит процесс. Это может привести к увеличению количества операций ввода-вывода в любом потоке, включая поток пользовательского интерфейса.
Чтобы избежать прямого восстановления, в ядре имеются водяные знаки, которые запускают kswapd
или фоновое восстановление. Это поток, который пытается освободить страницы, чтобы в следующий раз, когда реальный поток выделит память, это могло бы быстро добиться успеха.
Пороговое значение по умолчанию для запуска фонового восстановления довольно низкое: около 2 МБ на устройстве емкостью 2 ГБ и 636 КБ на устройстве емкостью 512 МБ. Ядро освобождает лишь несколько мегабайт памяти при фоновом освобождении. Это означает, что любой процесс, который быстро выделяет более нескольких мегабайт, быстро перейдет к прямому освобождению.
Поддержка настраиваемых параметров ядра добавлена в ветку ядра Android-3.4 в виде патча 92189d47f66c67e5fd92eafaa287e153197a454f («добавить дополнительные настраиваемые свободные килобайты»). Выбор этого патча для ядра устройства позволяет ActivityManager
сообщить ядру, чтобы оно попыталось сохранить три полноэкранных буфера памяти с битрейтом 32 бита на пиксель.
Эти пороговые значения можно настроить с помощью платформы config.xml
.
<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). A high value increases the amount of memory that the kernel tries to keep free, reducing allocation time and causing the lowmemorykiller to kill earlier. A low value allows more memory to be used by processes but may cause more allocations to block waiting on disk I/O or lowmemorykiller. Overrides the default value chosen by ActivityManager based on screen size. 0 prevents keeping any extra memory over what the kernel keeps by default. -1 keeps the default. --> <integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). 0 uses the default value chosen by ActivityManager. A positive value increases the amount of memory that the kernel tries to keep free, reducing allocation time and causing the lowmemorykiller to kill earlier. A negative value allows more memory to be used by processes but may cause more allocations to block waiting on disk I/O or lowmemorykiller. Directly added to the default value chosen by ActivityManager based on screen size. --> <integer name="config_extraFreeKbytesAdjust">0</integer>
Tune LowmemoryKiller
ActivityManager
настраивает пороговые значения LowMemoryKiller
так, чтобы они соответствовали ожидаемому рабочему набору страниц с файловой поддержкой (кэшированных страниц), необходимых для запуска процессов в каждом сегменте уровня приоритета. Если у устройства высокие требования к рабочему набору, например, если пользовательский интерфейс поставщика требует больше памяти или добавлено больше служб, пороговые значения можно увеличить.
Пороговые значения можно уменьшить, если для страниц с файловой поддержкой резервируется слишком много памяти, поэтому фоновые процессы завершаются задолго до того, как произойдет перегрузка диска из-за слишком малого размера кэша.
<!-- Device configuration setting the minfree tunable in the lowmemorykiller in the kernel. A high value causes the lowmemorykiller to fire earlier, keeping more memory in the file cache and preventing I/O thrashing, but allowing fewer processes to stay in memory. A low value keeps more processes in memory but may cause thrashing if set too low. Overrides the default value chosen by ActivityManager based on screen size and total memory for the largest lowmemorykiller bucket, and scaled proportionally to the smaller buckets. -1 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the lowmemorykiller in the kernel. A high value causes the lowmemorykiller to fire earlier, keeping more memory in the file cache and preventing I/O thrashing, but allowing fewer processes to stay in memory. A low value keeps more processes in memory but may cause thrashing if set too low. Directly added to the default value chosen by ActivityManager based on screen size and total memory for the largest lowmemorykiller bucket, and scaled proportionally to the smaller buckets. 0 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>
Используйте следующие параметры конфигурации в качестве основы для конфигурации ядра Android. Настройки организованы в файлы .cfg
для android-base
, android-base- ARCH
и android-recommended
:
- Параметры
android-base
включают основные функции Android и должны быть настроены так, как указано на всех устройствах. - Параметры
android-base- ARCH
включают основные функции Android и должны быть настроены так, как указано для всех устройств с архитектурой ARCH . Не для всех архитектур имеется соответствующий файл с обязательными параметрами для конкретной архитектуры. Если в вашей архитектуре нет файла, у нее нет дополнительных требований к конфигурации ядра для Android, специфичных для этой архитектуры. -
android-recommended
. Эти параметры включают расширенные функции Android и являются необязательными для устройств.
Эти файлы конфигурации расположены в репозитории kernel/configs
. Используйте набор файлов конфигурации, соответствующий используемой вами версии ядра.
Подробную информацию о мерах контроля, уже предпринятых для усиления ядра на ваших устройствах, см. в разделе Безопасность системы и ядра . Для получения подробной информации о необходимых настройках см. В документе определения совместимости Android (CDD) .
Генерировать конфигурацию ядра
Для устройств с минималистским форматом defconfig
используйте сценарий merge_config.sh
в дереве ядра, чтобы включить параметры:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
При этом создается файл .config
, который можно использовать для сохранения нового файла defconfig
или для компиляции нового ядра с включенными функциями Android.
Дополнительные требования к конфигурации ядра
В некоторых случаях сопровождающий платформы может выбирать из нескольких функций ядра, чтобы удовлетворить зависимость Android. Такие зависимости не могут быть выражены в файлах фрагментов конфигурации ядра (описанных выше), поскольку формат этих файлов не поддерживает логические выражения. В Android 9 и более поздних версиях набор тестов совместимости (CTS) и набор тестов поставщиков (VTS) проверяют соответствие следующим требованиям:
-
CONFIG_OF=y
илиCONFIG_ACPI=y
- Ядра 4.4 и 4.9 имеют
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
ИЛИ имеютCONFIG_MEMCG=y
иCONFIG_MEMCG_SWAP=y
-
CONFIG_DEBUG_RODATA=y
илиCONFIG_STRICT_KERNEL_RWX=y
-
CONFIG_DEBUG_SET_MODULE_RONX=y
илиCONFIG_STRICT_MODULE_RWX=y
- Только для ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
илиCONFIG_ARM64_PAN=y
Кроме того, для параметра CONFIG_INET_UDP_DIAG
должно быть установлено значение y
для ядер версии 4.9 в Android 9 и выше.
Включить параметры режима USB-хоста
Для аудио режима хоста USB включите следующие параметры:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
Для режима USB-хоста MIDI включите следующую опцию:
CONFIG_SND_USB_MIDI=y
Seccomp bpf с tsync
Фильтр пакетов Беркли Secure Computing (Seccomp BPF) — это технология безопасности ядра, позволяющая создавать песочницы, определяющие контекст, в котором процесс может выполнять системные вызовы. Функция синхронизации потоков (TSYNC) позволяет использовать Seccomp BPF из многопоточных программ. Эта возможность ограничена архитектурами, имеющими поддержку Seccomp (ARM, ARM64, x86 и x86_64).
Демон Android Live-Lock
Android 10 включает в себя Daemon Android Live-Lock ( llkd
), который предназначен для улавливания и смягчения тупиков ядра. Подробную информацию об использовании llkd
см. в разделе демон живой блокировки Android .
VDSO32 на ARM64
Виртуальный динамический общий объект (vDSO) — это альтернатива системным вызовам, которая при правильном использовании и настройке может снизить затраты на цикл. В Android 10 добавлена поддержка vDSO32 в 64-битных ядрах (Android уже поддерживает vDSO64 в 64-битных ядрах и vDSO32 в 32-битных ядрах). Использование vDSO32 ( CONFIG_VDSO_COMPAT
) в архитектуре ARM64 обеспечивает увеличение времени автономной работы на 0,4 процента и другие улучшения производительности.
Сообщество Linux активно работает над унификацией vDSO для разных архитектур . Вы можете настроить vDSO в ядре Linux, включив vDSO32 с помощью CONFIG_COMPAT
и CONFIG_CROSS_COMPILE_COMPAT_VDSO
с помощью триплета компилятора Arm32. Команда Android Kernel перенесла старые версии серии патчей vDSO на устройства Pixel, поэтому вы можете найти примеры в сборках ядра Pixel (путь LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
, ссылка CROSS_COMPILE_ARM32
и конфигурация CONFIG_CROSS_COMPILE_ARM32
).
Конфигурация с низким объемом оперативной памяти
Настройте ядро и ActivityManager, чтобы уменьшить количество прямого восстановления.
Прямое восстановление происходит, когда процесс или ядро пытается выделить страницу памяти (напрямую или из-за ошибки на новой странице), и ядро использовало всю доступную свободную память. Это требует, чтобы ядро заблокировало выделение, пока оно освобождает страницу. Это, в свою очередь, часто требует дискового ввода-вывода для очистки грязной страницы с файловой поддержкой или ожидания, пока lowmemorykiller
остановит процесс. Это может привести к увеличению количества операций ввода-вывода в любом потоке, включая поток пользовательского интерфейса.
Чтобы избежать прямого восстановления, у ядра есть водяные знаки, которые запускают kswapd
или фон. Это поток, который пытается освободить страницы, чтобы в следующий раз, когда реальный поток выделит память, это могло бы быстро добиться успеха.
Порог по умолчанию для запуска фонового восстановления довольно низок: около 2 МБ на устройстве емкостью 2 ГБ и 636 КБ на устройстве емкостью 512 МБ. Ядро освобождает лишь несколько мегабайт памяти при фоновом освобождении. Это означает, что любой процесс, который быстро выделяет более нескольких мегабайт, быстро перейдет к прямому освобождению.
Поддержка настраиваемых параметров ядра добавлена в ветку ядра Android-3.4 в виде патча 92189d47f66c67e5fd92eafaa287e153197a454f («добавить дополнительные настраиваемые свободные килобайты»). Выбор этого патча для ядра устройства позволяет ActivityManager
сообщить ядру, чтобы оно попыталось сохранить три полноэкранных буфера памяти с битрейтом 32 бита на пиксель.
Эти пороговые значения можно настроить с помощью платформы config.xml
.
<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). A high value increases the amount of memory that the kernel tries to keep free, reducing allocation time and causing the lowmemorykiller to kill earlier. A low value allows more memory to be used by processes but may cause more allocations to block waiting on disk I/O or lowmemorykiller. Overrides the default value chosen by ActivityManager based on screen size. 0 prevents keeping any extra memory over what the kernel keeps by default. -1 keeps the default. --> <integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). 0 uses the default value chosen by ActivityManager. A positive value increases the amount of memory that the kernel tries to keep free, reducing allocation time and causing the lowmemorykiller to kill earlier. A negative value allows more memory to be used by processes but may cause more allocations to block waiting on disk I/O or lowmemorykiller. Directly added to the default value chosen by ActivityManager based on screen size. --> <integer name="config_extraFreeKbytesAdjust">0</integer>
Настройте низкий уровень памятиMemoryKiller
ActivityManager
настраивает пороговые значения LowMemoryKiller
так, чтобы они соответствовали ожидаемому рабочему набору страниц с файловой поддержкой (кэшированных страниц), необходимых для запуска процессов в каждом сегменте уровня приоритета. Если устройство имеет высокие требования для рабочего набора, например, если пользовательский интерфейс поставщика требует большей памяти или если было добавлено больше сервисов, пороговые значения могут быть увеличены.
Пороговые значения могут быть уменьшены, если слишком много памяти будет зарезервировано для страниц, поддерживаемых файлами, так что фоновые процессы будут убиты задолго до того, как диск произойдет из-за того, что кэш станет слишком маленьким.
<!-- Device configuration setting the minfree tunable in the lowmemorykiller in the kernel. A high value causes the lowmemorykiller to fire earlier, keeping more memory in the file cache and preventing I/O thrashing, but allowing fewer processes to stay in memory. A low value keeps more processes in memory but may cause thrashing if set too low. Overrides the default value chosen by ActivityManager based on screen size and total memory for the largest lowmemorykiller bucket, and scaled proportionally to the smaller buckets. -1 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the lowmemorykiller in the kernel. A high value causes the lowmemorykiller to fire earlier, keeping more memory in the file cache and preventing I/O thrashing, but allowing fewer processes to stay in memory. A low value keeps more processes in memory but may cause thrashing if set too low. Directly added to the default value chosen by ActivityManager based on screen size and total memory for the largest lowmemorykiller bucket, and scaled proportionally to the smaller buckets. 0 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>