使用以下配置設置作為 Android 內核配置的基礎。設置被組織成.cfg
文件,用於android-base
、 android-base- ARCH
和android-recommended
:
-
android-base
選項啟用核心 Android 功能,應按照所有設備的指定進行配置。 -
android-base- ARCH
選項啟用核心 Android 功能,應按照架構ARCH的所有設備的規定進行配置。並非所有架構都有相應的架構特定所需選項文件。如果您的架構沒有文件,則它沒有針對 Android 的其他特定於架構的內核配置要求。 -
android-recommended
。這些選項啟用高級 Android 功能並且對於設備是可選的。
這些配置文件位於kernel/configs
存儲庫中。使用與您正在使用的內核版本相對應的配置文件集。
有關為加強設備內核而採取的控制措施的詳細信息,請參閱系統和內核安全性。有關所需設置的詳細信息,請參閱Android 兼容性定義文檔 (CDD) 。
生成內核配置
對於具有極簡defconfig
格式的設備,請使用內核樹中的merge_config.sh
腳本來啟用選項:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
這會生成一個.config
文件,您可以使用該文件保存新的defconfig
文件或編譯啟用 Android 功能的新內核。
額外的內核配置要求
在某些情況下,平台維護者可以從多個內核功能中進行選擇以滿足 Android 依賴項。這種依賴關係不能在內核配置片段文件(如上所述)中表達,因為這些文件的格式不支持邏輯表達式。在 Android 9 及更高版本中,兼容性測試套件 (CTS)和供應商測試套件 (VTS)驗證是否滿足以下要求:
-
CONFIG_OF=y
或 CONFIG_ACPI=CONFIG_ACPI=y
- 4.4 和 4.9 內核具有
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
或同時具有CONFIG_MEMCG=y
和CONFIG_MEMCG_SWAP=y
-
CONFIG_DEBUG_RODATA=y
或CONFIG_STRICT_KERNEL_RWX=y
-
CONFIG_DEBUG_SET_MODULE_RONX=y
或CONFIG_STRICT_MODULE_RWX=y
- 僅適用於 ARM64:CONFIG_ARM64_SW_TTBR0_PAN
CONFIG_ARM64_SW_TTBR0_PAN=y
或CONFIG_ARM64_PAN=y
此外,對於 Android 9 及更高版本中的 4.9 內核, CONFIG_INET_UDP_DIAG
選項必須設置為y
。
啟用 USB 主機模式選項
對於 USB 主機模式音頻,啟用以下選項:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
對於 USB 主機模式 MIDI,啟用以下選項:
CONFIG_SND_USB_MIDI=y
Seccomp BPF 與 TSYNC
Secure Computing Berkeley Packet Filter (Seccomp BPF) 是一種內核安全技術,可以創建沙箱,定義進程可能進行系統調用的上下文。線程同步 (TSYNC) 功能允許在多線程程序中使用 Seccomp BPF。此功能僅限於支持上游 Seccomp 的架構(ARM、ARM64、x86 和 x86_64)。
Android Live-Lock 守護進程
Android 10 包含 Android Live-Lock Daemon ( llkd
),旨在捕獲和緩解內核死鎖。有關使用llkd
的詳細信息,請參閱Android Live-Lock Daemon 。
ARM64 上的 vDSO32
虛擬動態共享對象 (vDSO) 是系統調用的替代方案,如果使用和配置正確,可以降低週期成本。 Android 10 在 64 位內核上增加了對 vDSO32 的支持(Android 已經在 64 位內核上支持 vDSO64,在 32 位內核上支持 vDSO32)。在 ARM64 架構上使用 vDSO32 ( CONFIG_VDSO_COMPAT
) 可將電池壽命延長 0.4% 並提高其他性能。
Linux 社區正在積極致力於跨架構統一 vDSO 。您可以通過啟用帶有CONFIG_COMPAT
的 vDSO32 和帶有 arm32 編譯器三元組的CONFIG_CROSS_COMPILE_COMPAT_VDSO
來在 Linux 內核中設置 vDSO。 Android 內核團隊已將舊版本的 vDSO 補丁系列反向移植到 Pixel 設備中,因此您可以在 Pixel 內核構建中找到示例( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
路徑、 CROSS_COMPILE_ARM32
參考和CONFIG_CROSS_COMPILE_ARM32
配置)。
低 RAM 配置
調整內核/ActivityManager 以減少直接回收
當進程或內核嘗試分配內存頁面(直接或由於新頁面中的錯誤)並且內核已使用所有可用的空閒內存時,會發生直接回收。這要求內核在釋放頁面時阻止分配。這通常需要磁盤 I/O 來清除臟文件支持的頁面或等待lowmemorykiller
停止進程。這可能會導致任何線程(包括 UI 線程)中出現額外的 I/O。
為避免直接回收,內核具有觸發kswapd
或後台回收的水印。這是一個嘗試釋放頁面的線程,因此下一次真正的線程分配時,它可以很快成功。
觸發後台回收的默認閾值相當低,在 2 GB 設備上約為 2 MB,在 512 MB 設備上約為 636 KB。內核在後台回收中僅回收幾兆字節的內存。這意味著任何快速分配超過幾兆字節的進程都將快速命中直接回收。
Android-3.4 內核分支中添加了對內核可調參數的支持,作為補丁 92189d47f66c67e5fd92eafaa287e153197a454f(“添加額外的可用千字節可調參數”)。選擇這個補丁到設備的內核允許ActivityManager
告訴內核嘗試保持三個全屏 32 bpp 緩衝區的空閒內存。
這些閾值可以使用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>
調低內存殺手
ActivityManager
配置LowMemoryKiller
的閾值,以匹配其對運行每個優先級存儲桶中的進程所需的文件支持頁面(緩存頁面)的工作集的期望。如果設備對工作集的要求很高,例如供應商 UI 需要更多內存或添加了更多服務,則可以提高閾值。
如果為文件支持的頁面保留了太多內存,則可以降低閾值,以便在由於緩存變得太小而導致磁盤抖動發生之前很久就殺死後台進程。
<!-- 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>