Vòng đời của FCM

Bản phát hành khung Android có nhiều Ma trận tương thích với khung (FCM), một ma trận cho mỗi Phiên bản FCM đích có thể nâng cấp, xác định những gì khung có thể sử dụng và các yêu cầu về Phiên bản FCM đích. 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 riêng, 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ùng phương thức.

Thuật ngữ

Ma trận 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 của nhà cung cấp tuân thủ. Ma trận tương thích được phân phiên bản và một phiên bản mới sẽ bị đóng băng cho mỗi bản phát hành khung. Mỗi bản phát hành khung chứa nhiều FCM.
Phiên bản FCM 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 có thể hoạt động với mọi cách triển khai 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 đích (V)
Phiên bản FCM được nhắm đến (từ SF), được khai báo rõ ràng trong tệp kê khai thiết bị mà một cách triển khai của nhà cung cấp đáp ứng. Bạn phải tạo một cách triển khai của nhà cung cấp dựa trên một FCM đã xuất bản, mặc dù cách triển khai đó 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ị
Tệp XML chỉ định những 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ị giới hạn bởi Phiên bản FCM đích của thiết bị nhưng có thể liệt kê các HAL mới hơn một cách nghiêm ngặt so với FC tương ứng với V.
HAL thiết bị
Các 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 với khung (FCM).
Ma trận 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 những phiên bản HAL mà phía khung của giao diện nhà cung cấp (bao gồm cả hình ảnh hệ thống, system_ext và sản phẩm) cung cấp. Các HAL trong tệp kê khai khung sẽ bị tắt động theo Phiên bản FCM đích của thiết bị.
HAL khung
Các HAL được liệt kê là đượ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 FCM trong cơ sở mã

Tài liệu này mô tả vòng đời FCM ở dạng trừu tượng. Để xem các tệp kê khai được hỗ trợ, hãy tham khảo hardware/interfaces/compatibility_matrices/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 bằng Android 12 thường sẽ có FCM cấp 6, nhưng thiết bị đó có thể triển khai FCM cấp 7 trở lên, điều này sẽ thay đổi hành vi của Android và buộc các API mới hơn của nhà cung cấp phải được sử dụng như chỉ định trong ma trận tương thích. Các cấp độ được hỗ trợ cho Android 16 là:

FCM Phiên bản Android
6 Android 12/S
7 Android 13/T
8 Android 14/U
202404 Android 15/V
202504 Android 16/B

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

Khi Dự án Treble được công bố, hình ảnh hệ thống Android được xây dựng để tương thích ngược với 3 phiên bản trước của cách triển khai của nhà cung cấp (tổng cộng 4 phiên bản). Để hỗ trợ thời gian sử dụng thiết bị dài hơn, khoảng thời gian này đã tăng lên để hỗ trợ phiên bản FCM hiện tại và 6 phiên bản trước (tổng cộng 7 phiên bản) cho 202404 trở lên.

Khi Android ngừng sử dụng một cấp độ FCM, các 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 ngầm cho phép sử dụng các HAL được liệt kê ở các cấp độ FCM cao 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 được thay đổi.

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 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 sau đây đã được thêm vào compatibility_matrix.F.xml (trước đây có tên là compatibility_matrix.current.xml tạm thời 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 (phụ)

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

Trong quá trình phát triển, khi một HAL AIDL có bản nâng cấp phiên bản từ 2 lên 3 ở Phiên bản FCM hiện tại F, phiên bản mới sẽ được thêm vào mục HAL trong compatibility_matrix.F.xml. Trường phiên bản của mục HAL chấp nhận các phạm vi 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 các FCM cũ hơn, 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 trong các FCM cũ hơn 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à được 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 (chính)

Trong quá trình phát triển, khi một HAL có bản nâng cấp phiên bản 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 với các chế độ cài đặt sau:

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

Ví dụ: phiên bản FCM 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 chúng cung cấp HAL. Trong ví dụ này, các phiên bản FCM trước đó chứa mục này:

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

Sao chép mục 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, các thiết bị nhắm đến phiên bản FCM 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ũ hơn, nên khung 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ũ hơn.

Phiên bản FCM mới

Quá 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 xây dựng và khởi động.
  3. Cập nhật các bài kiểm thử 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 đích V >= F.
  4. Xuất bản tệp lên AOSP.

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

Ngoài ra, các FCM sản phẩm và system_ext cũng có thể liệt kê các yêu cầu cho 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 các phân vùng sản phẩm và 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 các 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 ở phiên bản FCM F trong các 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 đích 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 các 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à phụ hay chính) được phát hành.

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

Khi một HAL thiết bị nhất định foo@x.y bị ngừng sử dụng ở Phiên bản FCM F, điều đó có nghĩa là mọi thiết bị chạy bằng Phiên bản FCM đích 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 vẫn hỗ trợ 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 đượ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 đích 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 yêu cầu phiên bản cao hơn (chính hoặc phụ);
  • Khung 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 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 HAL khung nhất định foo@x.y bị ngừng sử dụng ở Phiên bản FCM F, điều đó có nghĩa là mọi thiết bị chạy bằng Phiên bản FCM đích V = F trở lên không được mong đợi khung 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 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 đượ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ị chạy bằng V = F, khung không cung cấp HAL foo@x.y. Ma trận tương thích với thiết bị trên các thiết bị chạy bằng V = F không được liệt kê các HAL khung có max-level < V.

