Cấu hình hạt nhân

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

  • tùy chọn android-base kích hoạt các tính năng cốt lõi của Android và phải được định cấu hình theo chỉ định của tất cả các thiết bị.
  • Tùy chọn android-base- ARCH kích hoạt các tính năng cốt lõi của Android và phải được định cấu hình theo chỉ định của tất cả các thiết bị có kiến ​​trúc ARCH . Không phải tất cả các kiến ​​trúc đều có tệp tương ứng gồm các tùy chọn bắt buộc dành riêng cho kiến ​​trúc. Nếu kiến ​​trúc của bạn không có tệp thì kiến ​​trúc đó sẽ không có các yêu cầu cấu hình kernel dành riêng cho kiến ​​trúc bổ sung dành cho Android.
  • android-recommended . Các tùy chọn này kích hoạt các tính năng nâng cao của Android và là tùy chọn cho thiết bị.

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

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

Tạo cấu hình kernel

Đố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 tùy 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 tệp .config mà bạn có thể sử dụng để lưu tệp defconfig mới hoặc biên dịch hạt nhân mới có bật các tính năng của Android.

Yêu cầu cấu hình kernel bổ sung

Trong một số trường hợp, người bảo trì nền tảng có thể chọn từ nhiều tính năng hạt nhân để đáp ứng sự phụ thuộc vào Android. Những 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 cho các tệp đó không hỗ trợ các biểu thức logic. Trong Android 9 trở lên, Bộ kiểm tra tương thích (CTS)Bộ kiểm tra nhà cung cấp (VTS) xác minh rằng các yêu cầu sau đượ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, tùy chọn CONFIG_INET_UDP_DIAG phải được đặt thành y cho hạt nhân 4.9 trong Android 9 trở lên.

Bật tùy chọn chế độ máy chủ USB

Đối với âm thanh chế độ máy chủ USB, hãy bật các tùy 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 chế độ máy chủ USB MIDI, hãy bật tùy chọn sau:

CONFIG_SND_USB_MIDI=y

Seccomp BPF với TSYNC

Bộ lọc gói tin máy tính an toàn Berkeley (Seccomp BPF) là một công nghệ bảo mật hạt nhân cho phép tạo các hộp cát xác định bối cảnh trong đó một quy trình có thể thực hiện các lệnh gọi hệ thống. Tính năng đồng bộ hóa 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 được giới hạn ở các kiến ​​trúc có hỗ trợ ngược dòng của Seccomp (ARM, ARM64, x86 và x86_64).

Daemon khóa trực tiếp của Android

Android 10 bao gồm Android Live-Lock Daemon ( llkd ), được thiết kế để phát hiện và giảm thiểu tình trạng bế tắc trong kernel. Để biết chi tiết về cách sử dụng llkd , hãy tham khảo Android Live-Lock Daemon .

vDSO32 trên ARM64

Đối tượng chia sẻ động ảo (vDSO) là một giải pháp thay thế cho các lệnh gọi hệ thống mà khi được sử dụng và đặt cấu hình đúng cách có thể giảm chi phí chu kỳ. Android 10 bổ sung hỗ trợ vDSO32 trên hạt nhân 64 bit (Android đã hỗ trợ vDSO64 trên hạt nhân 64 bit và vDSO32 trên hạt nhân 32 bit). Sử dụng vDSO32 ( CONFIG_VDSO_COMPAT ) trên kiến ​​trúc ARM64 giúp tăng 0,4% thời lượng pin và các cải tiến hiệu suất khác.

Cộng đồng Linux đang tích cực làm việc để thống nhất các vDSO trên các kiến ​​trúc . Bạn có thể thiết lập vDSO trong nhân Linux của mình bằng cách bật vDSO32 với CONFIG_COMPATCONFIG_CROSS_COMPILE_COMPAT_VDSO với bộ ba trình biên dịch arm32. Nhóm Android Kernel đã chuyển các phiên bản cũ hơn của loạt bản vá vDSO sang 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 kernel Pixel ( đường dẫn LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , tham chiếu CROSS_COMPILE_ARM32 và cấu hình CONFIG_CROSS_COMPILE_ARM32 ).

Cấu hình RAM thấp

Điều chỉnh kernel/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 tiến trình hoặc kernel cố gắng phân bổ một trang bộ nhớ (trực tiếp hoặc do lỗi ở trang mới) và kernel đã sử dụng tất cả bộ nhớ trống có sẵn. Điều này yêu cầu kernel chặn việc phân bổ trong khi nó giải phóng một trang. Ngược lại, điều này thường yêu cầu I/O đĩa để xóa một trang được hỗ trợ tệp bẩn hoặc đợi lowmemorykiller dừng một quá trình. Điều này có thể dẫn đến có thêm I/O trong bất kỳ luồng nào, bao gồm cả luồng UI.

Để tránh việc lấy lại trực tiếp, kernel có các hình mờ kích hoạt kswapd hoặc lấy lại nền. Đây là một chủ đề cố gắng giải phóng các trang để lần phân bổ tiếp theo của một chủ đề thực sự, nó có thể thành công nhanh chóng.

Ngưỡng mặc định để kích hoạt xác nhận lại nền là 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ỉ lấy lại một vài megabyte bộ nhớ khi lấy lại nền. Điều này có nghĩa là bất kỳ quy trình nào nhanh chóng phân bổ nhiều hơn một vài megabyte sẽ nhanh chóng đạt được yêu cầu thu hồi trực tiếp.

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

Các ngưỡng này có thể được định cấu hình 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 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>

Điều chỉnh bộ nhớ thấpKiller

ActivityManager định cấu hình các ngưỡng của LowMemoryKiller để phù hợp với kỳ vọng của nó về tập hợp các trang được hỗ trợ tệp (trang được lưu trong bộ nhớ đệm) đang hoạt động cần thiết để chạy các quy trình trong từng nhóm mức độ ưu tiên. Nếu một thiết bị có yêu cầu cao đối với nhóm làm việc, 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 nhiều dịch vụ được thêm vào thì ngưỡng có thể tăng lên.

Các ngưỡng có thể được giảm xuống nếu có quá nhiều bộ nhớ được dành riêng cho các trang được hỗ trợ bằng tệp, do đó các tiến trình nền sẽ bị tắt từ lâu trước khi xảy ra hiện tượng đập đĩa do bộ nhớ đệm quá nhỏ.

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