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

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

ข้อกำหนดเพิ่มเติมในการกำหนดค่าเคอร์เนล

ในบางกรณี ผู้ดูแลแพลตฟอร์มสามารถเลือกจากฟีเจอร์เคอร์เนลหลายรายการเพื่อตอบสนองความต้องการในการพึ่งพาของ 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 Packet Filter (Seccomp BPF) เป็นเทคโนโลยีการรักษาความปลอดภัยระดับเคอร์เนลที่ช่วยให้สร้างแซนด์บ็อกซ์ซึ่งกำหนดบริบทที่กระบวนการอาจเรียกใช้ระบบได้ ฟีเจอร์การซิงค์เธรด (TSYNC) ช่วยให้คุณใช้ Seccomp BPF จากโปรแกรมแบบหลายเธรดได้ ความสามารถนี้จำกัดไว้สำหรับสถาปัตยกรรมที่รองรับ Seccomp ในฝั่งที่ส่งออก (ARM, ARM64, x86 และ x86_64)

โปรแกรมอรรถประโยชน์การล็อกแบบเรียลไทม์ของ Android

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

เพิ่มการรองรับการปรับแต่งเคอร์เนลในสาขาเคอร์เนล Android-3.4 เป็นแพตช์ 92189d47f66c67e5fd92eafaa287e153197a454f ("เพิ่ม kbyte ว่างที่ปรับแต่งได้เพิ่มเติม") การเลือกแพตช์นี้มาใส่ในเคอร์เนลของอุปกรณ์จะช่วยให้ ActivityManager บอกเคอร์เนลให้พยายามเก็บบัฟเฟอร์หน่วยความจำแบบเต็มหน้าจอ 32 bpp ไว้ 3 รายการ

เกณฑ์เหล่านี้สามารถกําหนดค่าได้ด้วย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>