Bạn có thể sử dụng công cụ ota_from_target_files
có trong build/make/tools/releasetools
để tạo các gói OTA đầy đủ và gia tăng cho những 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 bản dựng Android tạo 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ó SKU khác nhau. Để làm như vậy, bạn cần định cấu hình các thiết bị mục tiêu để sử dụng dấu vân tay động và cập nhật siêu dữ liệu OTA để thêm tên và dấu vân tay của thiết bị vào các mục điều kiện tiên quyết và điều kiện hậu cần.
Android 8.0 đã ngừng sử 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 thiết bị này phải sử dụng các gói OTA dựa trên khối. Để tạo các gói OTA dựa trên khối hoặc các thiết bị chạy Android 7.x trở xuống, hãy truyền lựa chọn --block
đến tham số ota_from_target_files
.
Tạo 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 một gói OTA đầy đủ (trong $OUT
). Tệp .zip
kết quả chứa mọi thứ cần thiết để tạo các 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 các gói đầy đủ hoặc gói gia tăng.
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 kết quả nằm trong thư mục out/
.
ota_update.zip
hiện đã sẵn sàng được gửi đến các thiết bị kiểm thử (mọi thứ đều được ký bằng khoá kiểm thử). Đối với thiết bị người dùng, hãy tạo và sử dụng khoá riêng của bạn như được trình bày chi tiết trong phần Ký bản dựng để phát hành.
Tạo các bản cập nhật gia tăng
Bản cập nhật gia tăng 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 phải có 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 phiên bản trước, nên gói chỉ cần bao gồm một bản mã hoá sự khác biệt giữa hai tệp.
Bạn chỉ có thể cài đặt gói cập nhật gia tăng trên những 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 có tệp target_files.zip
của bản dựng trước (bản dựng mà 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 gia tăng cho những thiết bị chạy chính xác bản dựng trước đó được dùng làm điểm bắt đầu của gói gia tăng. Bạn phải cài đặt ROM cho các 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
, 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ị có bản dựng khác sẽ dẫn đến lỗi cài đặt. Khi quá trình cài đặt không thành công, thiết bị vẫn ở trạng thái hoạt động tương tự (chạy hệ thống cũ); gói sẽ xác minh trạng thái trước đó của tất cả các tệp mà gói cập nhật trước khi tác động đến các tệp đó, vì vậy, thiết bị sẽ không bị mắc kẹt ở trạng thái đã nâng cấp một phần.
Để mang lại 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 gia tăng. Điều này giúp người dùng nắm bắt được bản phát hành mới nhất và tránh phải trải qua một chuỗi cài đặt dài gồm các bản cập nhật gia tăng.
Tạo gói OTA cho nhiều SKU
Android 11 trở lên hỗ trợ việc sử dụng một gói OTA duy nhất cho nhiều thiết bị có SKU khác nhau. Để làm như vậy, bạn cần định cấu hình các thiết bị mục tiêu để sử dụng vân tay động và cập nhật siêu dữ liệu OTA (bằng cách sử dụng các công cụ OTA) để đưa tên thiết bị và vân tay vào các mục điều kiện trước và sau.
Giới thiệu về SKU
Định dạng của SKU là một biến thể của các giá trị tham số bản dựng kết hợp và thường là một tập hợp con chưa khai báo của các tham số build_fingerprint
hiện tại.
Các OEM có thể sử dụng mọi tổ hợp tham số bản dựng đượ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 phát)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 hoặc Trung Quốc) hoặc khu vực theo quốc gia hoặc ngôn ngữ cụ thể (chẳng hạn như Nhật Bản, tiếng Anh hoặc Trung Quốc)
Nhiều OEM sử dụng một hình ảnh cho nhiều SKU, sau đó lấy tên sản phẩm cuối cùng và dấu vân tay thiết bị tại thời gian chạy sau khi thiết bị khởi động. Quy trình này giúp đơn giản hoá quy trình phát triển nền tảng, cho phép các thiết bị có tuỳ chỉnh nhỏ nhưng có tên sản phẩm khác nhau chia sẻ hình ảnh chung (chẳng hạn như tardis
và tardispro
).
Sử dụng vân tay động
Dấu vân tay 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.name
và ro.product.device
. Vân tay số của thiết bị được lấy từ vân tay số của phân vùng hệ thống và được dùng làm giá trị nhận dạng duy nhất của các hình ảnh (và byte) đang chạy trên thiết bị. Để tạo dấu vân tay độ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 dấu vân tay động cho thiết bị đó.
Ví dụ: để sử dụng dấu vân tay động cho các thiết bị tardis
và tardispro
, hãy cập nhật các tệp sau như minh hoạ bên dưới.
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 sẽ đặt tên thiết bị, dấu vân tay và giá trị ro.build.fingerprint
một cách linh động 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).
Cập nhật siêu dữ liệu của gói OTA
Gói OTA chứa một 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 hậu cần của gói OTA. Ví dụ: mã sau đây là tệp siêu dữ liệu cho 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-incremental
và pre-build
xác định trạng thái mà thiết bị phải có trước khi gói OTA có thể cài đặt. Các giá trị post-build-incremental
và post-build
xác định trạng thái mà thiết bị dự kiến sẽ có sau khi cài đặt gói OTA. Giá trị của các trường pre-
và 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ựngro.product.device
. - Các giá trị
pre-build-incremental
vàpost-build-incremental
được lấy từ thuộc tính bản dựngro.build.version.incremental
. - Các giá trị
pre-build
vàpost-build
được lấy từ thuộc tính bản dựngro.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 các giá trị của biến thời gian chạy được dùng để tạo dấu vân tay động của 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 và vân tay thiết bị vào các điều kiện pre-
và post-
(dùng ký tự dấu gạch dọc | làm dấu phân cách). Cờ --boot_variable_file
có cú pháp và nội dung mô tả sau đây.
- Cú pháp:
--boot_variable_file <path>
- Nội dung mô tả: Chỉ định đườ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.*
. Được dùng để tính toán dấu vân tay có thể có trong thời gian chạy khi một số thuộc tínhro.product.*
bị câu lệnh nhập ghi đè. Tệp này dự kiến có 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ị tardis
và tardispro
sẽ có dạng như sau.
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 chế độ triển khai tham chiếu.
Danh sách thay đổi này sẽ phân tích cú pháp có điều kiện các câu lệnh import
trong tệp build.prop
. Nhờ đó, các chế độ ghi đè thuộc tính có thể được nhận dạng và phản ánh trong siêu dữ liệu OTA cuối cùng.