Sử dụng cài đặt cấu hình sau làm cơ sở cho cấu hình hạt nhân Android. Cài đặt được tổ chức thành các tệp .cfg
cho android-base
, android-base- ARCH
và android-recommended
:
- tùy 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 như được chỉ định bởi tất cả các thiết bị. - Tùy chọn
android-base- ARCH
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 như được chỉ định bởi tất cả các thiết bị của kiến trúc ARCH . Không phải tất cả các kiến trúc đều có một tệp tương ứng của 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ì cấu trúc đó không có yêu cầu cấu hình hạt nhân cụ thể cho kiến trúc bổ sung 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 các thiết bị.
Các tệp 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 của hạt nhân bạn đang sử dụng.
Để biết chi tiết về các điều khiển đã đượ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 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 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 để kích hoạ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 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 với các tính năng Android được bật.
Yêu cầu cấu hình hạt nhân 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 của Android. Các phần phụ thuộc như vậy không thể được thể hiện trong các tệp phân mảnh 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 khả năng tương thích (CTS) và 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ặcCONFIG_ACPI=y
- Các hạt nhân 4.4 và 4.9 có
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
HOẶC có cảCONFIG_MEMCG=y
vàCONFIG_MEMCG_SWAP=y
-
CONFIG_DEBUG_RODATA=y
hoặcCONFIG_STRICT_KERNEL_RWX=y
-
CONFIG_DEBUG_SET_MODULE_RONX=y
hoặcCONFIG_STRICT_MODULE_RWX=y
- Chỉ dành cho ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
hoặcCONFIG_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 MIDI ở chế độ máy chủ USB, hãy bật tùy chọn sau:
CONFIG_SND_USB_MIDI=y
Seccomp BPF với TSYNC
Bộ lọc gói Berkeley của máy tính bảo mật (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 ngữ cảnh trong đó quá 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 bị giới hạn đối với các kiến trúc có Seccomp hỗ trợ ngược dòng (ARM, ARM64, x86 và x86_64).
Android Live-Lock Daemon
Android 10 bao gồm Android Live-Lock Daemon ( llkd
), được thiết kế để bắt và giảm thiểu các bế tắc của hạt nhân. Để 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, khi được sử dụng và định 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 thời lượng pin 0,4% 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 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_COMPAT
và CONFIG_CROSS_COMPILE_COMPAT_VDSO
với bộ ba trình biên dịch arm32. Nhóm Android Kernel đã hỗ trợ các phiên bản cũ hơn của loạt bản vá vDSO vào thiết bị Pixel, vì vậy bạn có thể tìm thấy các ví dụ trong bản dựng nhân Pixel ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
, đường dẫn 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 yêu cầu trực tiếp
Thu hồi trực tiếp xảy ra khi một tiến trình hoặc hạt nhân cố gắng cấp phát 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 yêu cầu hạt nhân chặn phân bổ trong khi nó giải phóng một trang. Do đó, điều này thường yêu cầu I / O đĩa phải xóa một trang được hỗ trợ bởi tệp bẩn hoặc đợi lowmemorykiller
dừng một quá trình. Điều này có thể dẫn đến I / O bổ sung trong bất kỳ chuỗi nào, bao gồm cả chuỗi giao diện người dùng.
Để tránh lấy lại trực tiếp, hạt nhân có các hình mờ kích hoạt kswapd
hoặc lấy lại nền. Đây là một chuỗi cố gắng giải phóng các trang để lần tiếp theo một chuỗi thực phân bổ, nó có thể thành công nhanh chóng.
Ngưỡng mặc định để kích hoạt xác nhận 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. Kernel chỉ lấy lại một vài megabyte bộ nhớ trong quá trình 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 trực tiếp.
Hỗ trợ cho kernel có thể điều chỉnh được thêm vào nhánh kernel Android-3.4 dưới dạng bản vá 92189d47f66c67e5fd92eafaa287e153197a454f ("thêm kbyte miễn phí có thể điều chỉnh"). Cherry chọn bản vá này vào 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ữ trống bộ nhớ đệm 32 bpp toàn màn hì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>
Tune LowMemoryKiller
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ề bộ hoạt động của các trang được sao lưu tệp (các trang được lưu trong bộ nhớ cache) cần thiết để chạy các quy trình trong mỗi nhóm cấp độ ư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, chẳng hạn như 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ụ hơn đã được thêm vào, thì các ngưỡng có thể được tăng lên.
Các ngưỡng có thể được giảm xuống nếu dành quá nhiều bộ nhớ cho các trang được sao lưu bằng tệp, do đó, các quá trình nền sẽ bị giết rất lâu trước khi xảy ra sự cố đĩa do bộ nhớ cache 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>