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 arsitektur ARCH . Tidak semua arsitektur memiliki file yang sesuai dengan opsi khusus arsitektur yang diperlukan. Jika arsitektur Anda tidak memiliki file, arsitektur tersebut tidak memiliki persyaratan konfigurasi kernel khusus arsitektur tambahan untuk Android. -
android-recommended
. Opsi ini mengaktifkan fitur Android lanjutan dan opsional untuk perangkat.
File konfigurasi ini terletak di kernel/configs
repo. 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) .
Buat 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. Dependensi tersebut tidak dapat dinyatakan dalam file fragmen konfigurasi kernel (dijelaskan di atas) karena format untuk file tersebut tidak mendukung ekspresi logika. Di Android 9 dan yang lebih tinggi, Compatibility Test Suite (CTS) dan Vendor Test Suite (VTS) memverifikasi bahwa persyaratan berikut dipenuhi:
-
CONFIG_OF=y
atauCONFIG_ACPI=y
- Kernel 4.4 dan 4.9 memiliki
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
ATAU memilikiCONFIG_MEMCG=y
danCONFIG_MEMCG_SWAP=y
-
CONFIG_DEBUG_RODATA=y
atauCONFIG_STRICT_KERNEL_RWX=y
-
CONFIG_DEBUG_SET_MODULE_RONX=y
atauCONFIG_STRICT_MODULE_RWX=y
- Hanya untuk ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
atauCONFIG_ARM64_PAN=y
Selain itu, opsi CONFIG_INET_UDP_DIAG
harus disetel ke y
untuk kernel 4.9 di Android 9 dan yang 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
Secomp 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 utas (TSYNC) memungkinkan penggunaan Seccomp BPF dari program multithread. Kemampuan ini terbatas pada arsitektur yang mendukung upstream Seccomp (ARM, ARM64, x86, dan x86_64).
Android Live-Lock Daemon
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 pada ARM64
Objek bersama dinamis virtual (vDSO) adalah alternatif untuk 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). Menggunakan vDSO32 ( CONFIG_VDSO_COMPAT
) pada arsitektur ARM64 memberikan peningkatan 0,4 persen dalam masa pakai baterai dan peningkatan kinerja lainnya.
Komunitas Linux secara aktif bekerja untuk 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 compiler arm32. Tim Android Kernel telah mem-backport versi lama dari seri patch vDSO ke perangkat Pixel, sehingga Anda dapat menemukan contoh dalam build kernel Pixel ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
path, referensi CROSS_COMPILE_ARM32
, dan konfigurasi CONFIG_CROSS_COMPILE_ARM32
).
Konfigurasi RAM rendah
Tune kernel/ActivityManager untuk mengurangi reclaim langsung
Reklamasi 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. Ini membutuhkan kernel untuk memblokir alokasi saat membebaskan halaman. Ini pada gilirannya sering membutuhkan disk I/O untuk membersihkan halaman yang didukung file kotor atau menunggu lowmemorykiller
untuk menghentikan proses. Ini dapat menghasilkan I/O tambahan di utas apa pun, termasuk utas UI.
Untuk menghindari reclaim langsung, kernel memiliki watermark yang memicu kswapd
atau background reclaim. Ini adalah utas yang mencoba mengosongkan halaman sehingga lain kali utas nyata mengalokasikan, itu bisa berhasil dengan cepat.
Ambang 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 beberapa megabyte memori di latar belakang. Ini berarti setiap proses yang dengan cepat mengalokasikan lebih dari beberapa megabita akan dengan cepat mencapai perolehan langsung.
Dukungan untuk kernel tunable ditambahkan di cabang kernel Android-3.4 sebagai patch 92189d47f66c67e5fd92eafaa287e153197a454f ("tambahkan kbytes tunable ekstra gratis"). Cherry-picking patch ini ke kernel perangkat memungkinkan ActivityManager
memberi tahu kernel untuk mencoba menjaga tiga buffer 32 bpp layar penuh dari memori bebas.
Ambang batas ini dapat dikonfigurasi dengan kerangka kerja 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
mengonfigurasi ambang LowMemoryKiller
agar sesuai dengan harapannya dari kumpulan halaman yang didukung file (halaman yang di-cache) yang diperlukan untuk menjalankan proses di setiap bucket tingkat prioritas. Jika perangkat memiliki persyaratan tinggi untuk perangkat 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 dicadangkan untuk halaman yang didukung file, sehingga proses latar belakang dimatikan 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>