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

Trang này mô tả sơ đồ quản lý phiên bản cho Hình ảnh hạt nhân chung (GKI). Hình ảnh hạt nhân chung (GKI) có một giá trị nhận dạng duy nhất gọi là bản phát hành hạt nhân. Bản phát hành nhân bao gồm phiên bản giao diện mô-đun nhân (KMI) và cấp độ phụ. Bản phát hành nhân dành riêng cho hình ảnh được phát hành, trong khi phiên bản KMI đại diện cho giao diện mà một bản phát hành được tạo từ đó. 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 nhân chỉ 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 nhân phải được thay đổi, quá trình tạo KMI sẽ được lặp lại để phản ánh sự thay đổi trong phiên bản KMI.

Tóm tắt điều khoản

Bảng sau đây tóm tắt các thuật ngữ 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 một bản phát hành GKI. Đây là giá trị do uname trả về.
Phiên bản KMI w.x-zzz-k 5.4-android12-0 Mô tả giao diện mô-đun hạt nhân (KMI) giữa GKI và các mô-đun hạt nhân có thể tải động (DLKM).
Cấp độ phụ y 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 thuật ngữ liên quan khác để bạn 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 Makefile của nhân Linux (tìm "KERNELRELEASE").

w.x.y được dùng trực tiếp trong suốt 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 nhân, 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ộ giá trị 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ố phiên bản Android (tên món tráng miệng) mà nhân được liên kết.

Khi so sánh trường AndroidRelease, phần số sẽ được trích xuất từ chuỗi để so sánh.

Mọi bản cập nhật, kể cả bản cập nhật qua mạng (OTA) hoặc bản cập nhật chính, đều không được làm giảm số phiên bản Android.

Tạo KMI k 0

Đây là một số bổ sung được thêm vào để xử lý các sự kiện không mong muốn. 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 bằng 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ị đi kèm với 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 nhân từ một thiết bị.

Sau đây là ví dụ về một bản phát hành nhân.

5.4.42-android12-0-00544-ged21d463f856

Mô tả

Bản phát hành nhân là mã nhận dạng duy nhất của một bản phát hành GKI. Nếu có cùng phiên bản phát hành kernel, thì hai tệp nhị phân GKI 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 khi tạo 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

Mô tả

Phiên bản KMI mô tả giao diện mô-đun hạt nhân (KMI) giữa GKI và các mô-đun hạt nhân có thể tải động (DLKM).

Nếu hai bản phát hành kernel có cùng 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 DLKM cũng tương thích với DLKM còn lại.

Mọi bản cập nhật qua mạng (OTA) đều không được làm giảm phiên bản KMI.

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 2 bản phát hành nhân có cùng 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 được 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ì mọi bản cập nhật qua mạng (OTA) đều không được giảm cấp độ phụ.

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) bằng đoạn mã sau:

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

Ví dụ về kết quả đầu ra:

5.4.42-android12-0-00544-ged21d463f856

Để phục vụ mục đích của tài liệu này, mọi thứ sau khi tạo KMI đều bị bỏ qua khi trích xuất thông tin về nhân. Cụ thể hơn, đầu ra của uname -r được phân tích cú pháp bằng regex sau đây (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 những thông tin như số bản dựng ci.android.com, số lượng bản vá trên nhân cơ sở và hàm băm SHA của cam kết git.

libkver

Thư viện libkver cung cấp một giao diện C++ để phân tích cú pháp bản phát hành kernel hoặc một 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 phát hành Android của phiên bản KMI được các nhà sản xuất thiết bị chỉ định theo cách thủ công trong tệp kê khai thiết bị. Để biết thông tin chi tiết, hãy xem Quy tắc so khớp nhân VINTF.

Từ Android S, phần phát hành Android của phiên bản KMI có thể được trích xuất từ nhân và được chèn vào tệp kê khai thiết bị tại thời điểm tạo bản dựng.

Vì các yêu cầu về cấu hình của nhân thường không thay đổi, nên bạn không cần mã hoá k trong ma trận tương thích. Tuy nhiên, trong trường hợp hiếm gặp khi cần thay đổi yêu cầu về cấu hình nhân, hãy đảm bảo những điều sau:

  • Yêu cầu tương ứng trong ma trận tương thích sẽ bị xoá.
  • Các kiểm thử VTS bổ sung được thêm vào để kiểm tra các yêu cầu mới có điều kiện khi tạo 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 bản cập nhật OTA, thì hình ảnh đó phải được bao bọc 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ì ổ đĩa RAM luôn được tạo từ đầu, nên chỉ cần sử dụng dấu thời gian ổ đĩa RAM 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 nhân trong phiên bản hình ảnh khởi động, trừ phi bạn đang ghép một hình ảnh khởi động cũ vào một tệp nhị phân nhân mới trong tương lai.

Trước khi cập nhật qua mạng (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.