Konfiguracja jądra

Użyj następujących ustawień konfiguracyjnych jako podstawy dla 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 z wymaganiami wszystkich urządzeń.
  • android-base- ARCH opcje włączają podstawowe funkcje Androida i powinny być skonfigurowane zgodnie ze specyfikacją wszystkich urządzeń architektury ARCH . Nie wszystkie architektury mają odpowiedni plik z wymaganymi opcjami specyficznymi dla architektury. Jeśli Twoja architektura nie ma pliku, nie ma dodatkowych wymagań dotyczących konfiguracji jądra specyficznych dla architektury dla systemu Android.
  • android-recommended . Te opcje włączają zaawansowane funkcje Androida i są opcjonalne dla urządzeń.

Te pliki konfiguracyjne znajdują się w repozytorium kernel/configs . Użyj zestawu plików konfiguracyjnych, który odpowiada używanej wersji jądra.

Aby uzyskać szczegółowe informacje na temat kontroli już podjętych w celu wzmocnienia jądra na twoich urządzeniach, zobacz Bezpieczeństwo systemu i jądra . Aby uzyskać szczegółowe informacje na temat wymaganych ustawień, zapoznaj się z dokumentem definicji zgodności z systemem Android (CDD) .

Wygeneruj konfigurację jądra

W przypadku urządzeń, które mają 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 .config , którego można użyć do zapisania nowego pliku defconfig lub skompilowania nowego jądra z włączonymi funkcjami systemu Android.

Dodatkowe wymagania dotyczące konfiguracji jądra

W niektórych przypadkach opiekun platformy może wybierać spośród wielu funkcji jądra, aby zaspokoić zależność Androida. Takie zależności nie mogą być wyrażone 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 pakiety Compatibility Test Suite (CTS) i Vendor Test Suite (VTS) sprawdzają, czy spełnione są następujące wymagania:

  • CONFIG_OF=y lub CONFIG_ACPI=y
  • Jądra 4.4 i 4.9 mają CONFIG_ANDROID_LOW_MEMORY_KILLER=y LUB mają zarówno CONFIG_MEMCG=y jak i CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y lub CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y lub CONFIG_STRICT_MODULE_RWX=y
  • Tylko dla ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y lub CONFIG_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

Dla 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 zabezpieczeń jądra, która umożliwia tworzenie piaskownic, które definiują kontekst, w którym proces może wykonywać wywołania systemowe. Funkcja synchronizacji wątków (TSYNC) umożliwia korzystanie z Secomp BPF z programów wielowątkowych. Ta możliwość jest ograniczona do architektur, które obsługują Seccomp w górę (ARM, ARM64, x86 i x86_64).

Demon blokady na żywo na Androida

Android 10 zawiera demona Android Live-Lock ( llkd ), który ma na celu wyłapywanie i łagodzenie zakleszczeń jądra. Aby uzyskać szczegółowe informacje na temat korzystania z llkd , zapoznaj się z Android Live-Lock Daemon .

vDSO32 na ARM64

Wirtualny dynamiczny obiekt współdzielony (vDSO) to alternatywa dla wywołań systemowych, która, jeśli jest używana i poprawnie skonfigurowana, może obniżyć koszty cyklu. Android 10 dodaje obsługę vDSO32 na jądrach 64-bitowych (Android obsługuje już vDSO64 na jądrach 64-bitowych i vDSO32 na jądrach 32-bitowych). Korzystanie z vDSO32 ( CONFIG_VDSO_COMPAT ) w architekturze ARM64 zapewnia 0,4% wydłużenie czasu pracy baterii i inne ulepszenia wydajności.

Społeczność Linuksa aktywnie pracuje nad ujednoliceniem vDSO w różnych architekturach . Możesz skonfigurować vDSO w jądrze Linux, włączając vDSO32 z CONFIG_COMPAT i CONFIG_CROSS_COMPILE_COMPAT_VDSO z trypletem kompilatora arm32. Zespół jądra systemu Android przeniósł starsze wersje serii poprawek vDSO do urządzeń 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 ).

Konfiguracja z niską pamięcią RAM

Dostosuj jądro/ActivityManager, aby zmniejszyć bezpośrednie odzyskiwanie

Bezpośrednie odzyskiwanie 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 blokowania alokacji podczas zwalniania strony. To z kolei często wymaga we/wy dysku, aby usunąć brudną stronę z pliku lub czekać, aż lowmemorykiller zatrzyma proces. Może to spowodować dodatkowe operacje 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 prawdziwy wątek zostanie przydzielony, może szybko odnieść sukces.

Domyślny próg wyzwalania odzyskiwania w tle jest dość niski, około 2 MB na urządzeniu 2 GB i 636 KB na urządzeniu 512 MB. Jądro odzyskuje tylko kilka megabajtów pamięci w trybie odzyskiwania w tle. Oznacza to, że każdy proces, który szybko przydziela więcej niż kilka megabajtów, szybko trafi w bezpośrednie odzyskiwanie.

W gałęzi jądra systemu Android-3.4 dodano obsługę strojonego jądra jako łatę 92189d47f66c67e5fd92eafaa287e153197a454f („dodaj dodatkowe wolne kilobajty dostrajalne”). Wybranie tej łatki do jądra urządzenia pozwala ActivityManager powiedzieć jądru, aby spróbowało zachować trzy pełnoekranowe bufory 32 bpp wolnej pamięci.

Te progi można skonfigurować za pomocą struktury 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>

Tune LowMemoryKiller

ActivityManager konfiguruje progi LowMemoryKiller tak, aby odpowiadały oczekiwaniom roboczym zbioru stron opartych na plikach (stron w pamięci podręcznej) wymaganych do uruchomienia procesów w każdym zasobniku o poziomie priorytetu. Jeśli urządzenie ma wysokie wymagania dotyczące zestawu roboczego, na przykład jeśli interfejs użytkownika 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 zarezerwowano zbyt dużo pamięci dla stron opartych na plikach, tak aby procesy w tle były zabijane na długo przed wystąpieniem przeładowania dysku z powodu zbyt małej pamięci podręcznej.

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