Sử dụng các chế độ cài đặt cấu hình sau làm cơ sở cho nhân hệ điều hành Android
. Cài đặt được sắp xếp thành .cfg
tệp cho android-base
,
android-base-ARCH
và
android-recommended
:
- Các tuỳ chọn của
android-base
bật các tính năng chính của Android và phải được định cấu hình theo chỉ định của tất cả thiết bị. android-base-ARCH
tuỳ chọn bật Core các tính năng của Android và phải được định cấu hình theo chỉ định của tất cả thiết bị của cấu trúc ARCH. Không phải mọi cấu trúc đều có tệp tương ứng các tuỳ chọn bắt buộc dành riêng cho từng cấu trúc. Nếu kiến trúc của bạn không có một tệp, tệp này không có cấu hình hạt nhân dành riêng cho từng cấu trúc bổ sung dành cho Android.android-recommended
. Các tuỳ chọn này bật tính năng Android nâng cao và là không bắt buộc đối với thiết bị.
Những tệp cấu hình này nằm trong
kernel/configs
kho lưu trữ. Sử dụng tập hợp tệp cấu hình tương ứng với phiên bản của
nhân hệ điều hành bạn đang 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 để củng cố hạt nhân trên thiết bị, hãy xem phần Hệ thống và nhân hệ điều hành. Để biết 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 nhân hệ điều hành
Đố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 mới
Tệp defconfig
hoặc biên dịch một nhân hệ điều hành mới bằng các tính năng của Android
bật.
Yêu cầu khác về cấu hình nhân kernel
Trong một số trường hợp, đơn vị bảo trì nền tảng có thể chọn trong số nhiều nhân để đáp ứng phần phụ thuộc Android. Những phần phụ thuộc như vậy không thể được biểu thị trong tệp phân đoạn cấu hình nhân (được mô tả ở trên) vì cho các tệp đó không hỗ trợ biểu thức logic. Trong Android 9 và cao hơn, Bộ kiểm tra tính tương thích (CTS) và Bộ thử nghiệm dành cho nhà cung cấp (VTS) xác minh rằng các yêu cầu sau:
CONFIG_OF=y
hoặcCONFIG_ACPI=y
- 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, tuỳ chọn CONFIG_INET_UDP_DIAG
phải được đặt 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ế độ hỗ trợ USB
Đối với âm thanh ở chế độ hỗ trợ 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 điện toán bảo mật Berkeley (Seccomp BPF) là một biện pháp bảo mật hạt nhân công nghệ cho phép tạo hộp cát để xác định bối cảnh trong một quy trình có thể thực hiện lệnh gọi hệ thống. Đồng bộ hoá luồng (TSYNC) cho phép sử dụng Seccomp BPF trong các chương trình đa luồng. Chiến dịch này khả năng bị 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 có trình nền Android-lock
(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 lệnh gọi hệ thống
khi được sử dụng và định cấu hình đúng cách có thể giúp giảm chi phí theo chu kỳ. của Android
10 hỗ trợ thêm cho 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). Sử dụng
vDSO32 (CONFIG_VDSO_COMPAT
) trên kiến trúc ARM64 cung cấp
Thời lượng pin tăng 0,4% và các điểm cải tiến khác về hiệu suất.
Cộng đồng Linux đang tích cực nghiên cứu
hợp nhất các vDSO
trên nhiều 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 đã điều chỉnh cho phiên bản cũ của loạt bản vá vDSO
vào thiết bị Pixel, nên bạn có thể tìm thấy các ví dụ trong các bản dựng cho nhân hệ điều hành của Pixel
(LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
đường dẫn,
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 và ActivityManager để giảm việc xác nhận lại trực tiếp
Xác nhận lại trực tiếp xảy ra khi một quy trình hoặc nhân hệ điều hành 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à nhân
đã sử dụng hết bộ nhớ trống hiện có. Đ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. Việc này thường đòi hỏi ổ đĩa I/O phải xả ra
trang sao lưu tệp sửa đổi hoặc đợi lowmemorykiller
dừng
của chúng tôi. Điều này có thể dẫn đến việc I/O bổ sung trong bất kỳ luồng nào, bao gồm cả luồng giao diện người dùng.
Để tránh xác nhận lại trực tiếp, nhân hệ điều hành có các hình mờ sẽ kích hoạt
kswapd
hoặc xác nhận lại quyền sở hữu ở chế độ nền. Đây là một chuỗi cố gắng
để được phân bổ vào lần tiếp theo, luồng thực sự có thể nhanh chóng thành công.
Ngưỡng mặc định để kích hoạt tính năng lấy lại trong 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. Chiến lược phát hành đĩa đơn kernel chỉ lấy lại vài megabyte bộ nhớ khi lấy lại ở chế độ nền. Điều này có nghĩa là bất kỳ quy trình nào phân bổ nhanh hơn vài megabyte sẽ nhanh chóng xác nhận lại trực tiếp.
Hỗ trợ cho một nhân hệ điều chỉnh được thêm vào trong nhánh nhân hệ điều hành Android-3.4 dưới dạng
patch 92189d47f66c67e5fd92eafaa287e153197a454f ("thêm kbytes miễn phí)
có thể tuỳ chỉnh"). Việc chọn lựa bản vá này cho nhân của thiết bị cho phép
ActivityManager
để yêu cầu nhân hệ điều hành cố gắng duy trì ba chế độ toàn màn hình
32 bpp vùng đệm không có bộ nhớ.
Bạn có thể định cấu hình các ngưỡng này bằng config.xml
khung.
<!-- 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>
Chỉnh LowMemoryKiller
ActivityManager
định cấu hình các ngưỡng của
LowMemoryKiller
để đáp ứng kỳ vọng của tập hợp làm việc
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 theo từng mức độ ưu tiên
bộ chứa cấp độ. Nếu 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 có thêm dịch vụ khác, thì
ngưỡng có thể tăng lên.
Các ngưỡng này có thể được giảm xuống nếu có quá nhiều bộ nhớ được dành riêng cho tệp sao lưu để các quy trình nền bị dừng từ lâu trước khi tình trạng ổ đĩa sẽ bị đơ do dung lượng lưu trữ trong 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>