Konfigurasi Kernel

Gunakan pengaturan konfigurasi berikut sebagai dasar untuk konfigurasi kernel Android. Pengaturan diatur ke dalam file .cfg untuk android-base , android-base- ARCH , dan android-recommended :

  • opsi android-base mengaktifkan fitur inti Android dan harus dikonfigurasi seperti yang ditentukan oleh semua perangkat.
  • android-base- ARCH mengaktifkan fitur inti Android dan harus dikonfigurasi seperti yang ditentukan oleh semua perangkat berarsitektur ARCH . Tidak semua arsitektur memiliki file terkait opsi yang diperlukan khusus arsitektur. Jika arsitektur Anda tidak memiliki file, berarti arsitektur tersebut tidak memiliki persyaratan konfigurasi kernel khusus arsitektur tambahan untuk Android.
  • android-recommended . Opsi ini mengaktifkan fitur Android lanjutan dan bersifat opsional untuk perangkat.

File konfigurasi ini terletak di repo kernel/configs . Gunakan kumpulan file konfigurasi yang sesuai dengan versi kernel yang Anda gunakan.

Untuk detail tentang kontrol yang telah dilakukan untuk memperkuat kernel pada perangkat Anda, lihat Keamanan sistem dan kernel . Untuk detail tentang pengaturan yang diperlukan, lihat Dokumen Definisi Kompatibilitas Android (CDD) .

Hasilkan konfigurasi kernel

Untuk perangkat yang memiliki format defconfig minimalis, gunakan skrip merge_config.sh di pohon kernel untuk mengaktifkan opsi:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

Ini menghasilkan file .config yang dapat Anda gunakan untuk menyimpan file defconfig baru atau mengkompilasi kernel baru dengan fitur Android diaktifkan.

Persyaratan konfigurasi kernel tambahan

Dalam beberapa kasus, pengelola platform dapat memilih dari beberapa fitur kernel untuk memenuhi ketergantungan Android. Ketergantungan tersebut tidak dapat dinyatakan dalam file fragmen konfigurasi kernel (dijelaskan di atas) karena format file tersebut tidak mendukung ekspresi logis. Di Android 9 dan lebih tinggi, Compatibility Test Suite (CTS) dan Vendor Test Suite (VTS) memverifikasi bahwa persyaratan berikut dipenuhi:

  • CONFIG_OF=y atau CONFIG_ACPI=y
  • Kernel 4.4 dan 4.9 memiliki CONFIG_ANDROID_LOW_MEMORY_KILLER=y ATAU memiliki CONFIG_MEMCG=y dan CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y atau CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y atau CONFIG_STRICT_MODULE_RWX=y
  • Hanya untuk ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y atau CONFIG_ARM64_PAN=y

Selain itu, opsi CONFIG_INET_UDP_DIAG harus disetel ke y untuk kernel 4.9 di Android 9 dan lebih tinggi.

Aktifkan opsi mode host USB

Untuk audio mode host USB, aktifkan opsi berikut:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Untuk mode host USB MIDI, aktifkan opsi berikut:

CONFIG_SND_USB_MIDI=y

Pisahkan BPF dengan TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) adalah teknologi keamanan kernel yang memungkinkan pembuatan kotak pasir yang menentukan konteks di mana suatu proses dapat melakukan panggilan sistem. Fitur sinkronisasi thread (TSYNC) memungkinkan penggunaan Seccomp BPF dari program multithread. Kemampuan ini terbatas pada arsitektur yang memiliki dukungan upstream Seccomp (ARM, ARM64, x86, dan x86_64).

Daemon Live-Lock Android

Android 10 menyertakan Android Live-Lock Daemon ( llkd ), yang dirancang untuk menangkap dan mengurangi kebuntuan kernel. Untuk detail tentang penggunaan llkd , lihat Android Live-Lock Daemon .

vDSO32 di ARM64

