內核配置

使用以下配置設置作為 Android 內核配置的基礎。設置被組織成.cfg文件,用於android-baseandroid-base- ARCHandroid-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=yCONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=yCONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=yCONFIG_STRICT_MODULE_RWX=y
  • 僅適用於 ARM64:CONFIG_ARM64_SW_TTBR0_PAN CONFIG_ARM64_SW_TTBR0_PAN=yCONFIG_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>