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

ใช้การตั้งค่าการกำหนดค่าต่อไปนี้เป็นฐานสำหรับเคอร์เนล 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 Live-Lock

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

vDSO32 ใน ARM64

Virtual Dynamic Shared Object (vDSO) เป็นทางเลือกในการเรียกระบบที่ เมื่อใช้และกำหนดค่าอย่างถูกต้อง จะช่วยลดค่าใช้จ่ายเกี่ยวกับรอบการทำงานได้ แอนดรอยด์ 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 ต่ำ

ปรับแต่งเคอร์เนล/เครื่องมือจัดการกิจกรรมเพื่อลดการอ้างสิทธิ์โดยตรง

การเรียกคืนโดยตรงเกิดขึ้นเมื่อกระบวนการหรือเคอร์เนลพยายามจัดสรรหน้า หน่วยความจำ (โดยตรงหรือเนื่องจากข้อบกพร่องในหน้าใหม่) และเคอร์เนล ใช้หน่วยความจำที่ว่างอยู่ทั้งหมด การดำเนินการนี้ต้องใช้เคอร์เนลเพื่อบล็อกการจัดสรร ในขณะที่ช่วยให้หน้าเว็บว่างขึ้น จึงมักจะต้องใช้ 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 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>