核心設定

請使用下列配置設定,做為 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 以上版本中,Compatibility Test Suite (CTS)Vendor Test Suite (VTS) 會驗證是否符合下列要求:

  • CONFIG_OF=yCONFIG_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=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

使用 TSYNC 的 Seccomp BPF

Secure Computing Berkeley Packet Filter (Seccomp BPF) 是一項核心安全性技術,可讓您建立沙箱,定義程序可進行系統呼叫的情況。執行緒同步 (TSYNC) 功能可讓您在多執行緒程式中使用 Seccomp BPF。這項功能僅適用於上游支援 Seccomp 的架構 (ARM、ARM64、x86 和 x86_64)。

Android 即時鎖定 Daemon

Android 10 包含 Android 即時鎖定守護程式 (llkd),旨在擷取及減輕核心死結。如要進一步瞭解如何使用 llkd,請參閱「Android 即時鎖定守護程式」。

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。在背景回收記憶體時,核心只會回收幾 MB 的記憶體。也就是說,任何快速分配超過幾兆位元組的程序都會快速觸發直接回收。

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

調整 LowMemoryKiller

ActivityManager 會設定 LowMemoryKiller 的閾值,以符合其對工作集的預期,這個工作集是指在各個優先順序值區中執行程序所需的檔案支援頁面 (快取頁面)。如果裝置對工作集有嚴格要求,例如供應商 UI 需要更多記憶體,或已新增更多服務,則可以提高閾值。

如果為檔案支援的頁面保留過多記憶體,可以降低閾值,這樣在快取太小而導致磁碟雜訊時,系統會提早終止背景程序。

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