Cấu hình kernel

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-ARCHandroid-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)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ặ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, 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_COMPATCONFIG_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>