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