การกำหนดค่าเคอร์เนล

ใช้การตั้งค่าการกำหนดค่าต่อไปนี้เป็นพื้นฐานสำหรับการกำหนดค่าเคอร์เนล Android การตั้งค่าจะถูกจัดเป็นไฟล์ .cfg สำหรับ android-base , android-base- ARCH และ android-recommended :

  • ตัวเลือก android-base จะเปิดใช้งานคุณสมบัติหลักของ Android และควรกำหนดค่าตามที่ระบุโดยอุปกรณ์ทั้งหมด
  • ตัวเลือก android-base- ARCH เปิดใช้งานคุณสมบัติหลักของ Android และควรกำหนดค่าตามที่ระบุโดยอุปกรณ์ทั้งหมดของสถาปัตยกรรม ARCH ไม่ใช่ทุกสถาปัตยกรรมจะมีไฟล์ตัวเลือกที่จำเป็นเฉพาะสถาปัตยกรรมที่สอดคล้องกัน หากสถาปัตยกรรมของคุณไม่มีไฟล์ จะไม่มีข้อกำหนดการกำหนดค่าเคอร์เนลเฉพาะสถาปัตยกรรมเพิ่มเติมสำหรับ Android
  • android-recommended ตัวเลือกเหล่านี้เปิดใช้งานคุณสมบัติขั้นสูงของ Android และเป็นทางเลือกสำหรับอุปกรณ์

ไฟล์การกำหนดค่าเหล่านี้อยู่ใน repo 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=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=y หรือ CONFIG_ARM64_PAN=y

นอกจากนี้ ต้องตั้งค่าตัวเลือก CONFIG_INET_UDP_DIAG เป็น y สำหรับเคอร์เนล 4.9 ใน Android 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 ภูต

Android 10 มี Android Live-Lock Daemon ( llkd ) ซึ่งออกแบบมาเพื่อตรวจจับและลดการหยุดชะงักของเคอร์เนล สำหรับรายละเอียดเกี่ยวกับการใช้ llkd โปรดดูที่ Android Live-Lock Daemon

vDSO32 บน ARM64

Virtual Dynamic Shared Object (vDSO) เป็นอีกทางเลือกหนึ่งแทนการเรียกของระบบ ซึ่งเมื่อใช้และกำหนดค่าอย่างถูกต้อง จะสามารถลดต้นทุนวงจรได้ Android 10 เพิ่มการรองรับ vDSO32 บนเคอร์เนล 64 บิต (Android รองรับ vDSO64 บนเคอร์เนล 64 บิตและ vDSO32 บนเคอร์เนล 32 บิตแล้ว) การใช้ vDSO32 ( CONFIG_VDSO_COMPAT ) บนสถาปัตยกรรม ARM64 ช่วยให้อายุการใช้งานแบตเตอรี่เพิ่มขึ้น 0.4 เปอร์เซ็นต์และการปรับปรุงประสิทธิภาพอื่นๆ

ชุมชน Linux กำลังทำงานอย่างแข็งขันเพื่อ รวม vDSO ไว้ในสถาปัตยกรรมต่างๆ คุณสามารถตั้งค่า vDSO ในเคอร์เนล Linux ของคุณได้โดยเปิดใช้งาน vDSO32 ด้วย CONFIG_COMPAT และ CONFIG_CROSS_COMPILE_COMPAT_VDSO ด้วย triplet คอมไพเลอร์ arm32 ทีมเคอร์เนล Android ได้แบ็คพอร์ตชุดแพทช์ vDSO เวอร์ชันเก่าไปยังอุปกรณ์ Pixel แล้ว คุณจึงสามารถค้นหาตัวอย่างได้ในบิวด์เคอร์เนลของ Pixel (เส้นทาง LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , การอ้างอิง CROSS_COMPILE_ARM32 และการกำหนดค่า CONFIG_CROSS_COMPILE_ARM32 )

การกำหนดค่า RAM ต่ำ

ปรับแต่งเคอร์เนล/ActivityManager เพื่อลดการเรียกคืนโดยตรง

การเรียกคืนโดยตรงเกิดขึ้นเมื่อกระบวนการหรือเคอร์เนลพยายามจัดสรรเพจของหน่วยความจำ (ไม่ว่าโดยตรงหรือเนื่องจากข้อบกพร่องในหน้าใหม่) และเคอร์เนลได้ใช้หน่วยความจำว่างที่มีอยู่ทั้งหมด สิ่งนี้ต้องการให้เคอร์เนลบล็อกการจัดสรรในขณะที่เพิ่มพื้นที่ว่างในเพจ ซึ่งมักจะต้องใช้ดิสก์ I/O เพื่อล้างเพจที่สำรองไฟล์สกปรกออก หรือรอให้ lowmemorykiller หยุดกระบวนการ ซึ่งอาจส่งผลให้มี I/O พิเศษในเธรดใดๆ รวมถึงเธรด UI

เพื่อหลีกเลี่ยงการเรียกคืนโดยตรง เคอร์เนลจะมีลายน้ำที่ทริกเกอร์ kswapd หรือการเรียกคืนพื้นหลัง นี่คือเธรดที่พยายามเพิ่มพื้นที่ว่างเพจ ดังนั้นครั้งต่อไปที่เธรดจริงจัดสรร ก็สามารถสำเร็จได้อย่างรวดเร็ว

เกณฑ์เริ่มต้นในการทริกเกอร์การเรียกคืนพื้นหลังค่อนข้างต่ำ ประมาณ 2 MB บนอุปกรณ์ 2 GB และ 636 KB บนอุปกรณ์ 512 MB เคอร์เนลเรียกคืนหน่วยความจำเพียงไม่กี่เมกะไบต์ในการเรียกคืนในเบื้องหลัง ซึ่งหมายความว่ากระบวนการใดก็ตามที่จัดสรรพื้นที่มากกว่าสองสามเมกะไบต์อย่างรวดเร็วจะถูกเรียกคืนโดยตรงอย่างรวดเร็ว

มีการเพิ่มการรองรับการปรับแต่งเคอร์เนลในสาขาเคอร์เนล Android-3.4 เป็นแพตช์ 92189d47f66c67e5fd92eafaa287e153197a454f ("เพิ่ม kbytes ฟรีพิเศษที่ปรับแต่งได้") การเลือกแพตช์นี้ไปยังเคอร์เนลของอุปกรณ์ช่วยให้ 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>

ปรับแต่ง LowMemoryKiller

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>