Vòng đời FCM

Bản phát hành khung Android có nhiều Ma trận khả năng tương thích khung (FCM), mỗi ma trận cho một Phiên bản FCM mục tiêu có thể nâng cấp, xác định khung có thể sử dụng và các yêu cầu về phiên bản FCM mục tiêu. Trong vòng đời FCM, Android sẽ ngừng sử dụng và xoá các HAL HIDL, sau đó sửa đổi các tệp FCM để phản ánh trạng thái của phiên bản HAL.

Để bật OTA chỉ dành cho khung trong hệ sinh thái của riêng họ, các đối tác mở rộng giao diện nhà cung cấp cũng nên ngừng sử dụng và xoá các HAL HIDL bằng các phương thức tương tự.

Thuật ngữ

Ma trận khả năng tương thích với khung (FCM)
Tệp XML chỉ định các yêu cầu về khung đối với việc triển khai tuân thủ của nhà cung cấp. Ma trận tương thích được tạo phiên bản và phiên bản mới sẽ được cố định cho mỗi bản phát hành khung. Mỗi bản phát hành khung chứa nhiều FCM.
Các phiên bản FCM của nền tảng (SF)
Tập hợp tất cả phiên bản FCM trong một bản phát hành khung. Khung này có thể hoạt động với bất kỳ phương thức triển khai nào của nhà cung cấp đáp ứng một trong các FCM này.
Phiên bản FCM (F)
Phiên bản cao nhất trong số tất cả FCM trong một bản phát hành khung.
Phiên bản FCM mục tiêu (V)
Phiên bản FCM được nhắm mục tiêu (từ SF), được khai báo rõ ràng trong tệp kê khai thiết bị mà việc triển khai của nhà cung cấp đáp ứng. Bạn phải tạo một phương thức triển khai của nhà cung cấp dựa trên FCM đã phát hành, mặc dù phương thức này có thể khai báo các phiên bản HAL mới hơn trong Tệp kê khai thiết bị.
Phiên bản HAL
Phiên bản HAL có định dạng foo@x.y, trong đó foo là tên HAL và x.y là phiên bản cụ thể; ví dụ: nfc@1.0, keymaster@3.0 (tiền tố gốc, ví dụ: android.hardware, bị bỏ qua trong toàn bộ tài liệu này.)
Tệp kê khai thiết bị
Các tệp XML chỉ định phiên bản HAL mà phía thiết bị của giao diện nhà cung cấp, bao gồm cả hình ảnh nhà cung cấp và ODM, cung cấp. Nội dung của tệp kê khai thiết bị bị ràng buộc bởi phiên bản FCM mục tiêu của thiết bị, nhưng có thể liệt kê các HAL mới hơn so với FC tương ứng với V.
HAL thiết bị
HAL được liệt kê (cung cấp) trong tệp kê khai thiết bị và được liệt kê trong ma trận tương thích khung (FCM).
Ma trận khả năng tương thích với thiết bị (DCM)
Tệp XML chỉ định các yêu cầu của nhà cung cấp đối với việc triển khai khung tuân thủ. Mỗi thiết bị chứa một DCM.
Tệp kê khai khung
Tệp XML chỉ định phiên bản HAL mà phía khung của giao diện nhà cung cấp, bao gồm cả hệ thống, system_ext và hình ảnh sản phẩm, cung cấp. Các HAL trong tệp kê khai khung được tắt linh động theo phiên bản FCM mục tiêu của thiết bị.
HAL khung
HAL được liệt kê như được cung cấp trong tệp kê khai khung và được liệt kê trong ma trận tương thích với thiết bị (DCM).

Vòng đời của FCM trong cơ sở mã

Tài liệu này mô tả vòng đời của FCM một cách khái quát. Để xem các tệp kê khai được hỗ trợ, hãy tham khảo hardware/interfaces/compatibility_matrix.<FCM>.xml, trong đó bạn có thể tìm thấy FCM trong system/libvintf/include/vintf/Level.h.

Thiết bị vận chuyển phiên bản phát hành Android tương ứng dự kiến sẽ có giá trị FCM lớn hơn hoặc bằng cấp tương đương. Ví dụ: một thiết bị vận chuyển với Android 11 thường sẽ có FCM cấp 5, nhưng triển khai FCM cấp 6 trở lên, đi kèm với nhiều yêu cầu bổ sung được chỉ định trong ma trận tương thích. Các cấp độ được hỗ trợ là:

