Tạo gói OTA

Bạn có thể sử dụng công cụ ota_from_target_files được cung cấp trong build/make/tools/releasetools để tạo các gói OTA đầy đủ và tăng dần cho các thiết bị sử dụng bản cập nhật hệ thống A/B hoặc bản cập nhật hệ thống không phải A/B. Công cụ này lấy tệp target-files.zip do hệ thống xây dựng Android tạo ra làm dữ liệu đầu vào.

Đối với các thiết bị chạy Android 11 trở lên, bạn có thể tạo một gói OTA cho nhiều thiết bị có các SKU khác nhau. Để làm như vậy, bạn sẽ phải định cấu hình các thiết bị mục tiêu để sử dụng vân tay độngcập nhật siêu dữ liệu OTA để đưa tên thiết bị và vân tay vào các mục trước và sau điều kiện.

Android 8.0 không còn dùng các gói OTA dựa trên tệp cho các thiết bị không phải A/B. Thay vào đó, các gói này phải sử dụng gói OTA dựa trên khối. Để tạo gói OTA dựa trên khối hoặc thiết bị chạy Android 7.x trở xuống, hãy truyền tuỳ chọn --block vào tham số ota_from_target_files.

Xây dựng bản cập nhật đầy đủ

Bản cập nhật đầy đủ là một gói OTA chứa toàn bộ trạng thái cuối cùng của thiết bị (phân vùng hệ thống, khởi động và khôi phục). Miễn là thiết bị có thể nhận và áp dụng gói, gói có thể cài đặt bản dựng bất kể trạng thái hiện tại của thiết bị. Ví dụ: các lệnh sau đây sử dụng công cụ phát hành để tạo kho lưu trữ target-files.zip cho thiết bị tardis.

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist tạo gói OTA đầy đủ (trong $OUT). Tệp .zip tổng hợp chứa mọi thứ cần thiết để tạo gói OTA cho thiết bị tardis. Bạn cũng có thể tạo ota_from_target_files dưới dạng tệp nhị phân python và gọi tệp này để tạo gói đầy đủ hoặc gói tăng dần.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

Đường dẫn ota_from_target_files được thiết lập trong $PATH và tệp nhị phân python thu được nằm trong thư mục out/.

ota_update.zip hiện đã sẵn sàng để gửi đến các thiết bị thử nghiệm (mọi thứ được ký bằng khoá kiểm thử). Đối với thiết bị của người dùng, hãy tạo và sử dụng khoá riêng tư của riêng bạn như được nêu chi tiết trong bài viết Ký bản dựng để phát hành.

Xây dựng các bản cập nhật gia tăng

Bản cập nhật tăng dần là một gói OTA chứa các bản vá nhị phân cho dữ liệu đã có trên thiết bị. Các gói có bản cập nhật gia tăng thường nhỏ hơn vì không cần thêm các tệp không thay đổi. Ngoài ra, vì các tệp đã thay đổi thường rất giống với các phiên bản trước, nên gói chỉ cần mã hoá sự khác biệt giữa 2 tệp.

Bạn chỉ có thể cài đặt gói cập nhật gia tăng trên các thiết bị có bản dựng nguồn được dùng để tạo gói. Để tạo bản cập nhật gia tăng, bạn cần tệp target_files.zip của bản dựng trước (bản bạn muốn cập nhật từ) cũng như tệp target_files.zip của bản dựng mới. Ví dụ: các lệnh sau đây sử dụng công cụ phát hành để tạo bản cập nhật gia tăng cho thiết bị tardis.

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

Bản dựng này rất giống với bản dựng trước và gói cập nhật gia tăng (incremental_ota_update.zip) nhỏ hơn nhiều so với bản cập nhật đầy đủ tương ứng (khoảng 1 MB thay vì 60 MB).

Chỉ phân phối gói tăng dần cho các thiết bị chạy chính xác cùng bản dựng trước đó được dùng làm điểm bắt đầu của gói tăng dần. Bạn phải cài đặt ROM hình ảnh trong PREVIOUS-tardis-target_files.zip hoặc PREVIOUS-tardis-img.zip (cả hai đều được tạo bằng make dist, sẽ được cài đặt ROM bằng fastboot update), thay vì các hình ảnh trong thư mục PRODUCT_OUT (được tạo bằng make và sẽ được cài đặt ROM bằng fastboot flashall). Việc cố gắng cài đặt gói gia tăng trên một thiết bị với một số bản dựng khác sẽ dẫn đến lỗi cài đặt. Khi cài đặt không thành công, thiết bị vẫn ở trạng thái hoạt động như cũ (chạy hệ thống cũ); gói này sẽ xác minh trạng thái trước đó của tất cả các tệp mà nó cập nhật trước khi chạm vào các tệp đó, nhờ đó, thiết bị không bị mắc kẹt trong trạng thái đã nâng cấp một nửa.

Để mang đến trải nghiệm tốt nhất cho người dùng, hãy cung cấp bản cập nhật đầy đủ cho mỗi 3–4 bản cập nhật tăng dần. Điều này giúp người dùng bắt kịp bản phát hành mới nhất và tránh phải cập nhật gia tăng một cách lâu dài.

Xây dựng gói OTA cho nhiều SKU

Android 11 trở lên hỗ trợ sử dụng một gói OTA duy nhất cho nhiều thiết bị có SKU khác nhau. Nếu làm như vậy, bạn sẽ phải định cấu hình các thiết bị mục tiêu để sử dụng vân tay số động và cập nhật siêu dữ liệu OTA (bằng các công cụ OTA) để đưa tên thiết bị và vân tay vào các mục trước và sau điều kiện.

