Użyj poniższych ustawień konfiguracyjnych jako podstawy konfiguracji jądra systemu Android. Ustawienia są zorganizowane w plikach .cfg
dla android-base
, android-base- ARCH
i android-recommended
:
- Opcje
android-base
włączają podstawowe funkcje Androida i powinny być skonfigurowane zgodnie ze specyfikacjami wszystkich urządzeń. - Opcje
android-base- ARCH
włączają podstawowe funkcje Androida i powinny być skonfigurowane zgodnie ze specyfikacjami wszystkich urządzeń o architekturze ARCH . Nie wszystkie architektury mają odpowiedni plik wymaganych opcji specyficznych dla architektury. Jeśli Twoja architektura nie ma pliku, nie ma dodatkowych wymagań konfiguracyjnych jądra specyficznych dla architektury dla systemu Android. -
android-recommended
. Opcje te umożliwiają korzystanie z zaawansowanych funkcji systemu Android i są opcjonalne w przypadku urządzeń.
Te pliki konfiguracyjne znajdują się w repozytorium kernel/configs
. Użyj zestawu plików konfiguracyjnych odpowiadających wersji jądra, którego używasz.
Aby uzyskać szczegółowe informacje na temat kontroli podjętych już w celu wzmocnienia jądra na Twoich urządzeniach, zobacz Bezpieczeństwo systemu i jądra . Szczegółowe informacje na temat wymaganych ustawień można znaleźć w dokumencie definicji zgodności systemu Android (CDD) .
Wygeneruj konfigurację jądra
W przypadku urządzeń mających minimalistyczny format defconfig
użyj skryptu merge_config.sh
w drzewie jądra, aby włączyć opcje:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
Spowoduje to wygenerowanie pliku .config
, którego możesz użyć do zapisania nowego pliku defconfig
lub skompilowania nowego jądra z włączonymi funkcjami Androida.
Dodatkowe wymagania konfiguracyjne jądra
W niektórych przypadkach opiekun platformy może wybierać spośród wielu funkcji jądra, aby spełnić zależność od Androida. Takich zależności nie można wyrazić w plikach fragmentów konfiguracji jądra (opisanych powyżej), ponieważ format tych plików nie obsługuje wyrażeń logicznych. W systemie Android 9 i nowszych pakietach Compatibility Test Suite (CTS) i Vendor Test Suite (VTS) sprawdzają, czy spełnione są następujące wymagania:
-
CONFIG_OF=y
lubCONFIG_ACPI=y
- Jądra 4.4 i 4.9 mają
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
LUB mają obaCONFIG_MEMCG=y
iCONFIG_MEMCG_SWAP=y
-
CONFIG_DEBUG_RODATA=y
lubCONFIG_STRICT_KERNEL_RWX=y
-
CONFIG_DEBUG_SET_MODULE_RONX=y
lubCONFIG_STRICT_MODULE_RWX=y
- Tylko dla ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
lubCONFIG_ARM64_PAN=y
Ponadto opcja CONFIG_INET_UDP_DIAG
musi być ustawiona na y
dla jąder 4.9 w systemie Android 9 i nowszych.
Włącz opcje trybu hosta USB
W przypadku dźwięku w trybie hosta USB włącz następujące opcje:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
W przypadku trybu hosta USB MIDI włącz następującą opcję:
CONFIG_SND_USB_MIDI=y
Seccomp BPF z TSYNC
Secure Computing Berkeley Packet Filter (Seccomp BPF) to technologia zabezpieczająca jądro, która umożliwia tworzenie piaskownic definiujących kontekst, w którym proces może wykonywać wywołania systemowe. Funkcja synchronizacji wątków (TSYNC) umożliwia korzystanie z Seccomp BPF z programów wielowątkowych. Ta możliwość jest ograniczona do architektur obsługujących Seccomp (ARM, ARM64, x86 i x86_64).
Demon blokady na żywo w systemie Android
Android 10 zawiera demona Android Live-Lock Daemon ( llkd
), którego zadaniem jest wychwytywanie i łagodzenie zakleszczeń jądra. Szczegółowe informacje na temat korzystania llkd
można znaleźć w artykule Android Live-Lock Daemon .
vDSO32 na ARM64
Wirtualny dynamiczny obiekt współdzielony (vDSO) jest alternatywą dla wywołań systemowych, która przy prawidłowym użyciu i skonfigurowaniu może obniżyć koszty cyklu. Android 10 dodaje obsługę vDSO32 w jądrach 64-bitowych (Android obsługuje już vDSO64 w jądrach 64-bitowych i vDSO32 w jądrach 32-bitowych). Korzystanie z vDSO32 ( CONFIG_VDSO_COMPAT
) w architekturze ARM64 zapewnia 0,4-procentowy wzrost żywotności baterii i inną poprawę wydajności.
Społeczność Linuksa aktywnie pracuje nad ujednoliceniem vDSO w różnych architekturach . Możesz skonfigurować vDSO w jądrze Linuksa, włączając vDSO32 z CONFIG_COMPAT
i CONFIG_CROSS_COMPILE_COMPAT_VDSO
z trójką kompilatora arm32. Zespół jądra Androida przeportował starsze wersje serii poprawek vDSO na urządzenia Pixel, więc przykłady można znaleźć w kompilacjach jądra Pixel (ścieżka LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
, odniesienie CROSS_COMPILE_ARM32
i konfiguracja CONFIG_CROSS_COMPILE_ARM32
).
Niska konfiguracja pamięci RAM
Dostrój jądro/ActivityManager, aby zmniejszyć bezpośrednie odzyskiwanie
Odzyskiwanie bezpośrednie ma miejsce, gdy proces lub jądro próbuje przydzielić stronę pamięci (bezpośrednio lub z powodu błędu w nowej stronie), a jądro wykorzystało całą dostępną wolną pamięć. Wymaga to od jądra zablokowania alokacji podczas zwalniania strony. To z kolei często wymaga operacji we/wy dysku, aby opróżnić brudną stronę zawierającą kopię zapasową pliku lub poczekać, aż proces lowmemorykiller
zatrzyma proces. Może to skutkować dodatkowymi operacjami we/wy w dowolnym wątku, w tym w wątku interfejsu użytkownika.
Aby uniknąć bezpośredniego odzyskiwania, jądro ma znaki wodne, które uruchamiają kswapd
lub odzyskiwanie w tle. Jest to wątek, który próbuje zwolnić strony, aby następnym razem, gdy zostanie przydzielony prawdziwy wątek, mógł szybko odnieść sukces.
Domyślny próg wyzwalający odzyskiwanie w tle jest dość niski, około 2 MB na urządzeniu o pojemności 2 GB i 636 KB na urządzeniu o pojemności 512 MB. Jądro odzyskuje tylko kilka megabajtów pamięci podczas odzyskiwania w tle. Oznacza to, że każdy proces, który szybko przydziela więcej niż kilka megabajtów, szybko uzyska możliwość bezpośredniego odzyskania.
Obsługa przestrajania jądra została dodana w gałęzi jądra Androida 3.4 jako poprawka 92189d47f66c67e5fd92eafaa287e153197a454f („dodaj dodatkowe darmowe przestrajalne kilobajty”). Pobranie tej poprawki do jądra urządzenia pozwala ActivityManager
nakazać jądru, aby próbowało zachować wolne trzy pełnoekranowe bufory pamięci o szybkości 32 bitów na sekundę.
Progi te można skonfigurować za pomocą środowiska config.xml
.
<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). A high value will increase 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 will increase 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>
Dostrój LowMemoryKiller
ActivityManager
konfiguruje progi LowMemoryKiller
tak, aby odpowiadały oczekiwaniom zestawu roboczego stron opartych na plikach (stron w pamięci podręcznej) wymaganych do uruchomienia procesów na każdym poziomie priorytetu. Jeśli urządzenie ma wysokie wymagania dotyczące zestawu roboczego, na przykład jeśli interfejs dostawcy wymaga więcej pamięci lub jeśli dodano więcej usług, progi można zwiększyć.
Progi można zmniejszyć, jeśli dla stron opartych na plikach zarezerwowano zbyt dużo pamięci, co powoduje, że procesy w tle są przerywane na długo przed wystąpieniem awarii dysku spowodowanej zbyt małą pamięcią podręczną.
<!-- Device configuration setting the minfree tunable in the lowmemorykiller in the kernel. A high value will cause 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 will keep 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 will cause 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 will keep 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>