Ví dụ: trong Android 12, schedulerservice@1.0 bị ngừng sử dụng. Thuộc tính max-level của thuộc tính này đượ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 đích

Chúng tôi sử dụng quy trình dựa trên lịch trình để xác định việc xoá phiên bản FCM đích, nhằm duy trì khả năng tương thích trong khoảng thời gian bắt buộc và hỗ trợ các yêu cầu của đối tác đối với các thiết bị có thời gian sử dụng lâu hơn.

Khi xoá một phiên bản FCM đích khỏi tập hợp SF của bản phát hành khung tiếp theo, chúng tôi sẽ thực hiện cả hai bước sau:

  1. Xoá compatibility_matrix.V.xml khỏi các quy tắc bản dựng (để tệp này 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 khả năng đã 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 đã xoá.

Ngừng sử dụng theo giai đoạn cho các cấu hình phát hành

Chiến lược phân nhánh của Trunk Stable, trong đó Bản phát hành nền tảng hằng quý (QPR) được lấy trực tiếp từ git_main thay vì các nhánh phát hành-dev riêng biệt, yêu cầu quy trình ngừng sử dụng theo giai đoạn. Một phiên bản FCM có thể bị xoá để có tín hiệu sớm trong các bản dựng trunk_staging trong khi vẫn được hỗ trợ trong nhánh phát hành để phù hợp với các thiết bị sử dụng QPR trong suốt cả năm.

Thông thường, một bản phát hành khung hỗ trợ 6 FCM: một phiên bản hiện tại, 4 phiên bản trước và một phiên bản bổ sung để hỗ trợ QPR. Số này có thể tăng lên nếu các phiên bản FCM cụ thể (chẳng hạn như 202404 của Android 15) có thời gian hỗ trợ kéo dài để thiết bị có tuổi thọ cao hơn.

Các thiết bị có Phiên bản FCM đích 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 đó.

Xoá các HAL đã ngừng sử dụng hoàn toàn

Khi một phiên bản FCM bị xoá, một số giao diện HAL hoặc phiên bản của giao diện HAL sẽ không còn xuất hiện trong bất kỳ FCM nào. Điều này có nghĩa là Android không còn hỗ trợ các giao diện hoặc phiên bản đó nữa, ngay cả đối với việc nâng cấp thiết bị.

Sau khi một HAL không còn được hỗ trợ, nhà phát triển sẽ xoá các tham chiếu đến giao diện HAL đó khỏi Android, bao gồm cả trong mã ứng dụng trong khung, cách triển khai mặc định và các trường hợp kiểm thử VTS.

Nếu không có HAL được hỗ trợ nào kế thừa từ HAL đang bị xoá, thì chính định nghĩa HAL có thể bị xoá bằng một vài bước bổ sung.

  1. Xoá định nghĩa giao diện HAL khỏi mã nguồn. Điều này bao gồm các tệp *.aidl và mô-đun Android.bp aidl_interface.
  2. Nếu là HIDL, hãy xoá HASH khỏi hardware/interfaces/current.txt.
  3. Nếu là AIDL, hãy xoá thư mục aidl_api có các tệp AIDL bị đóng băng.
  4. Xoá giao diện khỏi hardware/interfaces/compatibility_matrices/exclude/fcm_exclude.cpp.

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 các HAL thiết bị, nếu một Phiên bản HAL không có 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 đó được coi là chưa phát hành và có thể đang trong quá trình phát triển. Điều này bao gồm 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à 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 các 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 các HAL thiết bị, nếu một Phiên bản HAL có 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 Phiên bản FCM 3 bị đóng băng và xuất bản 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 một Phiên bản HAL có trong 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 dùng nữa). 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 các HAL khung, nếu một phiên bản HAL có 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 (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 các HAL thiết bị, một Phiên bản HAL bị ngừng sử dụng nếu và chỉ khi đáp ứng tất cả điều kiện sau:

  • Đã phát hành.
  • Không có trong ma trận tương thích công khai và bị đóng băng có Phiên bản FCM cao nhất.
  • Có trong ma trận tương thích công khai và bị đóng băng mà khung vẫn hỗ trợ.

Ví dụ:

Do đó, power@1.0 là phiên bản hiện tại, nhưng KHÔNG bị ngừng sử dụng trong Android 9.

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

Đã xoá

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

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

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

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

  • Trước đây đã phát hành.
  • Không có trong bất kỳ tệp kê khai khung nào của nhánh phát hành mới nhất.

FCM cũ

Phiên bản FCM đích cũ là một giá trị đặc biệt cho tất 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ị chạy 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 với điều kiện tệp kê khai thiết bị của thiết bị đó tương thích với tệp này. Việc xoá tệp này tuân theo quy trình tương tự như FCM cho các Phiên bản FCM đích khác (bị xoá sau khi số lượng thiết bị đang hoạt động trước phiên bản 8.0 giảm xuống dưới một ngưỡng nhất định).

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.