FCM Phiên bản Android
4 Android 10/Q
5 Android 11/R
6 Android 12/S
7 Android 13/T
8 Android 14/U
202404 Android 15/V

Cấp FCM bằng hoặc mới hơn Cấp độ API của nhà cung cấp.

Khi Android ngừng sử dụng một cấp độ FCM, cấp độ đó vẫn được hỗ trợ cho các thiết bị hiện có. Các thiết bị nhắm đến các cấp FCM thấp hơn được phép sử dụng các HAL được liệt kê trong các cấp FCM mới hơn, miễn là các HAL đó có trong nhánh.

Phát triển trong phiên bản FCM mới

Android tăng phiên bản FCM cho mỗi bản phát hành khung (chẳng hạn như Android 8 và 8.1). Trong quá trình phát triển, compatibility_matrix.F.xml mới sẽ được tạo và compatibility_matrix.f.xml hiện có (trong đó f < F) sẽ không còn thay đổi nữa.

Cách bắt đầu phát triển trong phiên bản FCM mới F:

  1. Sao chép compatibility_matrix.<F-1>.xml mới nhất vào compatibility_matrix.F.xml.
  2. Cập nhật thuộc tính level trong tệp thành F.
  3. Thêm các quy tắc bản dựng tương ứng để cài đặt ma trận tương thích này vào thiết bị.

Giới thiệu HAL mới

Trong quá trình phát triển, khi giới thiệu một HAL mới (Wi-Fi, NFC, v.v.) cho Android trên phiên bản FCM hiện tại F, hãy thêm HAL vào compatibility_matrix.F.xml.

Ví dụ: Android 8.1 đã giới thiệu cas@1.0. Các thiết bị chạy Android 8.1 có thể triển khai HAL này, vì vậy, mục nhập sau đây đã được thêm vào compatibility_matrix.F.xml (trước đây tạm thời được đặt tên là compatibility_matrix.current.xml trong quá trình phát triển bản phát hành đó):

<hal format="hidl">
    <name>android.hardware.cas</name>
    <version>1.0</version>
    <interface>
        <name>IMediaCasService</name>
        <instance>default</instance>
    </interface>
</hal>

Nâng cấp HAL (nhỏ)

Các phiên bản AIDL HAL được tính là phiên bản HAL nhỏ. Các phiên bản giao diện HIDL có phiên bản major.minor như 1.2.

Trong quá trình phát triển, khi một HAL AIDL nâng cấp phiên bản từ 2 lên 3 tại FCM Phiên bản F hiện tại, phiên bản mới sẽ được thêm vào mục nhập HAL trong compatibility_matrix.F.xml. Trường phiên bản của mục nhập HAL chấp nhận các dải ô như 2-3.

Ví dụ: Android FCM F đã giới thiệu foo@3 dưới dạng bản nâng cấp phiên bản nhỏ của HAL. Phiên bản cũ hơn, foo@2, được dùng cho các thiết bị nhắm đến FCM cũ, trong khi phiên bản mới hơn, foo@3, có thể được dùng cho các thiết bị nhắm đến Android FCM F. Mục nhập trong FCM cũ trước phiên bản 2 có dạng như sau:

<hal format="aidl">
    <name>foo</name>
    <version>2</version>
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

Mục này đã được sao chép vào compatibility_matrix.F.xml và sửa đổi để hỗ trợ phiên bản 3 như sau:

<hal format="aidl">
    <name>foo</name>
    <version>2-3</version>
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

Nâng cấp HAL (lớn)

Trong quá trình phát triển, khi một HAL có bản nâng cấp phiên bản chính tại FCM phiên bản F hiện tại, phiên bản chính mới x.0 sẽ được thêm vào compatibility_matrix.F.xml với các chế độ cài đặt sau:

  • Chỉ phiên bản x.0, nếu các thiết bị đi kèm với V = F phải khởi chạy bằng x.0.
  • Với các phiên bản lớn cũ hơn trong cùng một thẻ <hal>, nếu các thiết bị đi kèm với V = F có thể khởi chạy bằng một phiên bản lớn cũ hơn.

