內核配置

使用以下配置設置作為 Android 內核配置的基礎。設置分為.cfg文件android-baseandroid-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=yCONFIG_ACPI=y
  • 4.4和4.9的內核具有CONFIG_ANDROID_LOW_MEMORY_KILLER=y OR兼得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

此外, CONFIG_INET_UDP_DIAG選項必須被設置為y在Android電子9和更高4.9內核。

啟用 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 守護進程

機器人10包括Android動態鎖守護程序( llkd ),其被設計成捕獲並減輕內核死鎖。有關使用細節llkd ,請參閱Android動態鎖守護進程

ARM64 上的 vDSO32

虛擬動態共享對象 (vDSO) 是系統調用的替代方案,如果使用和配置正確,可以降低週期成本。 Android 10 在 64 位內核上增加了對 vDSO32 的支持(Android 已經在 64 位內核上支持 vDSO64,在 32 位內核上支持 vDSO32)。使用vDSO32( CONFIG_VDSO_COMPAT上ARM64架構)提供了在電池壽命和其它性能方面的改進增加了0.4%。

Linux社區正在積極整個架構統一vDSOs 。您可以通過啟用vDSO32與設置在VDSO你的Linux內核CONFIG_COMPATCONFIG_CROSS_COMPILE_COMPAT_VDSO與ARM32編譯三重。 Android的核心團隊已經向後移植舊版本的補丁VDSO系列成像素的設備,所以你可以找到例子像素內核構建( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN路徑, CROSS_COMPILE_ARM32參考,並CONFIG_CROSS_COMPILE_ARM32配置)。

低內存配置

調整內核/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>