Objek bersama dinamis virtual (vDSO) adalah alternatif panggilan sistem yang, bila digunakan dan dikonfigurasi dengan benar, dapat mengurangi biaya siklus. Android 10 menambahkan dukungan untuk vDSO32 pada kernel 64-bit (Android sudah mendukung vDSO64 pada kernel 64-bit dan vDSO32 pada kernel 32-bit). Penggunaan vDSO32 ( CONFIG_VDSO_COMPAT ) pada arsitektur ARM64 memberikan peningkatan masa pakai baterai sebesar 0,4 persen dan peningkatan kinerja lainnya.

Komunitas Linux secara aktif berupaya menyatukan vDSO di seluruh arsitektur . Anda dapat mengatur vDSO di kernel Linux Anda dengan mengaktifkan vDSO32 dengan CONFIG_COMPAT dan CONFIG_CROSS_COMPILE_COMPAT_VDSO dengan triplet kompiler arm32. Tim Kernel Android telah mem-backport versi lama seri patch vDSO ke perangkat Pixel, sehingga Anda dapat menemukan contoh dalam build kernel Pixel (jalur LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , referensi CROSS_COMPILE_ARM32 , dan konfigurasi CONFIG_CROSS_COMPILE_ARM32 ).

Konfigurasi RAM rendah

Sesuaikan kernel/ActivityManager untuk mengurangi klaim langsung

Reclaim langsung terjadi ketika suatu proses atau kernel mencoba mengalokasikan halaman memori (baik secara langsung atau karena kesalahan pada halaman baru) dan kernel telah menggunakan semua memori bebas yang tersedia. Hal ini mengharuskan kernel untuk memblokir alokasi saat mengosongkan halaman. Hal ini pada gilirannya sering kali memerlukan I/O disk untuk membersihkan halaman kotor yang didukung file atau menunggu lowmemorykiller menghentikan proses. Hal ini dapat mengakibatkan I/O tambahan di thread mana pun, termasuk thread UI.

Untuk menghindari pengambilan kembali secara langsung, kernel memiliki tanda air yang memicu kswapd atau pengambilan kembali latar belakang. Ini adalah thread yang mencoba untuk mengosongkan halaman sehingga pada saat thread asli mengalokasikannya, thread tersebut dapat berhasil dengan cepat.

Ambang batas default untuk memicu pengambilan kembali latar belakang cukup rendah, sekitar 2 MB pada perangkat 2 GB dan 636 KB pada perangkat 512 MB. Kernel hanya mengambil kembali beberapa megabita memori saat mengambil kembali latar belakang. Ini berarti setiap proses yang dengan cepat mengalokasikan lebih dari beberapa megabyte akan segera mendapatkan keuntungan langsung.

Dukungan untuk kernel merdu ditambahkan di cabang kernel Android-3.4 sebagai patch 92189d47f66c67e5fd92eafaa287e153197a454f ("tambahkan kbytes gratis tambahan yang dapat disetel"). Memilih patch ini ke kernel perangkat memungkinkan ActivityManager memberi tahu kernel untuk mencoba menjaga tiga buffer memori 32 bpp layar penuh tetap bebas.

Ambang batas ini dapat dikonfigurasi dengan kerangka 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>

Lagu LowMemoryKiller

ActivityManager mengonfigurasi ambang batas LowMemoryKiller agar sesuai dengan ekspektasinya terhadap kumpulan halaman yang didukung file (halaman cache) yang diperlukan untuk menjalankan proses di setiap keranjang tingkat prioritas. Jika perangkat memiliki persyaratan yang tinggi untuk rangkaian kerja, misalnya jika UI vendor memerlukan lebih banyak memori atau jika lebih banyak layanan telah ditambahkan, ambang batas dapat ditingkatkan.

Ambang batas dapat dikurangi jika terlalu banyak memori yang dicadangkan untuk halaman yang didukung file, sehingga proses latar belakang dihentikan jauh sebelum disk thrashing terjadi karena cache menjadi terlalu kecil.

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