Cấu hình kernel

Sử dụng các chế độ cài đặt cấu hình sau làm cơ sở cho cấu hình nhân hệ điều hành Android. Các chế độ cài đặt được sắp xếp thành tệp .cfg cho android-base, android-base-ARCHandroid-recommended:

  • Các tuỳ chọn android-base cho phép các tính năng cốt lõi của Android và phải được định cấu hình theo quy định của tất cả thiết bị.
  • Các tuỳ chọn android-base-ARCH bật các tính năng cốt lõi của Android và phải được định cấu hình theo quy định của tất cả các thiết bị có cấu trúc ARCH. Không phải kiến trúc nào cũng có tệp tương ứng chứa các tuỳ chọn bắt buộc dành riêng cho kiến trúc. Nếu không có tệp, cấu trúc của bạn sẽ không có các yêu cầu bổ sung về cấu hình hạt nhân dành riêng cho cấu trúc cho Android.
  • android-recommended. Những tuỳ chọn này bật các tính năng nâng cao của Android và không bắt buộc đối với thiết bị.

Các tệp cấu hình này nằm trong kho lưu trữ kernel/configs. Sử dụng tập hợp tệp cấu hình tương ứng với phiên bản hạt nhân bạn đang sử dụng.

Để biết thông tin chi tiết về các biện pháp kiểm soát đã được thực hiện để tăng cường hạt nhân trên thiết bị của bạn, hãy xem phần Bảo mật hệ thống và hạt nhân. Để biết thông tin chi tiết về các chế độ cài đặt bắt buộc, hãy xem Tài liệu định nghĩa về khả năng tương thích với Android (CDD).

Tạo cấu hình hạt nhân

Đối với các thiết bị có định dạng defconfig tối giản, hãy sử dụng tập lệnh merge_config.sh trong cây nhân để bật các tuỳ chọn:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

Thao tác này sẽ tạo một tệp .config mà bạn có thể dùng để lưu tệp defconfig mới hoặc biên dịch một hạt nhân mới đã bật các tính năng Android.

Yêu cầu khác về cấu hình nhân kernel

Trong một số trường hợp, trình duy trì nền tảng có thể chọn trong số nhiều tính năng hạt nhân để đáp ứng một phần phụ thuộc Android. Các phần phụ thuộc như vậy không thể được biểu thị trong các tệp phân đoạn cấu hình hạt nhân (được mô tả ở trên) vì định dạng của các tệp đó không hỗ trợ biểu thức logic. Trong Android 9 trở lên, Bộ kiểm thử tính tương thích (CTS)Bộ kiểm thử nhà cung cấp (VTS) sẽ xác minh rằng các yêu cầu sau đây đã được đáp ứng:

  • CONFIG_OF=y hoặc CONFIG_ACPI=y
  • Hạt nhân 4.4 và 4.9 có CONFIG_ANDROID_LOW_MEMORY_KILLER=y HOẶC có cả CONFIG_MEMCG=yCONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y hoặc CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y hoặc CONFIG_STRICT_MODULE_RWX=y
  • Chỉ dành cho ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y hoặc CONFIG_ARM64_PAN=y

Ngoài ra, bạn phải đặt tuỳ chọn CONFIG_INET_UDP_DIAG thành y cho các hạt nhân 4.9 trong Android 9 trở lên.

Bật các tuỳ chọn chế độ máy chủ USB

Đối với âm thanh ở chế độ máy chủ USB, hãy bật các tuỳ chọn sau:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Đối với MIDI ở chế độ máy chủ USB, hãy bật tuỳ chọn sau:

CONFIG_SND_USB_MIDI=y

Seccomp BPF bằng TSYNC

Bộ lọc gói Berkeley của Secure Computing (Seccomp BPF) là một công nghệ bảo mật hạt nhân cho phép tạo hộp cát xác định ngữ cảnh mà một quy trình có thể thực hiện lệnh gọi hệ thống. Tính năng đồng bộ hoá luồng (TSYNC) cho phép sử dụng Seccomp BPF từ các chương trình đa luồng. Khả năng này chỉ giới hạn ở các kiến trúc có hỗ trợ Seccomp ngược dòng (ARM, ARM64, x86 và x86_64).

Trình nền khoá trực tiếp của Android

Android 10 bao gồm trình nền khoá trực tiếp Android (llkd) được thiết kế để phát hiện và giảm thiểu tình trạng tắc nghẽn hạt nhân. Để biết thông tin chi tiết về cách sử dụng llkd, hãy tham khảo trình nền khoá trực tiếp của Android.

vDSO32 trên ARM64

