Trang này mô tả sơ đồ lập phiên bản cho Hình ảnh kernel chung (GKI). Hình ảnh kernel chung (GKI) có một giá trị nhận dạng riêng biệt gọi là bản phát hành kernel. Bản phát hành kernel bao gồm phiên bản giao diện mô-đun kernel (KMI) và cấp phụ. Bản phát hành kernel dành riêng cho hình ảnh đang được phát hành, trong khi phiên bản KMI đại diện cho giao diện mà bản phát hành được xây dựng. Một phiên bản KMI có thể hỗ trợ nhiều bản phát hành kernel. Một bản phát hành kernel chỉ được liên kết với một phiên bản KMI. Trong trường hợp hiếm gặp khi giao diện mô-đun kernel phải được thay đổi, thế hệ KMI sẽ được lặp lại để phản ánh thay đổi trong phiên bản KMI.
Tóm tắt các điều khoản
Bảng sau đây tóm tắt các điều khoản quan trọng được dùng trên trang này và cho các bản cập nhật GKI.
| Tên | Ký hiệu | Ví dụ | Nội dung mô tả |
|---|---|---|---|
| Bản phát hành kernel | w.x.y-zzz-k-suffix | 5.4.42-android12-0-foo | Giá trị nhận dạng riêng biệt cho bản phát hành GKI. Đây là giá trị
do unametrả về. |
| Phiên bản KMI | w.x-zzz-k | 5.4-android12-0 | Mô tả giao diện mô-đun kernel (KMI) giữa GKI và các mô-đun kernel có thể tải động (DLKM). |
| Cấp phụ | năm | 42 | Mô tả thứ tự phát hành của các bản phát hành kernel trong cùng một phiên bản KMI. |
Bảng sau đây liệt kê các điều khoản liên quan khác để tham khảo.
| Tên | Ký hiệu | Ví dụ | Nội dung mô tả |
|---|---|---|---|
| w.x.y | w.x.y | 5.4.42 |
Để biết thông tin chi tiết, hãy xem Linux tệp Makefile của kernel (tìm "KERNELRELEASE"). w.x.y được dùng trực tiếp trong tài liệu này. Đây cũng thường được gọi là số phiên bản gồm 3 phần. Thuật ngữ được dùng trong VINTF, phiên bản kernel, có thể gây nhầm lẫn với các thuật ngữ khác, đặc biệt là w. Biến này được gọi là kernel_version_tuple trong libkver. Không được giảm bộ dữ liệu này bằng bất kỳ bản cập nhật nào, kể cả OTA hoặc mainline. |
| Nhánh kernel | zzz-w.x | android12-5.4 | Thuật ngữ này được dùng trong Các loại nhánh kernel phổ biến. |
| Phiên bản | w | 5 | Thuật ngữ này không được dùng trong tài liệu này. Biến này được gọi là version trong libkver. |
| Cấp bản vá | x | 4 | Thuật ngữ này không được dùng trong tài liệu này. Biến này được gọi là patch_level trong libkver. |
| Bản phát hành Android | zzz | android12 |
Đây là số bản phát hành Android (tráng miệng) mà kernel được liên kết với.
Khi so sánh trường Không được giảm số bản phát hành Android bằng bất kỳ bản cập nhật nào, kể cả OTA hoặc mainline. |
| Thế hệ KMI | k | 0 |
Đây là một số bổ sung được thêm vào để xử lý các trường hợp hiếm gặp. Nếu bản sửa lỗi bảo mật yêu cầu thay đổi đối với KMI trong cùng một bản phát hành Android, thì thế hệ KMI sẽ tăng lên. Số thế hệ KMI bắt đầu từ 0. |
Thiết kế lập phiên bản
Bản phát hành kernel
Định nghĩa
Đối với các thiết bị được vận chuyển bằng GKI, bản phát hành kernel được xác định như sau:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
Để biết thêm thông tin, hãy xem bài viết Xác định bản phát hành kernel từ một thiết bị.
Sau đây là ví dụ về bản phát hành kernel.
5.4.42-android12-0-00544-ged21d463f856
Nội dung mô tả
Bản phát hành kernel là mã nhận dạng riêng biệt của bản phát hành GKI. Nếu hai tệp nhị phân GKI có cùng một bản phát hành kernel, thì chúng phải giống hệt nhau theo từng byte.
Bản phát hành kernel bao gồm phiên bản KMI, cấp phụ và hậu tố. Đối với mục đích của tài liệu này, hậu tố sau thế hệ KMI sẽ bị bỏ qua.
Phiên bản KMI
Định nghĩa
Phiên bản KMI được xác định như sau:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Xin lưu ý rằng cấp phụ y không thuộc phiên bản KMI. Đối với ví dụ
trong Bản phát hành kernel, phiên bản KMI là:
5.4-android12-0
Nội dung mô tả
Phiên bản KMI mô tả giao diện mô-đun kernel (KMI) giữa GKI và các mô-đun kernel có thể tải động (DLKM).
Nếu hai bản phát hành kernel có cùng một phiên bản KMI, thì chúng sẽ triển khai cùng một giao diện mô-đun kernel. Các DLKM tương thích với một bản phát hành cũng tương thích với bản phát hành còn lại.
Không được giảm phiên bản KMI bằng bất kỳ bản cập nhật OTA nào.
Cấp phụ
Cấp phụ y mô tả thứ tự phát hành của các bản phát hành kernel trong cùng một phiên bản KMI.
Đối với hai bản phát hành kernel có cùng một phiên bản KMI nhưng có cấp phụ Y1 và Y2 tương ứng:
- Nếu Y1 nhỏ hơn hoặc bằng Y2, thì thiết bị chạy Y1 có thể nhận bản cập nhật lên Y2.
- Nếu Y1 lớn hơn Y2, thì thiết bị chạy Y1 không thể cập nhật lên Y2.
Tức là nếu phiên bản KMI không thay đổi, thì không được giảm cấp phụ bằng bất kỳ bản cập nhật OTA nào.
Xác định bản phát hành kernel từ một thiết bị
Bạn có thể tìm thấy bản phát hành kernel đầy đủ bằng cách thực thi uname -r, hoặc
uname(2)
với đoạn mã sau:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
Sau đây là kết quả đầu ra mẫu:
5.4.42-android12-0-00544-ged21d463f856
Đối với mục đích của tài liệu này, mọi nội dung sau thế hệ KMI sẽ bị bỏ qua khi trích xuất thông tin kernel. Cụ thể hơn, kết quả đầu ra của uname -r được
phân tích cú pháp bằng biểu thức chính quy
(giả sử zzz luôn bắt đầu bằng "android"):
^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$
Thông tin bị bỏ qua có thể bao gồm thông tin như số bản dựng ci.android.com, số bản vá trên kernel cơ sở và hàm băm SHA của cam kết git.
libkver
Thư viện libkver cung cấp giao diện C++ để phân tích cú pháp bản phát hành kernel hoặc chuỗi phiên bản KMI. Để biết danh sách các API mà libkver hiển thị, hãy xem
packages/modules/Gki/libkver/include/kver.
Kiểm tra VINTF
Đối với Android 11 trở xuống, phần bản phát hành Android của phiên bản KMI được chỉ định theo cách thủ công trong tệp kê khai thiết bị của nhà sản xuất thiết bị. Để biết thông tin chi tiết, hãy xem Quy tắc so khớp kernel VINTF.
Kể từ Android S, phần bản phát hành Android của phiên bản KMI có thể được trích xuất từ nhân hệ điều hành và chèn vào tệp kê khai thiết bị tại thời gian xây dựng.
Vì các yêu cầu về cấu hình kernel thường không thay đổi, nên bạn không cần mã hoá k trong ma trận khả năng tương thích. Tuy nhiên, trong trường hợp hiếm gặp khi yêu cầu về cấu hình kernel cần được thay đổi, hãy đảm bảo những điều sau:
- Xoá yêu cầu tương ứng khỏi ma trận khả năng tương thích.
- Thêm các bài kiểm thử VTS bổ sung để kiểm tra các yêu cầu mới có điều kiện về thế hệ KMI.
Phiên bản hình ảnh khởi động trong siêu dữ liệu OTA
Ngay cả khi hình ảnh khởi động được cập nhật thông qua OTA, hình ảnh này phải được gói trong định dạng tải trọng OTA, payload.bin. Tải trọng OTA mã hoá trường version cho mỗi phân vùng. Khi update_engine xử lý tải trọng OTA, nó sẽ so sánh trường này để đảm bảo phân vùng không bị hạ cấp.
Để tránh nhầm lẫn, trường version cho phân vùng khởi động trong siêu dữ liệu OTA
được gọi là boot image version.
Vì ramdisk luôn được xây dựng từ đầu, nên việc sử dụng dấu thời gian ramdisk là đủ để mô tả toàn bộ hình ảnh khởi động. Bạn không cần mã hoá bản phát hành kernel trong phiên bản hình ảnh khởi động, trừ phi bạn đang ghép hình ảnh khởi động cũ vào tệp nhị phân kernel mới trong tương lai.
Trước khi cập nhật OTA, ứng dụng OTA sẽ kiểm tra phiên bản hình ảnh khởi động theo cách tương tự như mọi phân vùng khác.