Ví dụ: FCM phiên bản F giới thiệu foo@2.0 dưới dạng bản nâng cấp phiên bản chính của HAL 1.0 và ngừng sử dụng HAL 1.0. Phiên bản cũ hơn, foo@1.0, được dùng cho các thiết bị nhắm đến các phiên bản FCM trước đó. Các thiết bị nhắm đến phiên bản FCM F phải cung cấp phiên bản 2.0 mới nếu cung cấp HAL. Trong ví dụ này, các phiên bản FCM trước đó chứa mục nhập sau:

<hal format="hidl">
    <name>foo</name>
    <version>1.0</version>;
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

Sao chép mục nhập này vào compatibility_matrix.F.xml và sửa đổi như sau:

<hal format="hidl">
    <name>foo</name>
    <version>2.0</version>
    <interface>
        <name>IFoo</name>
        <instance>default</instance>
    </interface>
</hal>

Giới hạn:

  • Vì HAL 1.0 không có trong compatibility_matrix.F.xml, nên các thiết bị nhắm đến FCM phiên bản F không được cung cấp HAL 1.0 (vì HAL này được coi là không dùng nữa).
  • Vì HAL 1.0 có trong các phiên bản FCM cũ, nên khung này vẫn có thể hoạt động với HAL 1.0 để tương thích ngược với các thiết bị cũ nhắm đến các phiên bản FCM cũ.

Phiên bản FCM mới

Quy trình phát hành Phiên bản FCM trên phân vùng hệ thống chỉ do Google thực hiện trong bản phát hành AOSP và bao gồm các bước sau:

  1. Đảm bảo compatibility_matrix.F.xml có thuộc tính level="F".
  2. Đảm bảo tất cả thiết bị đều tạo bản dựng và khởi động.
  3. Cập nhật kiểm thử VTS để đảm bảo các thiết bị khởi chạy bằng khung mới nhất (dựa trên cấp độ API vận chuyển) có Phiên bản FCM mục tiêu là V >= F.
  4. Xuất bản tệp lên AOSP.

Ví dụ: quy trình kiểm thử VTS đảm bảo rằng các thiết bị chạy Android 9 có Phiên bản FCM mục tiêu >= 3.

Ngoài ra, FCM sản phẩm và system_ext cũng có thể liệt kê các yêu cầu đối với từng phiên bản FCM của nền tảng. Chủ sở hữu của các hình ảnh này sẽ phát hành phiên bản FCM trên các phân vùng sản phẩm và system_ext tương ứng. Số phiên bản FCM trên phân vùng sản phẩm và system_ext phải khớp với số phiên bản trên phân vùng hệ thống. Tương tự như các phiên bản FCM trên phân vùng hệ thống, ma trận tương thích tại phiên bản FCM F trong phân vùng sản phẩm và system_ext phản ánh các yêu cầu trên thiết bị có phiên bản FCM mục tiêu F.

Ngừng sử dụng phiên bản HAL

Việc ngừng sử dụng Phiên bản HAL là quyết định của nhà phát triển (tức là đối với HAL AOSP, Google sẽ đưa ra quyết định). Điều này có thể xảy ra khi một phiên bản HAL cao hơn (dù là phiên bản nhỏ hay lớn) được phát hành.

Ngừng sử dụng HAL thiết bị

Khi một foo@x.y HAL thiết bị nhất định không được dùng nữa ở FCM Phiên bản F, điều đó có nghĩa là mọi thiết bị khởi chạy bằng FCM Phiên bản mục tiêu V = F trở lên đều không được triển khai foo ở phiên bản x.y hoặc bất kỳ phiên bản nào cũ hơn x.y. Khung này vẫn hỗ trợ phiên bản HAL không dùng nữa để nâng cấp thiết bị.

Khi FCM Phiên bản F được phát hành, HAL Phiên bản foo@x.y sẽ được coi là không dùng nữa nếu HAL Phiên bản cụ thể không được nêu rõ trong FCM mới nhất cho FCM Phiên bản mục tiêu V = F. Đối với các thiết bị khởi chạy bằng V = F, một trong các điều kiện sau phải đúng:

  • Khung này yêu cầu phiên bản cao hơn (chính hoặc phụ);
  • Khung này không còn yêu cầu HAL nữa.