Đối tượng dùng chung động ảo (vDSO) là một giải pháp thay thế cho các lệnh gọi hệ thống. Khi được sử dụng và định cấu hình chính xác, đối tượng này có thể giảm chi phí chu kỳ. Android 10 hỗ trợ thêm vDSO32 trên nhân 64 bit (Android đã hỗ trợ vDSO64 trên nhân 64 bit và vDSO32 trên nhân 32 bit). Việc sử dụng vDSO32 (CONFIG_VDSO_COMPAT) trên kiến trúc ARM64 giúp tăng thời lượng pin 0,4% và các điểm cải thiện khác về hiệu suất.

Cộng đồng Linux đang tích cực nỗ lực để hợp nhất các vDSO trên nhiều cấu trúc. Bạn có thể thiết lập vDSO trong nhân Linux bằng cách bật vDSO32 bằng CONFIG_COMPATCONFIG_CROSS_COMPILE_COMPAT_VDSO với bộ ba trình biên dịch arm32. Nhóm nhân viên phát triển nhân hệ điều hành Android đã điều chỉnh các phiên bản cũ của loạt bản vá vDSO cho các thiết bị Pixel. Vì vậy, bạn có thể tìm thấy các ví dụ trong các bản dựng nhân hệ điều hành Pixel (đường dẫn LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN, tài liệu tham khảo CROSS_COMPILE_ARM32 và cấu hình CONFIG_CROSS_COMPILE_ARM32).

Cấu hình RAM thấp

Điều chỉnh nhân hệ điều hành và ActivityManager để giảm việc thu hồi trực tiếp

Việc thu hồi trực tiếp xảy ra khi một quy trình hoặc hạt nhân cố gắng phân bổ một trang bộ nhớ (trực tiếp hoặc do lỗi trong một trang mới) và hạt nhân đã sử dụng tất cả bộ nhớ trống có sẵn. Điều này đòi hỏi nhân hệ điều hành chặn quá trình phân bổ trong khi giải phóng một trang. Do đó, thường thì bạn cần phải thực hiện I/O trên ổ đĩa để xoá trang được sao lưu bằng tệp bị hỏng hoặc chờ lowmemorykiller dừng một quy trình. Điều này có thể dẫn đến việc tăng thêm I/O trong bất kỳ luồng nào, bao gồm cả luồng giao diện người dùng.

Để tránh việc xác nhận lại quyền sở hữu trực tiếp, nhân hệ điều hành có các hình mờ kích hoạt kswapd hoặc tính năng xác nhận lại trong nền. Đây là một luồng cố gắng giải phóng các trang để lần tiếp theo khi một luồng thực sự phân bổ, luồng đó có thể thành công nhanh chóng.

Ngưỡng mặc định để kích hoạt tính năng lấy lại bộ nhớ trong nền khá thấp, khoảng 2 MB trên thiết bị 2 GB và 636 KB trên thiết bị 512 MB. Hạt nhân chỉ thu hồi một vài megabyte bộ nhớ trong quá trình thu hồi ở chế độ nền. Điều này có nghĩa là mọi quy trình phân bổ nhanh hơn vài megabyte sẽ nhanh chóng được xác nhận lại trực tiếp.

Hỗ trợ cho một nhân có thể điều chỉnh được thêm vào nhánh nhân Android-3.4 dưới dạng bản vá 92189d47f66c67e5fd92eafaa287e153197a454f ("thêm kbyte miễn phí bổ sung có thể điều chỉnh"). Việc chọn lựa bản vá này cho hạt nhân của thiết bị cho phép ActivityManager yêu cầu hạt nhân cố gắng giữ cho ba vùng đệm bộ nhớ 32 bpp ở chế độ toàn màn hình được giải phóng.

Bạn có thể định cấu hình các ngưỡng này bằng khung 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>

Điều chỉnh LowMemoryKiller

ActivityManager định cấu hình các ngưỡng của LowMemoryKiller để khớp với kỳ vọng về nhóm hoạt động của các trang được sao lưu bằng tệp (trang được lưu vào bộ nhớ đệm) cần thiết để chạy các quy trình trong mỗi bộ chứa cấp độ ưu tiên. Nếu một thiết bị có yêu cầu cao đối với nhóm hoạt động, ví dụ: nếu giao diện người dùng của nhà cung cấp yêu cầu nhiều bộ nhớ hơn hoặc nếu thêm nhiều dịch vụ hơn, thì ngưỡng có thể được tăng lên.

Bạn có thể giảm ngưỡng nếu quá nhiều bộ nhớ được dành riêng cho các trang được sao lưu bằng tệp, để các quy trình trong nền bị tắt trước khi sự cố ổ đĩa xảy ra do bộ nhớ đệm quá nhỏ.

<!-- 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>