Użyj podanych niżej ustawień konfiguracji jako podstawy konfiguracji jądra Androida. Ustawienia są uporządkowane w formie plików .cfg
dla usług android-base
, android-base-ARCH
i android-recommended
:
- Opcje
android-base
umożliwiają korzystanie z podstawowych funkcji Androida i powinny być skonfigurowane zgodnie z ustawieniami wszystkich urządzeń. - Opcje
android-base-ARCH
umożliwiają korzystanie z podstawowych funkcji Androida i powinny być skonfigurowane zgodnie z wymaganiami wszystkich urządzeń z architekturą ARCH. Nie wszystkie architektury mają odpowiedni plik opcji wymaganych w danej architekturze. Jeśli w Twojej architekturze nie ma pliku, nie ma ona dodatkowych wymagań dotyczących konfiguracji jądra specyficznych dla architektury Androida. android-recommended
. Te opcje umożliwiają korzystanie z zaawansowanych funkcji Androida i są opcjonalne na urządzeniach.
Te pliki konfiguracji znajdują się w repozytorium kernel/configs
. Użyj zbioru plików konfiguracji, który odpowiada używanej wersji jądra.
Szczegółowe informacje o ustawieniach, które zostały już podjęte w celu wzmocnienia jądra systemu na urządzeniach, znajdziesz w artykule Bezpieczeństwo systemu i jądra. Szczegółowe informacje o wymaganych ustawieniach znajdziesz w dokumentacji dotyczącej zgodności Androida (CDD).
Generowanie konfiguracji jądra
W przypadku urządzeń o minimalistycznym formacie 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 dotyczące konfiguracji jądra
W niektórych przypadkach administrator platformy może wybrać kilka funkcji jądra, aby zaspokoić zależność od Androida. Takich zależności nie można wyrazić w plikach fragmentu konfiguracji jądra (opisanych powyżej), ponieważ format tych plików nie obsługuje wyrażeń logicznych. W Androidzie 9 i nowszym narzędzia Compatibility Test Suite (CTS) i Vendor Test Suite (VTS) sprawdzają, czy są spełnione te wymagania:
CONFIG_OF=y
lubCONFIG_ACPI=y
- Jądra w wersjach 4.4 i 4.9 mają
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
LUB zarównoCONFIG_MEMCG=y
, jak 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
Dodatkowo opcja CONFIG_INET_UDP_DIAG
musi być ustawiona na y
w przypadku jąder systemu 4.9 w Androidzie 9 i nowszych wersjach.
Włącz opcje trybu hosta USB
W przypadku ustawienia „Dźwięk w trybie hosta USB” włącz te opcje:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
W trybie hosta USB MIDI włącz tę opcję:
CONFIG_SND_USB_MIDI=y
Seccomp BPF z TSYNC
Bezpieczne przetwarzanie Berkeley Packet Filter (Seccomp BPF) to technologia zabezpieczeń jądra, 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 w programach wielowątkowych. Ta funkcja jest ograniczona do architektur, które obsługują Seccomp na poziomie upstream (ARM, ARM64, x86 i x86_64).
Demon blokady na żywo Androida
Android 10 zawiera demona Androida do blokowania na żywo (llkd
), który ma za zadanie wykrywać i łagodzić blokady jądra.
Szczegółowe informacje o używaniu llkd
znajdziesz w artykule Dajmon blokady na żywo Androida.
vDSO32 na ARM64
Wirtualny dynamiczny obiekt współdzielony (vDSO) to alternatywa dla wywołań systemowych, która przy prawidłowym użyciu i skonfigurowaniu może obniżyć koszty cyklu. Android 10 obsługuje 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 DSO32 (CONFIG_VDSO_COMPAT
) na architekturze ARM64 zapewnia wzrost czasu pracy na baterii o 0,4% i inne usprawnienia 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 za pomocą metod CONFIG_COMPAT
i CONFIG_CROSS_COMPILE_COMPAT_VDSO
za pomocą zgrupowania kompilatora arm32.
Zespół jądra Androida przesłał wstecz starsze wersje serii poprawek vDSO na urządzenia Pixel, dlatego przykłady znajdziesz w kompilacjach jądra Pixela (ścieżka LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
, odniesienie do CROSS_COMPILE_ARM32
i konfiguracja CONFIG_CROSS_COMPILE_ARM32
).
Konfiguracja z małą ilością pamięci RAM
Dostrój jądro i usługę ActivityManager, aby ograniczyć bezpośrednie odzyskiwanie
Bezpośrednie odzyskiwanie występuje, gdy proces lub jądro próbuje przydzielić stronę pamięci (bezpośrednio lub z powodu błędu na nowej stronie), a jądro wykorzystało całą dostępną wolną pamięć. Wymaga to zablokowania przez jądro alokacji podczas uwalniania strony. To z kolei często wymaga wejścia/wyjścia dysku w celu opróżnienia nieczystej strony obsługiwanej w ramach pliku lub oczekiwania na zakończenie procesu przez lowmemorykiller
. Może to spowodować dodatkowe operacje wejścia/wyjścia 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 przydzieli się prawdziwy wątek, mógł on szybko zakończyć działanie.
Domyślny próg aktywacji przywracania w tle jest dość niski i wynosi około 2 MB na urządzeniu z 2 GB miejsca i 636 KB na urządzeniu z rozmiarem 512 MB. Rdzenie zwolnione z pamięci w tle zajmują tylko kilka megabajtów pamięci. Oznacza to, że każdy proces, który szybko przydzieli więcej niż kilka megabajtów, szybko doprowadzi do bezpośredniego odzyskania.
W gałęzi jądra Androida 3.4 dodano obsługę parametru jądra w ramach poprawki 92189d47f66c67e5fd92eafaa287e153197a454f („add extra free kbytes tunable”). Dodanie tego poprawki do jądra urządzenia pozwala ActivityManager
nakazać jądru, aby starało się utrzymać 3 bufory pamięci o rozdzielczości 32 bpp na pełny ekran.
Te wartości progowe można skonfigurować za pomocą config.xml
ramy.
<!-- 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>
Dostosowywanie LowMemoryKiller
ActivityManager
konfiguruje progi LowMemoryKiller
, aby dopasować je do oczekiwanego zestawu roboczych stron obsługiwanych przez pliki (stron w pamięci podręcznej) wymaganych do wykonywania procesów w każdym zbiorniku poziomu priorytetu. Jeśli urządzenie ma wysokie wymagania dotyczące zestawu roboczego, na przykład interfejs dostawcy wymaga więcej pamięci lub dodano więcej usług, progi mogą zostać zwiększone.
Jeśli dla stron obsługiwanych przez pliki zarezerwowana jest zbyt duża ilość pamięci, progi mogą zostać zmniejszone, aby procesy w tle były przerywane na długo przed wystąpieniem wyczerpania dysku z powodu zbyt małej ilości pamięci podręcznej.
<!-- 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>