Các kernel chung của AOSP (còn gọi là kernel chung của Android hoặc ACK) là các kernel hạ nguồn của kernel.org và bao gồm các bản vá mà cộng đồng Android quan tâm nhưng chưa được hợp nhất vào các kernel chính hoặc kernel được Hỗ trợ dài hạn (LTS). Các bản vá này có thể bao gồm:
- Các chức năng ngược dòng và chọn lọc cần thiết cho các tính năng của Android
- Các tính năng đã sẵn sàng cho thiết bị Android nhưng vẫn đang trong quá trình phát triển ngược dòng
- Các tính năng của nhà cung cấp/OEM hữu ích cho các đối tác khác trong hệ sinh thái
android-mainline là nhánh phát triển chính cho các tính năng của Android. Nhánh chính của Linux được hợp nhất vào android-mainline bất cứ khi nào Linus Torvalds đăng một bản phát hành hoặc bản phát hành dùng thử. Trước năm 2019, các kernel chung của Android được tạo bằng cách sao chép kernel LTS được khai báo gần đây và thêm các bản vá dành riêng cho Android. Quy trình này đã thay đổi vào năm 2019 để phân nhánh kernel chung mới của Android từ android-mainline. Mô hình mới này giúp tránh được nỗ lực đáng kể để chuyển tiếp và kiểm thử các bản vá Android bằng cách đạt được kết quả tương tự theo từng bước. android-mainline trải qua quá trình kiểm thử liên tục đáng kể, mô hình này bao gồm một kernel chất lượng cao kể từ ngày được xuất bản.
Khi một LTS mới được khai báo ngược dòng, kernel chung tương ứng sẽ được phân nhánh từ android-mainline. Điều này cho phép các đối tác bắt đầu một dự án trước khi khai báo phiên bản LTS, bằng cách hợp nhất từ android-mainline. Sau khi tạo nhánh kernel chung mới, các đối tác có thể thay đổi nguồn hợp nhất thành nhánh mới một cách liền mạch.
Các nhánh kernel chung khác nhận được các bản hợp nhất thường xuyên từ kernel
LTS được liên kết.
Các bản hợp nhất này thường được thực hiện ngay sau khi bản phát hành LTS được đăng. Ví dụ: khi Linux 6.1.75 được đăng, nó đã được hợp nhất vào kernel chung 6.1 (android14-6.1). Các đối tác nên cập nhật kernel để luôn cập nhật các bản sửa lỗi LTS và lỗi dành riêng cho Android.
Nhánh kernel ACK KMI
Các kernel GKI có Giao diện mô-đun kernel ổn định. KMI được xác định duy nhất theo phiên bản kernel và bản phát hành nền tảng Android, vì vậy, các nhánh được đặt tên là ANDROID_RELEASE-KERNEL_VERSION.
Ví dụ: kernel GKI 6.1 cho Android 14 có tên là android14-6.1. Đối với Android 15, kernel GKI android15-6.6 đã được giới thiệu.
Hệ phân cấp kernel chung
Phân nhánh từ android-mainline
Cấp cao nhất của hệ phân cấp kernel chung được minh hoạ trong Hình 1.
Hình 1. Tạo kernel chung từ kernel android-mainline
Xin lưu ý rằng một kernel chung mới của Android android14-6.1 đã được phân nhánh từ android-mainline vào năm 2022. Vào năm 2023, khi LTS tiếp theo được khai báo, android15-6.6 đã được phân nhánh từ android-mainline.
Như minh hoạ trong Hình 1, mỗi phiên bản kernel có thể là cơ sở cho 2 kernel GKI.
Ví dụ: 2 kernel v5.15 là android13-5.15 và android14-5.15, cả hai đều là kernel tính năng cho các bản phát hành nền tảng tương ứng. Đây cũng là trường hợp của 5.10; android12-5.10 được tạo khi LTS được khai báo và android13-5.10 được phân nhánh từ android12-5.10 tại cột mốc hoàn thành tính năng kernel vào Mùa xuân năm 2021 để cho phép phát triển các tính năng cho Android 13. Kể từ Android 15 (2024), chỉ có một kernel GKI mới cho mỗi phiên bản kernel (không có kernel android15-6.1).
Vòng đời nhánh ACK KMI
Vòng đời của nhánh ACK KMI được minh hoạ trong Hình 2.
Hình 2. Vòng đời nhánh ACK KMI 6.6
Để làm rõ quy trình phát triển và vòng đời nhánh, Hình 2 tập trung vào các nhánh ACK KMI cho 6.6.
Mỗi nhánh ACK KMI đều trải qua 3 giai đoạn được chỉ ra trong Hình 2 bằng các màu khác nhau trong mỗi nhánh. Như minh hoạ, LTS được hợp nhất thường xuyên bất kể giai đoạn nào.
Giai đoạn phát triển
Khi được tạo, nhánh ACK KMI sẽ chuyển sang giai đoạn phát triển (được gắn nhãn là dev trong Hình 2) và mở để đóng góp tính năng cho bản phát hành nền tảng Android tiếp theo. Trong Hình 2, android15-6.6 được tạo khi 6.6 được khai báo là kernel LTS ngược dòng mới.
Giai đoạn ổn định
Khi nhánh ACK KMI được khai báo hoàn thành tính năng, nó sẽ chuyển sang giai đoạn ổn định (được gắn nhãn là stable trong Hình 2). Các tính năng của đối tác và bản sửa lỗi vẫn được chấp nhận, nhưng tính năng theo dõi KMI được bật để phát hiện mọi thay đổi ảnh hưởng đến giao diện. Trong giai đoạn này, các thay đổi làm gián đoạn KMI được chấp nhận và định nghĩa KMI được cập nhật theo nhịp điệu xác định trước (thường là 2 tuần một lần). Hãy xem bài viết Tổng quan về GKI để biết thông tin chi tiết về việc giám sát KMI.
Giai đoạn KMI bị đóng băng
Trước khi bản phát hành nền tảng mới được đẩy lên AOSP, nhánh ACK KMI sẽ bị đóng băng và vẫn bị đóng băng trong suốt vòng đời của nhánh. Điều này có nghĩa là không có thay đổi nào làm gián đoạn KMI được chấp nhận trừ phi xác định được một vấn đề bảo mật nghiêm trọng không thể giảm thiểu mà không ảnh hưởng đến KMI ổn định. Để tránh làm gián đoạn KMI, một số bản vá được hợp nhất từ LTS có thể được sửa đổi hoặc loại bỏ nếu bản sửa lỗi không bắt buộc đối với thiết bị Android.
Khi một nhánh ACK KMI bị đóng băng, các bản sửa lỗi và tính năng của đối tác có thể được chấp nhận miễn là kernel chung KMI hiện có không bị gián đoạn. KMI có thể được mở rộng bằng các ký hiệu được xuất mới miễn là các giao diện bao gồm KMI hiện tại không bị ảnh hưởng. Khi các giao diện mới được thêm vào KMI, chúng sẽ ổn định ngay lập tức và không thể bị gián đoạn bởi các thay đổi trong tương lai.
Ví dụ: không được phép thay đổi thêm một trường vào cấu trúc mà kernel chung của giao diện KMI sử dụng vì nó thay đổi định nghĩa giao diện:
struct foo {
int original_field1;
int original_field2;
int new_field; // Not allowed
};
int do_foo(struct foo &myarg)
{
do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);
Tuy nhiên, bạn có thể thêm một hàm mới:
struct foo2 {
struct foo orig_foo;
int new_field;
};
int do_foo2(struct foo2 &myarg)
{
do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);
Trong suốt vòng đời của kernel GKI, khả năng tương thích ngược với không gian người dùng được duy trì để kernel có thể được sử dụng một cách an toàn cho bản phát hành nền tảng Android mà thiết bị được ra mắt. Việc kiểm thử liên tục với các bản phát hành trước đó giúp duy trì khả năng tương thích. Vì vậy, trong Hình 2, kernel android15-6.6 có thể được sử dụng cho các thiết bị Android 15 và các thiết bị sau này. Vì bản phát hành nền tảng Android cũng tương thích với các phiên bản trước, nên kernel android14-6.1 có thể được sử dụng cho các thiết bị Android 15 để ra mắt hoặc nâng cấp.
Số thế hệ KMI
Nếu có bản hợp nhất LTS trong giai đoạn ổn định hoặc vấn đề bảo mật hoặc sự kiện khác sau giai đoạn này yêu cầu chấp nhận bản vá thay đổi KMI, thì số thế hệ KMI được ghi trong build.config.common sẽ tăng lên. Bạn có thể tìm thấy thế hệ KMI hiện tại bằng lệnh uname:
$ uname -r
6.6.30-android15-6-g86d10b30f51f
Số sau bản phát hành nền tảng là thế hệ KMI (6 trong trường hợp này).
Nếu thế hệ KMI thay đổi, kernel sẽ không tương thích với các mô-đun của nhà cung cấp tuân thủ thế hệ KMI trước đó, vì vậy, các mô-đun phải được xây dựng lại và cập nhật đồng bộ với kernel. Sau khi KMI bị đóng băng, các thay đổi về thế hệ KMI dự kiến sẽ rất hiếm.
Khả năng tương thích giữa các kernel
Các yêu cầu về khả năng tương thích giữa các kernel trong cùng một họ LTS đang thay đổi bắt đầu từ các kernel GKI mới.
Kernel GKI
Các kernel GKI duy trì khả năng tương thích ngược với tất cả các bản phát hành nền tảng Android hỗ trợ phiên bản kernel. Ngoài ra, các bản phát hành nền tảng Android tương thích ngược với các kernel GKI từ các bản phát hành trước. Vì vậy, bạn có thể sử dụng kernel android14-6.1 được phát triển cho Android 14 (2023) một cách an toàn trên các thiết bị chạy Android 15 (2024). Khả năng tương thích được xác minh thông qua quá trình kiểm thử VTS và CTS liên tục của các kernel GKI với tất cả các bản phát hành được hỗ trợ.
KMI ổn định để kernel có thể được cập nhật mà không cần xây dựng lại các mô-đun kernel trong hình ảnh của nhà cung cấp.
Khả năng tương thích KMI không được duy trì giữa các kernel GKI khác nhau. Vì vậy, ví dụ: không thể thay thế kernel android14-6.1 bằng kernel android15-6.6 mà không cần xây dựng lại tất cả các mô-đun.
Các kernel GKI chỉ được hỗ trợ cho các bản phát hành ban đầu và tiếp theo.
Chúng không được hỗ trợ cho các bản phát hành cũ hơn. Vì vậy, kernel android15-6.6 không được hỗ trợ cho các thiết bị chạy Android 14 (2023).
Ma trận tương thích
Bảng này cho biết các phiên bản kernel được hỗ trợ và kiểm thử với từng bản phát hành nền tảng Android.
| Bản phát hành nền tảng Android | Kernel được hỗ trợ |
|---|---|
| Android 17 (2026) |
android17-6.18
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10 (không được hỗ trợ trong Android 17 QPR1 trở lên)
android12-5.10 (không được hỗ trợ trong Android 17 QPR1 trở lên)
|
| Android 16 (2025) |
android16-6.12
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
| Android 15 (2024) |
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
| Android 14 (2023) |
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
|
| Android 13 (2022) |
android13-5.15
android13-5.10
android12-5.10
|
| Android 12 (2021) |
android12-5.10
|
Vòng đời hỗ trợ và bản vá bảo mật
ACK nhận các bản hợp nhất LTS từ ngược dòng và bản sửa lỗi cho mã dành riêng cho Android. Các bản sửa lỗi này bao gồm tất cả các bản vá bảo mật kernel được trích dẫn trong Bản tin bảo mật Android hằng tháng có liên quan đến ACK.
ACK có thể được hỗ trợ lâu hơn kernel ổn định ngược dòng tương ứng tại kernel.org. Trong trường hợp này, Google sẽ cung cấp dịch vụ hỗ trợ mở rộng cho đến ngày kết thúc vòng đời (EOL) được hiển thị trong phần này. Khi các kernel bị EOL, chúng sẽ không còn được Google hỗ trợ và các thiết bị chạy chúng được coi là dễ bị tấn công.
Kể từ kernel 6.6, vòng đời hỗ trợ cho các kernel ổn định là 4 năm.
Bảng này cho biết vòng đời của các ACK được hỗ trợ:
| Nhánh ACK | Ngày ra mắt |
Vòng đời hỗ trợ(năm) |
EOL |
|---|---|---|---|
| android12-5.10 | 2020-12-13 | 6 | 2027-07-01 |
| android13-5.10 | 2020-12-13 | 6 | 2027-07-01 |
| android13-5.15 | 2021-10-31 | 6 | 2028-07-01 |
| android14-5.15 | 2021-10-31 | 6 | 2028-07-01 |
| android14-6.1 | 2022-12-11 | 6 | 2029-07-01 |
| android15-6.6 | 2023-10-29 | 4 | 2028-07-01 |
| android16-6.12 | 2024-11-17 | 4 | 2029-07-01 |
| android17-6.18 | 2025-11-30 | 4 | 2030-07-01 |
Kiểm thử kernel chung
Các kernel chung được kiểm thử bằng một số hệ thống CI ngoài quá trình kiểm thử hạ nguồn của các nhà cung cấp.
Kiểm thử KernelCI
KernelCI các bài kiểm thử xây dựng và khởi động được bắt đầu bất cứ khi nào một bản vá mới được cam kết với một nhánh kernel chung. Vài trăm cấu hình xây dựng được kiểm thử và khởi động trên nhiều bảng. Bạn có thể tìm thấy kết quả gần đây cho các kernel Android trên trang web KernelCL.
Kiểm thử trước khi gửi và sau khi gửi của Android
Các bài kiểm thử trước khi gửi được dùng để ngăn lỗi được đưa vào các kernel chung của Android. Bạn có thể tìm thấy bản tóm tắt kết quả kiểm thử trong thẻ "Checks" (Kiểm tra) của thay đổi mã trong gerrit kernel chung của Android.
Quá trình kiểm thử sau khi gửi của Android được thực hiện
trên các bản dựng mới được xuất bản trong các nhánh kernel chung của Android khi các bản vá mới được
cam kết với một nhánh kernel chung của Android trong ci.android.com. Bằng cách
nhập aosp_kernel làm tên nhánh một phần trong ci.android.com, bạn
sẽ thấy danh sách các nhánh kernel có
kết quả. Ví dụ: bạn có thể tìm thấy kết quả cho android-mainline trên
trang tổng quan vềTích hợp bản dựng liên tục của Android (Android CI). Nhấp vào một bản dựng cụ thể để tìm trạng thái kiểm thử trong thẻ Test Results (Kết quả kiểm thử).
Các bài kiểm thử được xác định bằng cách kiểm thử ánh xạ
với nhóm kiểm thử kernel-presubmit trong cây nguồn nền tảng Android được chạy trước khi gửi cho các nhánh kernel Android. Ví dụ: cấu hình sau trong
test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING
cho phép vts_kernel_proc_file_api_test làm bài kiểm thử trước khi gửi tại quá trình kiểm tra mã kernel chung của Android.
{
"kernel-presubmit": [
{
"name": "vts_kernel_proc_file_api_test"
}
]
}
Kiểm thử 0-day
Quá trình kiểm thử 0-day thực hiện kiểm thử từng bản vá trên tất cả các nhánh kernel chung của Android khi các bản vá mới được cam kết. Nhiều bài kiểm thử khởi động, chức năng và hiệu suất được chạy. Tham gia nhóm công khai cros-kernel-buildreports.
Ma trận thử nghiệm
| Kernel chung của Android | Bản phát hành nền tảng Android | Bộ kiểm thử | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chính | 17 | 16 | 15 | 14 | 13 | KernelCI | Trước khi gửi | Sau khi gửi | 0-day | ||
android-mainline
|
✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android17-6.18
|
✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android16-6.12
|
✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android15-6.6
|
✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android14-6.1
|
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | |
android13-5.15
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
android12-5.10
|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
Đóng góp cho các kernel chung của Android
Nhìn chung, quá trình phát triển tính năng nên được thực hiện trên Linux chính chứ không phải trên các kernel chung của Android. Bạn nên phát triển ngược dòng và sau khi quá trình phát triển được chấp nhận ở đó, bạn có thể chuyển ngược lại sang nhánh ACK cụ thể nếu cần. Nhóm Kernel Android sẵn lòng hỗ trợ các nỗ lực ngược dòng vì lợi ích của hệ sinh thái Android.
Gửi các bản vá cho Gerrit và tuân thủ các nguyên tắc đóng góp này.