Gunakan setelan konfigurasi berikut sebagai dasar untuk konfigurasi kernel
Android. Setelan 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. - Opsi
android-base-ARCH
mengaktifkan fitur Android inti dan harus dikonfigurasi seperti yang ditentukan oleh semua perangkat arsitektur ARCH. Tidak semua arsitektur memiliki file opsi yang diperlukan khusus arsitektur yang sesuai. 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 bersifat opsional untuk perangkat.
File konfigurasi ini berada di repo
kernel/configs
. Gunakan kumpulan file konfigurasi yang sesuai dengan versi kernel yang Anda gunakan.
Untuk mengetahui detail tentang kontrol yang telah dilakukan untuk memperkuat kernel di perangkat Anda, lihat Keamanan sistem dan kernel. Untuk mengetahui detail setelan yang diperlukan, lihat Dokumen Definisi Kompatibilitas Android (CDD).
Membuat konfigurasi kernel
Untuk perangkat yang memiliki format defconfig
minimalis, gunakan
skrip merge_config.sh
di hierarki kernel untuk mengaktifkan opsi:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
Tindakan ini akan menghasilkan file .config
yang dapat Anda gunakan untuk menyimpan file
defconfig
baru atau mengompilasi kernel baru dengan fitur Android
diaktifkan.
Persyaratan konfigurasi kernel tambahan
Dalam beberapa kasus, pengelola platform dapat memilih dari beberapa fitur kernel untuk memenuhi dependensi Android. Dependensi tersebut tidak dapat dinyatakan dalam file fragmen konfigurasi kernel (dijelaskan di atas) karena format untuk file tersebut tidak mendukung ekspresi logis. Di Android 9 dan yang lebih baru, Compatibility Test Suite (CTS) dan Vendor Test Suite (VTS) memverifikasi bahwa persyaratan berikut terpenuhi:
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
- Khusus untuk ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
atauCONFIG_ARM64_PAN=y
Selain itu, opsi CONFIG_INET_UDP_DIAG
harus ditetapkan ke
y
untuk kernel 4.9 di Android 9 dan yang lebih tinggi.
Mengaktifkan 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 MIDI mode host USB, aktifkan opsi berikut:
CONFIG_SND_USB_MIDI=y
Seccomp BPF dengan TSYNC
Secure Computing Berkeley Packet Filter (Seccomp BPF) adalah teknologi keamanan kernel yang memungkinkan pembuatan sandbox yang menentukan konteks tempat proses dapat melakukan panggilan sistem. Fitur sinkronisasi thread (TSYNC) memungkinkan penggunaan Seccomp BPF dari program multi-thread. Kemampuan ini terbatas pada arsitektur yang memiliki dukungan Seccomp upstream (ARM, ARM64, x86, dan x86_64).
Daemon live-lock Android
Android 10 menyertakan daemon live-lock Android
(llkd
), yang dirancang untuk menangkap dan mengurangi deadlock kernel.
Untuk mengetahui detail tentang penggunaan llkd
, lihat
Android live-lock daemon.
vDSO32 di ARM64
Virtual dynamic shared object (vDSO) adalah alternatif untuk panggilan sistem yang,
jika 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 performa lainnya.
Komunitas Linux secara aktif berupaya
menyatukan vDSO
di seluruh arsitektur. Anda dapat menyiapkan vDSO di kernel Linux dengan mengaktifkan vDSO32 dengan CONFIG_COMPAT
dan CONFIG_CROSS_COMPILE_COMPAT_VDSO
dengan triplet compiler arm32.
Tim Android Kernel telah melakukan backport pada 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
Menyesuaikan kernel dan ActivityManager untuk mengurangi pengambil alihan langsung
Klaim langsung terjadi saat proses atau kernel mencoba mengalokasikan halaman
memori (baik secara langsung maupun karena fault di halaman baru) dan kernel telah
menggunakan semua memori bebas yang tersedia. Hal ini mengharuskan kernel memblokir alokasi
saat mengosongkan halaman. Hal ini sering kali memerlukan I/O disk untuk menghapus
halaman yang didukung file kotor atau menunggu lowmemorykiller
menghentikan
proses. Hal ini dapat menyebabkan I/O tambahan di thread apa pun, termasuk thread UI.
Untuk menghindari pengambilan langsung, kernel memiliki watermark yang memicu
kswapd
atau pengambilan latar belakang. Ini adalah thread yang mencoba
memperbarui halaman sehingga saat thread sebenarnya dialokasikan lagi, thread tersebut dapat berhasil dengan cepat.
Batas default untuk memicu klaim balik di latar belakang cukup rendah, sekitar 2 MB pada perangkat 2 GB dan 636 KB pada perangkat 512 MB. Kernel hanya mengklaim kembali beberapa megabyte memori dalam pengklaiman kembali latar belakang. Artinya, setiap proses yang dengan cepat mengalokasikan lebih dari beberapa megabyte akan dengan cepat mencapai pengambil alihan langsung.
Dukungan untuk kernel yang dapat disesuaikan ditambahkan di cabang kernel Android-3.4 sebagai
patch 92189d47f66c67e5fd92eafaa287e153197a454f ("add extra free kbytes
tunable"). Dengan memilih patch ini ke kernel perangkat,
ActivityManager
dapat memberi tahu kernel agar mencoba menjaga tiga buffer memori
32 bpp layar penuh.
Nilai minimum ini dapat dikonfigurasi dengan framework
config.xml
.
<!-- 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>
Menyesuaikan LowMemoryKiller
ActivityManager
mengonfigurasi nilai minimum
LowMemoryKiller
agar sesuai dengan ekspektasi set kerja
halaman yang didukung file (halaman yang di-cache) yang diperlukan untuk menjalankan proses di setiap bucket
tingkat prioritas. Jika perangkat memiliki persyaratan tinggi untuk set kerja, misalnya
jika UI vendor memerlukan lebih banyak memori atau jika lebih banyak layanan telah ditambahkan, nilai minimum dapat ditingkatkan.
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 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>