ใช้การตั้งค่าการกำหนดค่าต่อไปนี้เป็นฐานสำหรับเคอร์เนล Android
การกำหนดค่า การตั้งค่าแบ่งออกเป็น .cfg
ไฟล์สำหรับ android-base
android-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
เปิดอยู่
ข้อกำหนดเพิ่มเติมในการกำหนดค่าเคอร์เนล
ในบางกรณี ผู้ดูแลแพลตฟอร์มสามารถเลือกจากหลายเคอร์เนล เพื่อตอบสนองทรัพยากร Dependency ของ Android ทรัพยากร Dependency ดังกล่าวไม่สามารถ ที่แสดงในไฟล์ Fragment การกำหนดค่าเคอร์เนล (อธิบายไว้ข้างต้น) เนื่องจาก สำหรับไฟล์เหล่านั้นไม่รองรับนิพจน์เชิงตรรกะ ใน 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
สำหรับ MIDI โหมดโฮสต์ USB ให้เปิดใช้ตัวเลือกต่อไปนี้
CONFIG_SND_USB_MIDI=y
Seccomp BPF พร้อม TSYNC
Secure Computing Berkeley PacketFilter (Seccomp BPF) เป็นการรักษาความปลอดภัยเคอร์เนล ที่ช่วยให้สามารถสร้างแซนด์บ็อกซ์ที่ระบุบริบทใน กระบวนการหนึ่งๆ อาจทำการเรียกใช้ระบบ การซิงค์ข้อมูลเทรด (TSYNC) ทำให้สามารถใช้ Seccomp BPF จากโปรแกรมที่มีหลายเธรด ช่วงเวลานี้ ความสามารถจำกัดเฉพาะสถาปัตยกรรมที่มี Seccomp รองรับอัปสตรีม (ARM, ARM64, x86 และ x86_64)
Daemon การล็อกสดบน Android
Android 10 มี Daemon ล็อกแบบสดของ Android
(llkd
) ซึ่งออกแบบมาเพื่อตรวจจับและลดการหยุดทำงานของเคอร์เนล
โปรดดูรายละเอียดการใช้ llkd
ที่
Daemon การล็อกสดบน Android
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
กับ 3 ตัวคอมไพเลอร์ arm32
ทีม Kernel ของ 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 เคอร์เนลจะเรียกคืนหน่วยความจำเพียง 2-3 เมกะไบต์ในการทำงานเบื้องหลัง ซึ่งหมายความว่า กระบวนการใดก็ตามที่จัดสรร 2-3 เมกะไบต์อย่างรวดเร็วได้อย่างรวดเร็ว กดการอ้างสิทธิ์โดยตรง
เพิ่มการสนับสนุนสำหรับการปรับแต่งเคอร์เนลในสาขาเคอร์เนลของ Android-3.4 เป็น
แพตช์ 92189d47f66c67e5fd92eafaa287e153197a454f ("เพิ่มกิโลไบต์ฟรีเพิ่มเติม
tunable ") การเลือกแพตช์นี้ไปยังเคอร์เนลของอุปกรณ์
ActivityManager
เพื่อบอกเคอร์เนลให้พยายามทำให้หน้าจอเต็ม 3 ภาพ
บัฟเฟอร์ 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>