Giới thiệu về SKU

Định dạng của SKU là biến thể của các giá trị thông số bản dựng kết hợp và thường là tập hợp con chưa được khai báo của các tham số build_fingerprint hiện tại. OEM có thể sử dụng bất kỳ tổ hợp tham số bản dựng nào được CDD phê duyệt cho một SKU, đồng thời sử dụng một hình ảnh duy nhất cho các SKU đó. Ví dụ: SKU sau đây có nhiều biến thể:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA là cấp thiết bị (chẳng hạn như Pro, Premium hoặc Plus)
  • modifierB là biến thể phần cứng (chẳng hạn như đài)
  • modifierC là khu vực, có thể là khu vực chung (chẳng hạn như Bắc Mỹ, Châu Âu, Trung Đông và Châu Phi (EMEA) hoặc CHN) hoặc theo quốc gia hoặc ngôn ngữ cụ thể (chẳng hạn như JPN, tiếng Anh hoặc CHN)

Nhiều OEM sử dụng một hình ảnh duy nhất cho nhiều SKU, sau đó lấy tên sản phẩm cuối cùng và vân tay số của thiết bị trong thời gian chạy sau khi thiết bị khởi động. Quy trình này giúp đơn giản hoá quá trình phát triển nền tảng, cho phép các thiết bị có những điểm tuỳ chỉnh nhỏ nhưng tên sản phẩm khác nhau dùng chung các hình ảnh chung (chẳng hạn như tardistardispro).

Sử dụng vân tay động

Vân tay số là một chuỗi nối được xác định của các tham số bản dựng, chẳng hạn như ro.product.brand, ro.product.namero.product.device. Vân tay số của thiết bị được lấy từ vân tay số phân vùng hệ thống và dùng làm giá trị nhận dạng duy nhất của hình ảnh (và byte) chạy trên thiết bị. Để tạo vân tay số động, hãy sử dụng logic động trong tệp build.prop của thiết bị để lấy giá trị của các biến trình tải khởi động tại thời điểm khởi động thiết bị, sau đó sử dụng dữ liệu đó để tạo vân tay động cho thiết bị đó.

Ví dụ: để sử dụng vân tay linh động cho thiết bị tardistardispro, hãy cập nhật các tệp sau đây như minh hoạ dưới đây.

  • Cập nhật tệp odm/etc/build_std.prop để chứa dòng sau.

    ro.odm.product.device=tardis
    
  • Cập nhật tệp odm/etc/build_pro.prop để chứa dòng sau.

    ro.odm.product.device=tardispro
    
  • Cập nhật tệp odm/etc/build.prop để chứa các dòng sau.

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

Các dòng này tự động đặt giá trị tên thiết bị, vân tay số và ro.build.fingerprint dựa trên giá trị của thuộc tính trình tải khởi động ro.boot.product.hardware.sku (chỉ có quyền đọc).

Cập nhật siêu dữ liệu của gói OTA

Gói OTA chứa tệp siêu dữ liệu (META-INF/com/android/metadata) mô tả gói, bao gồm cả điều kiện tiên quyết và điều kiện sau của gói OTA. Ví dụ: Mã sau đây là tệp siêu dữ liệu của một gói OTA nhắm đến thiết bị tardis.

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

Các giá trị pre-device, pre-build-incrementalpre-build xác định trạng thái mà một thiết bị phải có trước khi gói OTA có thể cài đặt. Các giá trị post-build-incrementalpost-build xác định trạng thái dự kiến của thiết bị sau khi cài đặt gói OTA. Giá trị của trường pre-post- được lấy từ các thuộc tính bản dựng tương ứng sau đây.

  • Giá trị pre-device được lấy từ thuộc tính bản dựng ro.product.device.
  • Các giá trị pre-build-incrementalpost-build-incremental bắt nguồn từ thuộc tính bản dựng ro.build.version.incremental.
  • Các giá trị pre-buildpost-build được lấy từ thuộc tính bản dựng ro.build.fingerprint.

Trên các thiết bị chạy Android 11 trở lên, bạn có thể sử dụng cờ --boot_variable_file trong các công cụ OTA để chỉ định đường dẫn đến một tệp chứa giá trị của các biến thời gian chạy dùng để tạo vân tay động cho thiết bị. Sau đó, dữ liệu này được dùng để cập nhật siêu dữ liệu OTA nhằm đưa tên thiết bị và vân tay số vào điều kiện pre-post- (sử dụng ký tự dấu gạch đứng | làm dấu phân tách). Cờ --boot_variable_file có cú pháp và nội dung mô tả như sau.

  • Cú pháp: --boot_variable_file <path>
  • Nội dung mô tả: Chỉ định một đường dẫn đến một tệp chứa các giá trị có thể có của thuộc tính ro.boot.*. Dùng để tính toán các vân tay số có thể có trong thời gian chạy khi một số thuộc tính ro.product.* bị câu lệnh nhập ghi đè. Tệp này yêu cầu một thuộc tính trên mỗi dòng, trong đó mỗi dòng có định dạng sau: prop_name=value1,value2.

Ví dụ: khi thuộc tính là ro.boot.product.hardware.sku=std,pro, siêu dữ liệu OTA cho các thiết bị tardistardispro sẽ như minh hoạ dưới đây.

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

Để hỗ trợ chức năng này trên các thiết bị chạy Android 10, hãy xem cách triển khai tệp tham chiếu. Danh sách thay đổi này phân tích cú pháp các câu lệnh import trong tệp build.prop theo cách có điều kiện, cho phép các cơ chế ghi đè thuộc tính được nhận dạng và phản ánh trong siêu dữ liệu OTA cuối cùng.