Ví dụ: trong Android 9, health@2.0 được giới thiệu dưới dạng một bản nâng cấp phiên bản lớn của HAL 1.0. health@1.0 bị xoá khỏi compatibility_matrix.3.xml nhưng có trong compatibility_matrix.legacy.xml, compatibility_matrix.1.xml, và compatibility_matrix.2.xml. Do đó, health@1.0 được coi là không dùng nữa.

Ngừng sử dụng HAL khung

Khi một khung HAL foo@x.y nhất định không còn được dùng nữa ở FCM Phiên bản F, điều đó có nghĩa là mọi thiết bị khởi chạy bằng FCM Phiên bản mục tiêu V = F trở lên không được mong đợi khung này cung cấp foo ở phiên bản x.y hoặc ở bất kỳ phiên bản nào cũ hơn x.y. Khung này vẫn cung cấp phiên bản HAL không dùng nữa để nâng cấp thiết bị.

Khi phiên bản FCM F được phát hành, phiên bản HAL foo@x.y sẽ được coi là không dùng nữa nếu tệp kê khai khung chỉ định max-level="F - 1" cho foo@x.y. Đối với các thiết bị khởi chạy bằng V = F, khung này không cung cấp HAL foo@x.y. Ma trận tương thích của thiết bị trên các thiết bị khởi chạy bằng V = F không được liệt kê các HAL khung bằng max-level < V.

Ví dụ: trong Android 12, schedulerservice@1.0 không còn được dùng nữa. Thuộc tính max-level của ứng dụng được đặt thành 5, phiên bản FCM được giới thiệu trong Android 11. Xem tệp kê khai khung Android 12.

Ngừng hỗ trợ các phiên bản FCM mục tiêu

Khi số lượng thiết bị đang hoạt động của một Phiên bản FCM mục tiêu V nhất định giảm xuống dưới một ngưỡng nhất định, Phiên bản FCM mục tiêu sẽ bị xoá khỏi tập hợp SF của bản phát hành khung tiếp theo. Bạn có thể thực hiện việc này bằng cả hai bước sau:

  1. Xoá compatibility_matrix.V.xml khỏi các quy tắc bản dựng (để không được cài đặt trên hình ảnh hệ thống) và xoá mọi mã đã triển khai hoặc phụ thuộc vào các chức năng đã xoá.

  2. Xoá các HAL khung có max-level nhỏ hơn hoặc bằng V khỏi tệp kê khai khung và xoá mọi mã triển khai các HAL khung đã xoá.

Các thiết bị có Phiên bản FCM mục tiêu nằm ngoài SF cho một bản phát hành khung nhất định không thể nâng cấp lên bản phát hành đó.

Trạng thái phiên bản HAL

Các phần sau đây mô tả (theo thứ tự thời gian) các trạng thái có thể có của Phiên bản HAL.

Chưa phát hành

Đối với HAL thiết bị, nếu Phiên bản HAL không có trong bất kỳ ma trận tương thích công khai và cố định nào, thì phiên bản đó được coi là chưa phát hành và có thể đang trong quá trình phát triển. Bao gồm cả các Phiên bản HAL chỉ có trong compatibility_matrix.F.xml. Ví dụ:

  • Trong quá trình phát triển Android 9, HAL health@2.0 được coi là một HAL chưa phát hành và chỉ xuất hiện trong compatibility_matrix.3.xml.
  • HAL teleportation@1.0 không có trong bất kỳ ma trận tương thích nào đã phát hành và cũng được coi là HAL chưa phát hành.

Đối với HAL khung, nếu một phiên bản HAL chỉ có trong tệp kê khai khung của một nhánh phát triển không liên quan, thì phiên bản đó được coi là chưa phát hành.

Đã phát hành và hiện tại

Đối với HAL thiết bị, nếu Phiên bản HAL nằm trong bất kỳ ma trận tương thích công khai và bị đóng băng nào, thì phiên bản đó sẽ được phát hành. Ví dụ: sau khi FCM Phiên bản 3 bị đóng băng và phát hành cho AOSP, HAL health@2.0 được coi là Phiên bản HAL đã phát hành và hiện tại.

