Lược đồ tạo phiên bản GKI

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 AndroidRelease, phần số sẽ được trích xuất từ chuỗi để so sánh.

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.