Konfiguracja jądra systemu

Użyj poniższych ustawień konfiguracji jako podstawy jądra Androida konfiguracji. Ustawienia są uporządkowane w .cfg plików dotyczących usług android-base, android-base-ARCH i android-recommended:

  • Opcje android-base włączają podstawowe funkcje Androida i powinna być skonfigurowana w sposób określony przez wszystkie urządzenia.
  • Opcje android-base-ARCH włączą podstawowe funkcji Androida i należy go skonfigurować zgodnie z wymaganiami wszystkich urządzeń architektura ARCH. Nie wszystkie architektury mają odpowiedni plik opcji wymaganych w konkretnej architekturze. Jeśli Twoja architektura nie ma pliku, nie ma on dodatkowej konfiguracji jądra zależnej od architektury wymagań systemu Android.
  • android-recommended Te opcje włączają zaawansowane funkcje Androida funkcji i są opcjonalne na urządzeniach.

Te pliki konfiguracji znajdują się w kernel/configs repozytorium. Użyj zbioru plików konfiguracji, który odpowiada wersji systemu, którego używasz.

Szczegółowe informacje na temat ustawień, które zostały już podjęte w celu wzmocnienia jądra systemu urządzeń, zapoznaj się z sekcją Systemy zabezpieczeń jądra systemu. Szczegółowe informacje o wymaganych ustawieniach znajdziesz w Dokument definicji zgodności z Androidem (CDD).

Wygeneruj konfigurację jądra

W przypadku urządzeń o minimalistycznym formacie defconfig użyj funkcji 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 defconfig lub skompiluj nowe jądro z funkcjami Androida .

Dodatkowe wymagania dotyczące konfiguracji jądra

W niektórych przypadkach opiekun platformy może wybierać spośród kilku jąder aby spełnić wymagania Androida. Takich zależności nie można wyrażonych w plikach z fragmentami konfiguracji jądra (opisanych powyżej), ponieważ nie obsługuje wyrażeń logicznych. Na Androidzie 9 i Compatibility Test Suite (CTS) oraz Vendor Test Suite (VTS) sprawdza, czy spełnione są następujące wymagania:

  • CONFIG_OF=y lub CONFIG_ACPI=y
  • Jądra w wersjach 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 w przypadku ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y lub CONFIG_ARM64_PAN=y

Dodatkowo opcja CONFIG_INET_UDP_DIAG musi być ustawiona na y w przypadku jądra systemu 4.9 na Androidzie 9 i nowszych.

Włącz opcje trybu hosta USB

W przypadku dźwięku 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

Dla trybu hosta USB MIDI włącz tę opcję:

CONFIG_SND_USB_MIDI=y

Seccomp BPF z TSYNC

Secure Computing Berkeley PacketFilter (Seccomp BPF) to zabezpieczenia jądra technologii, która umożliwia tworzenie piaskownicy definiujących kontekst który może wywoływać system. synchronizacji wątków (TSYNC), umożliwia korzystanie z Seccomp BPF z programów wielowątkowych. Ten możliwość jest ograniczona do architektur z obsługą Seccomp nadrzędnych (ARM, ARM64, x86 i x86_64).

Demon blokady na żywo na Androidzie

Android 10 zawiera demona aktywnej blokady Androida (llkd), która służy do wychwytywania i ograniczania wzajemnych blokad jądra. Więcej informacji o korzystaniu z llkd znajdziesz tutaj: Demon Live Lock na Androida

vDSO32 w ARM64

Wirtualny, dynamiczny obiekt udostępniany (Virtual Dynamic Shared Object, vDSO) to alternatywa dla wywołań systemowych, które: prawidłowo skonfigurowane i użyte, mogą zmniejszyć koszty cyklu. Android, 10 dodaje obsługę vDSO32 w 64-bitowych jądrach (Android obsługuje już wersję vDSO64 w 64-bitowych jądrach i vDSO32 w 32-bitowych jądrach. Zastosowanie vDSO32 (CONFIG_VDSO_COMPAT) w architekturze ARM64 zapewnia Wydłużenie czasu pracy na baterii o 0,4% i inne ulepszenia wydajności.

Społeczność użytkowników Linuksa aktywnie pracuje nad ujednolicanie instancji 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 triolem kompilatora arm32. Zespół jądra Androida przesłał wstecz starsze wersje serii poprawek vDSO. w urządzeniach Pixel, dzięki czemu znajdziesz przykłady w kompilacjach jądra systemu Pixel (LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN ścieżka, odwołanie do CROSS_COMPILE_ARM32, 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 ma miejsce, gdy proces lub jądro próbuje przydzielić stronę (bezpośrednio lub z powodu błędu na nowej stronie), a jądro ma wykorzystano całą dostępną wolną pamięć. Wymaga to zablokowania alokacji przez jądro podczas przeglądania strony. To z kolei często wymaga wejścia/wyjścia dysku, aby wyczyścić czysta strona utrzymywana z pliku lub poczekaj, aż lowmemorykiller zatrzyma proces tworzenia konta. Może to prowadzić do dodatkowego wejścia/wyjścia w każdym wątku, w tym wątku interfejsu użytkownika.

Aby uniknąć bezpośredniego odzyskiwania, jądro ma znaki wodne, które uruchamiają się kswapd lub odzyskanie tła. To jest wątek, w którym próbujemy by następnym razem, gdy zostanie przydzielony prawdziwy wątek, szybciej się to uda.

Domyślny próg aktywacji przywracania w tle jest dość niski i wynosi około 2 MB na urządzeniu o wielkości 2 GB i 636 KB na urządzeniu o wielkoś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, kliknij Direct reclaim.

Obsługa dostrajania jądra jest dodawana w gałęzi jądra Androida 3.4 jako patch 92189d47f66c67e5fd92eafaa287e153197a454f („dodaj dodatkowe wolne kbajty pamięci) tunable”). Wybór tej poprawki do jądra urządzenia umożliwia ActivityManager, aby poinformować jądro, aby starało się utrzymać 3 filmy pełnoekranowe Bufory pamięci o szybkości 32 bpp.

Te progi można skonfigurować za pomocą: config.xml platformy.

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

Dostrajanie LowMemoryKiller

ActivityManager konfiguruje progi LowMemoryKiller, aby spełnić oczekiwania zbioru roboczego strony wspierane przez pliki (strony w pamięci podręcznej) wymagane do uruchomienia procesów o poszczególnych priorytetach. zasobniku 100%. Jeśli urządzenie ma wysokie wymagania dotyczące zestawu roboczego, np. 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 obniżyć, jeśli zarezerwowana jest za dużo pamięci dla dzięki czemu procesy w tle są zatrzymywane na długo thrashing dysku może wystąpić, ponieważ pamięć podręczna staje się zbyt mała.

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