Nếu Phiên bản HAL nằm trong một ma trận tương thích công khai và đã bị đóng băng có Phiên bản FCM cao nhất, thì phiên bản HAL đó là phiên bản hiện tại (tức là không ngừng hoạt động). Ví dụ: các Phiên bản HAL hiện có (chẳng hạn như nfc@1.0 được giới thiệu trong compatibility_matrix.legacy.xml) tiếp tục tồn tại trong compatibility_matrix.3.xml cũng được coi là các Phiên bản HAL đã phát hành và hiện tại.

Đối với HAL khung, nếu một phiên bản HAL nằm trong tệp kê khai khung của nhánh phát hành mới nhất mà không có thuộc tính max-level hoặc (không thường xuyên) max-level bằng hoặc cao hơn phiên bản FCM được phát hành trong nhánh này, thì phiên bản đó được coi là phiên bản HAL đã phát hành và hiện tại. Ví dụ: HAL displayservice được phát hành và hiện có trong Android 12, như được chỉ định trong tệp kê khai khung Android 12.

Đã phát hành nhưng không dùng nữa

Đối với HAL thiết bị, Phiên bản HAL không được dùng nữa nếu và chỉ khi đáp ứng tất cả các điều kiện sau:

  • Phát hành.
  • Phiên bản này không có trong ma trận tương thích công khai và cố định có Phiên bản FCM cao nhất.
  • Khung này vẫn hỗ trợ ma trận tương thích công khai và cố định.

Ví dụ:

Do đó, power@1.0 là hiện tại, nhưng KHÔNG được dùng nữa trong Android 9.

Đối với các HAL khung, nếu một phiên bản HAL nằm trong tệp kê khai khung của nhánh phát hành mới nhất có thuộc tính max-level thấp hơn bản phát hành phiên bản FCM trong nhánh này, thì phiên bản đó được coi là phiên bản HAL đã phát hành nhưng không dùng nữa. Ví dụ: HAL schedulerservice được phát hành nhưng không còn được dùng nữa trong Android 12, như được chỉ định trong tệp kê khai khung Android 12.

Đã xoá

Đối với HAL thiết bị, Phiên bản HAL sẽ bị xoá nếu và chỉ khi các điều kiện sau đây là đúng:

  • Tính năng này đã được phát hành trước đây.
  • Lớp này không có trong bất kỳ ma trận tương thích công khai và cố định nào mà khung hỗ trợ.

Ma trận tương thích công khai, bị đóng băng nhưng không được khung hỗ trợ được lưu giữ trong cơ sở mã để xác định tập hợp Phiên bản HAL đã xoá để có thể viết các chương trình kiểm thử VTS nhằm đảm bảo các HAL đã xoá không có trên thiết bị mới.

Đối với HAL khung, một phiên bản HAL sẽ bị xoá nếu và chỉ khi đáp ứng các điều kiện sau:

  • Tính năng này đã được phát hành trước đây.
  • Tệp này không có trong tệp kê khai khung của nhánh phát hành mới nhất.

FCM cũ

Phiên bản FCM mục tiêu cũ là một giá trị đặc biệt cho tất cả các thiết bị không phải Treble. FCM cũ, compatibility_matrix.legacy.xml, liệt kê các yêu cầu của khung trên các thiết bị cũ (tức là các thiết bị được ra mắt trước Android 8.0).

Nếu tệp này tồn tại cho một FCM có phiên bản F, thì mọi thiết bị không phải Treble đều có thể được nâng cấp lên F, miễn là tệp kê khai thiết bị tương thích với tệp này. Quy trình xoá phiên bản này cũng giống như quy trình xoá FCM cho các Phiên bản FCM mục tiêu khác (bị xoá sau khi số lượng thiết bị chạy Android trước phiên bản 8.0 đang hoạt động giảm xuống dưới một ngưỡng nhất định).

Các phiên bản FCM đã phát hành

Bạn có thể tìm thấy danh sách các phiên bản FCM đã phát hành trong hardware/interfaces/compatibility_matrices.

Để tìm phiên bản FCM được phát hành cùng với một bản phát hành Android cụ thể, hãy xem Level.h.