Vòng đời FCM

Bản phát hành khung Android có nhiều Ma trận tương thích khung (FCM), mỗi Ma trận cho mỗi phiên bản FCM mục tiêu có thể nâng cấp, giúp xác định nội dung mà khung có thể sử dụng và yêu cầu về phiên bản FCM mục tiêu. Trong khuôn khổ vòng đời FCM, Android sẽ ngừng sử dụng và xoá các lớp 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 các 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 của nhà cung cấp cũng nên ngừng sử dụng và xoá HAL HIDL bằng cách sử dụng cùng phương thức.

Thuật ngữ

Ma trận tương thích khung (FCM)
Tệp XML chỉ định các yêu cầu về khung trong việc tuân thủ cách triển khai của nhà cung cấp. Ma trận tương thích được tạo phiên bản và một phiên bản mới sẽ bị treo cho mỗi bản phát hành khung. Mỗi bản phát hành khung này 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ỳ cách 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ị, rằng quá trình triển khai của nhà cung cấp đáp ứng điều kiện. Bạn phải tạo 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, chẳng hạn như android.hardware, bị bỏ qua trong tài liệu này.)
Tệp kê khai thiết bị
Các tệp XML chỉ định những phiên bản HAL mà phía thiết bị trong 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ị hạn chế 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 đáng kể so với FC tương ứng với V.
Lớp trừu tượng phần cứng (HAL) cho thiết bị
Các HAL được liệt kê (được cung cấp) trong tệp kê khai thiết bị và được liệt kê (bắt buộc hoặc không bắt buộc) trong ma trận tương thích khung (FCM).
Ma trận về 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 về việc tuân thủ các phương thức triển khai khung. Mỗi thiết bị chứa một DCM.
Tệp kê khai khung
Tệp XML chỉ định các phiên bản HAL mà phía khung của giao diện nhà cung cấp (bao gồm hệ thống, system_ext và hình ảnh sản phẩm) cung cấp. HAL (Lớp trừu tượng phần cứng) trong tệp kê khai khung bị tắt một cách linh động theo phiên bản FCM mục tiêu của thiết bị.
Lớp trừu tượng phần cứng (HAL) cho khung
Các HAL (Lớp trừu tượng phần cứng) được liệt kê trong tệp kê khai khung và được liệt kê là bắt buộc hoặc không bắt buộc trong ma trận tương thích thiết bị (DCM).

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

Bản tóm tắt của tài liệu này mô tả vòng đời FCM. Để xem các tệp kê khai hiện đượ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ụ: vận chuyển thiết bị chạy 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

Khi Android không còn dùng cấp độ FCM nữa, cấp độ này vẫn được hỗ trợ trên các thiết bị hiện có.

Phát triển bằng một 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, 8.1, v.v.). 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) 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 xây 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 HAL (Wi-Fi, NFC, v.v.) mới vào Android trên phiên bản FCM hiện tại F, hãy thêm HAL vào compatibility_matrix.F.xml bằng các chế độ cài đặt optional sau:

  • optional="false" nếu các thiết bị đi kèm với V = F phải chạy bằng lớp trừu tượng phần cứng (HAL) này,
  • optional="true" nếu các thiết bị đi kèm với V = F có thể chạy mà không cần lớp HAL này.

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

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

Nâng cấp HAL (cơ chế nhỏ)

Trong quá trình phát triển, khi HAL có phiên bản nhỏ được nâng cấp từ x.z lên x.(z+1) tại Phiên bản FCM hiện tại F, nếu phiên bản đó:

  • Bắt buộc trên các thiết bị chạy bằng V = F, compatibility_matrix.F.xml phải nêu rõ là x.(z+1)optional="false".
  • Không bắt buộc trên các thiết bị chạy bằng V = F, compatibility_matrix.F.xml phải sao chép x.y-z và tính năng không bắt buộc từ compatibility_matrix.<F-1>.xml rồi thay đổi phiên bản thành x.w-(z+1) (trong đó w >= y).

Ví dụ: Android 8.1 giới thiệu broadcastradio@1.1 dưới dạng bản nâng cấp phiên bản nhỏ của HAL 1.0. Phiên bản cũ hơn, broadcastradio@1.0, là không bắt buộc đối với các thiết bị chạy Android 8.0, trong khi phiên bản mới hơn, broadcastradio@1.1, là không bắt buộc đối với các thiết bị chạy Android 8.1. Trong compatibility_matrix.1.xml:

<hal format="hidl" optional="true">
    <name>android.hardware.broadcastradio</name>
    <version>1.0</version>
    <interface>
        <name>IBroadcastRadioFactory</name>
        <instance>default</instance>
    </interface>
</hal>

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

<hal format="hidl" optional="true">
    <name>android.hardware.broadcastradio</name>
    <version>1.0-1</version>
    <interface>
        <name>IBroadcastRadioFactory</name>
        <instance>default</instance>
    </interface>
</hal>

Nâng cấp HAL (chính)

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

  • optional="false" chỉ có phiên bản x.0, nếu các thiết bị đi kèm với V = F phải chạy bằng x.0.
  • optional="false" nhưng cùng với các phiên bản lớn cũ trong cùng một thẻ <hal>, nếu các thiết bị đi kèm với V = F phải chạy bằng HAL này, nhưng có thể chạy bằng phiên bản lớn cũ.
  • optional="true" nếu các thiết bị đi kèm với V = F không phải chạy HAL.

Ví dụ: Android 9 giới thiệu health@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. Bạn không bắt buộc phải sử dụng phiên bản health@1.0 cũ đối với các thiết bị chạy Android 8.0 và Android 8.1. Các thiết bị chạy Android 9 không được cung cấp lớp HAL 1.0 không dùng nữa mà phải cung cấp phiên bản 2.0 mới. Tôi compatibility_matrix.legacy.xml, compatibility_matrix.1.xmlcompatibility_matrix.2.xml:

<hal format="hidl" optional="true">
    <name>android.hardware.health</name>
    <version>1.0</version>;
    <interface>
        <name>IHealth</name>
        <instance>default</instance>
    </interface>
</hal>

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

<hal format="hidl" optional="false">
    <name>android.hardware.health</name>
    <version>2.0</version>
    <interface>
        <name>IHealth</name>
        <instance>default</instance>
    </interface>
</hal>

