ใช้การตั้งค่าการกำหนดค่าต่อไปนี้เป็นฐานสำหรับการกำหนดค่าเคอร์เนล Android การตั้งค่าจัดเป็นไฟล์ .cfg
สำหรับ android-base
, android-base- ARCH
และ android-recommended
:
- ตัวเลือก
android-base
เปิดใช้งานคุณสมบัติหลักของ Android และควรกำหนดค่าตามที่ระบุโดยอุปกรณ์ทั้งหมด - ตัวเลือก
android-base- ARCH
เปิดใช้งานคุณสมบัติหลักของ Android และควรกำหนดค่าตามที่ระบุโดยอุปกรณ์ทั้งหมดของสถาปัตยกรรม ARCH ไม่ใช่ทุกสถาปัตยกรรมที่มีไฟล์ที่สอดคล้องกันของตัวเลือกที่จำเป็นสำหรับสถาปัตยกรรมเฉพาะ หากสถาปัตยกรรมของคุณไม่มีไฟล์ แสดงว่าไม่มีข้อกำหนดการกำหนดค่าเคอร์เนลเฉพาะสถาปัตยกรรมเพิ่มเติมสำหรับ Android -
android-recommended
ตัวเลือกเหล่านี้เปิดใช้งานคุณลักษณะขั้นสูงของ Android และเป็นทางเลือกสำหรับอุปกรณ์
ไฟล์คอนฟิกูเรชันเหล่านี้อยู่ใน kernel/configs
repo ใช้ชุดของไฟล์คอนฟิกูเรชันที่สอดคล้องกับเวอร์ชันของเคอร์เนลที่คุณใช้อยู่
สำหรับรายละเอียดเกี่ยวกับการควบคุมที่ดำเนินการไปแล้วเพื่อเพิ่มความแข็งแกร่งให้กับเคอร์เนลบนอุปกรณ์ของคุณ โปรดดูที่ ความปลอดภัยของระบบและเคอร์เนล สำหรับรายละเอียดเกี่ยวกับการตั้งค่าที่จำเป็น โปรดดู เอกสารข้อกำหนดความเข้ากันได้ของ 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=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 Daemon
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 เปอร์เซ็นต์และการปรับปรุงประสิทธิภาพอื่นๆ
ชุมชนลีนุกซ์กำลังทำงานอย่างแข็งขันใน การรวม vDSOs ข้ามสถาปัตยกรรม ต่างๆ คุณสามารถตั้งค่า vDSO ในเคอร์เนล Linux ได้โดยเปิดใช้งาน vDSO32 ด้วย CONFIG_COMPAT
และ CONFIG_CROSS_COMPILE_COMPAT_VDSO
ด้วยคอมไพเลอร์ arm32 สามตัว ทีมงาน Android Kernel ได้ backported เวอร์ชันเก่าของ vDSO patch series ลงในอุปกรณ์ Pixel ดังนั้นคุณจึงสามารถดูตัวอย่างได้ใน Pixel kernel builds ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
เส้นทาง CROSS_COMPILE_ARM32
อ้างอิง และ CONFIG_CROSS_COMPILE_ARM32
config)
การกำหนดค่า 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>