Giới hạn:

  • Vì HAL 2.0 nằm trong compatibility_matrix.3.xml với optional="false", nên các thiết bị chạy Android 9 phải đi kèm với HAL 2.0.`
  • Vì HAL 1.0 không có trong compatibility_matrix.3.xml nên các thiết bị chạy Android 9 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 phiên bản cũ/1/2.xml (các phiên bản FCM cũ mà Android 9 có thể hoạt động) dưới dạng HAL không bắt buộc, nên khung Android 9 vẫn có thể hoạt động với HAL 1.0 (không được coi là Phiên bản HAL đã bị loại bỏ).

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 do Google chỉ thực hiện như một phần của bản phát hành AOSP (Dự án nguồn mở Android) 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 được tạo và khởi động.
  3. Cập nhật các thử nghiệm VTS để đảm bảo các thiết bị 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 V >= F.
  4. Xuất bản tệp lên AOSP.

Ví dụ: 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 product và system_ext có thể liệt kê các yêu cầu đối với từng phiên bản FCM nền tảng. Việc phát hành các phiên bản FCM trên phân vùng sản phẩm và phân vùng system_ext do chủ sở hữu của các hình ảnh này thực hiện tương ứng. Số phiên bản FCM trên phân vùng sản phẩm và phân vùng system_ext phải phù hợ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 ở phiên bản FCM F trong phân vùng sản phẩm và phân vùng system_ext phản ánh các yêu cầu trên một 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 (ví dụ: đối với HAL AOSP, Google sẽ đưa ra quyết định). Điều này có thể xảy ra khi bạn phát hành phiên bản HAL cao hơn (cho dù là phiên bản nhỏ hay lớn).

Ngừng sử dụng lớp trừu tượng phần cứng (HAL) của thiết bị

Khi một thiết bị cụ thể HAL foo@x.y không còn được dùng tại FCM Phiên bản F, điều đó có nghĩa là mọi thiết bị chạy phiên bản FCM mục tiêu V = F trở lên 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âng cấp thiết bị vẫn hỗ trợ phiên bản HAL (Lớp trừu tượng phần cứng) không dùng nữa.

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

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

Ví dụ: trong Android 9, health@2.0 được giới thiệu dưới dạng bản nâng cấp phiên bản chính của HAL 1.0. health@1.0 bị xoá khỏi compatibility_matrix.3.xml nhưng vẫn có trong compatibility_matrix.legacy.xml, compatibility_matrix.1.xmlcompatibility_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 tại FCM Phiên bản F, điều đó có nghĩa là mọi thiết bị chạy phiên bản FCM mục tiêu V = F trở lên đều không được kỳ vọng khung này sẽ cung cấp foo ở phiên bản x.y hoặc tại bất kỳ phiên bản nào cũ hơn x.y. Phiên bản HAL (Lớp trừu tượng phần cứng) không dùng nữa vẫn được khung cung cấp để 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 xem 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ị chạy bằng V = F, khung này sẽ không cung cấp HAL foo@x.y. Ma trận tương thích thiết bị trên các thiết bị chạy bằng V = F không được liệt kê HAL khung có max-level < V.

Ví dụ: trong Android 12, schedulerservice@1.0 không được dùng nữa. Thuộc tính max-level được đặt thành 5, phiên bản FCM ra mắt 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 các thiết bị đang hoạt động thuộc 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 SF đã đặt 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 xây dựng (để nó không được cài đặt trên hình ảnh hệ thống), đồng thời xoá mọi mã đã triển khai hoặc phụ thuộc vào chức năng đã bị xoá.

  2. Xoá các HAL khung có max-level thấp 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 đã bị xoá.

Các thiết bị có Phiên bản FCM mục tiêu bên 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 nằm trong bất kỳ ma trận tương thích công khai và bị treo nào, thì phiên bản đó sẽ đượ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ỉ có trong compatibility_matrix.3.xml.
  • HAL teleportation@1.0 không có trong bất kỳ ma trận tương thích đã phát hành nào và cũng được coi là HAL chưa phát hành.

Đối với HAL khung, nếu 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 đó sẽ đượ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 ma trận tương thích công khai và bị treo bất kỳ, thì phiên bản đó sẽ được phát hành. Ví dụ: sau khi FCM Phiên bản 3 bị treo và phát hành lên 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 ma trận tương thích công khai và bị treo có Phiên bản FCM cao nhất, thì phiên bản HAL vẫn là phiên bản hiện tại (tức là không bị ngừng sử dụ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à phiên bản HAL đã phát hành và hiện tại.

Đối với HAL khung, nếu phiên bản HAL nằm trong tệp kê khai khung của nhánh được phát hành mới nhất mà không có thuộc tính max-level hoặc (bất thường) 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 tại 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 sẽ không được dùng nữa khi và chỉ khi đáp ứng tất cả các điều kiện sau:

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

Ví dụ:

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

Đối với HAL khung, nếu phiên bản HAL nằm trong tệp kê khai khung của nhánh được 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 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 dùng nữa trong Android 12, như chỉ định trong tệp kê khai khung Android 12.

Đã xoá

Đối với HAL (Lớp trừu tượng phần cứng) của thiết bị, Phiên bản HAL sẽ bị xoá khi và chỉ khi các điều kiện sau đây xảy ra:

  • Bản phát hành này đã được phát hành trước đó.
  • Không nằm trong bất kỳ ma trận tương thích công khai và cố định nào mà khung hỗ trợ.

Các ma trận tương thích công khai, bị treo nhưng không được khung hỗ trợ được giữ lại trong cơ sở mã để xác định tập hợp Phiên bản HAL đã bị xoá. Nhờ đó, bạn có thể viết các phép kiểm thử VTS nhằm đảm bảo các HAL đã xoá không xuất hiện trên thiết bị mới.

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

  • Bản phát hành này đã được phát hành trước đó.
  • Tệp này không nằm trong bất kỳ tệp kê khai khung nào của nhánh được phát hành mới nhất.

FCM cũ

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

Nếu tệp này tồn tại cho FCM phiên bản F, thì bạn có thể nâng cấp mọi thiết bị không phải Treble lên F, miễn là tệp kê khai thiết bị tương thích với tệp này. Việc loại bỏ API này tuân theo quy trình tương tự như FCM đối với các phiên bản FCM mục tiêu khác (bị xoá sau khi số lượng thiết bị hoạt động trước phiên bản 8.0 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ể xem 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.