Android 10 hỗ trợ phân vùng động , một hệ thống phân vùng không gian người dùng có thể tạo, thay đổi kích thước và hủy phân vùng trong quá trình cập nhật qua mạng (OTA).
Trang này mô tả cách ứng dụng khách OTA thay đổi kích thước phân vùng động trong quá trình cập nhật cho các thiết bị A/B khởi chạy mà không hỗ trợ phân vùng động và cách ứng dụng khách OTA nâng cấp lên Android 10.
Lý lịch
Trong quá trình cập nhật thiết bị A/B để hỗ trợ phân vùng động, bảng phân vùng GUID (GPT) trên thiết bị sẽ được giữ nguyên nên không có super
phân vùng trên thiết bị. Siêu dữ liệu được lưu trữ tại system_a
và system_b
, nhưng điều này có thể được tùy chỉnh bằng cách thay đổi BOARD_SUPER_PARTITION_METADATA_DEVICE
.
Trong mỗi thiết bị khối, có hai khe siêu dữ liệu. Chỉ có một khe siêu dữ liệu trong mỗi thiết bị khối được sử dụng. Ví dụ: Siêu dữ liệu 0 tại system_a
và Siêu dữ liệu 1 tại system_b
tương ứng với các phân vùng ở khe A và B. Trong thời gian chạy, việc cập nhật vị trí nào không quan trọng.
Trong trang này, các vùng siêu dữ liệu được gọi là Siêu dữ liệu S (nguồn) và Siêu dữ liệu T (đích). Tương tự, các phân vùng được gọi là system_s
, vendor_t
, v.v.
Để biết thêm thông tin về cấu hình hệ thống xây dựng , hãy xem Nâng cấp thiết bị .
Để biết thêm thông tin về cách phân vùng thuộc về nhóm cập nhật , hãy xem Thay đổi cấu hình bảng cho thiết bị mới.
Một ví dụ về siêu dữ liệu trên thiết bị là:
- Hệ thống thiết bị khối vật
system_a
- Siêu dữ liệu 0
- Nhóm
foo_a
-
system_a
phân vùng logic (động)_a - Phân vùng logic (động)
product_services_a
- Các phân vùng khác được Foo cập nhật
-
- Nhóm
bar_a
-
vendor_a
phân vùng logic (động)_a -
product_a
phân vùng logic (động)_a - Các phân vùng khác được Bar cập nhật
-
- Nhóm
- Siêu dữ liệu 1 (không được sử dụng)
- Siêu dữ liệu 0
- Hệ thống thiết bị khối vật
system_b
- Siêu dữ liệu 0 (không được sử dụng)
- Siêu dữ liệu 1
- Nhóm foo_b
-
system_b
phân vùng logic (động)_b - Phân vùng logic (động)
product_services_b
- Các phân vùng khác được Foo cập nhật
-
- Nhóm bar_b
-
vendor_b
phân vùng logic (động)_b -
product_b
phân vùng logic (động)_b - Các phân vùng khác được Bar cập nhật
-
- Nhóm foo_b
Bạn có thể sử dụng công cụ lpdump
trong system/extras/partition_tools
để kết xuất siêu dữ liệu trên thiết bị của mình. Ví dụ:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Trang bị thêm bản cập nhật
Trên các thiết bị chạy Android 9 trở xuống, ứng dụng khách OTA trên thiết bị không hỗ trợ ánh xạ phân vùng động trước khi cập nhật. Một bộ bản vá bổ sung được tạo để ánh xạ có thể được áp dụng trực tiếp vào các phân vùng vật lý hiện có.
Trình tạo OTA xây dựng tệp super.img
cuối cùng chứa nội dung của tất cả các phân vùng động, sau đó chia hình ảnh thành nhiều hình ảnh phù hợp với kích thước của các thiết bị khối vật lý tương ứng với hệ thống, nhà cung cấp, v.v. Những hình ảnh này được đặt tên là super_system.img
, super_vendor.img
, v.v. Máy khách OTA áp dụng những hình ảnh này cho các phân vùng vật lý, thay vì áp dụng các hình ảnh cho các phân vùng logic (động).
Vì máy khách OTA không biết cách ánh xạ các phân vùng động nên tất cả các bước sau cài đặt sẽ tự động bị tắt đối với các phân vùng này khi gói cập nhật được tạo. Xem Định cấu hình sau cài đặt để biết thêm chi tiết.
Luồng cập nhật giống như trong Android 9.
Trước khi cập nhật:
ro.boot.dynamic_partitions= ro.boot.dynamic_partitions_retrofit=
Sau khi cập nhật:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Cập nhật trong tương lai sau khi trang bị thêm
Sau khi cập nhật trang bị thêm, máy khách OTA được cập nhật để hoạt động với các phân vùng động. Phạm vi của các phân vùng nguồn không bao giờ trải rộng trên các phân vùng vật lý đích.
Luồng cập nhật bằng gói cập nhật thông thường
- Khởi tạo
super
dữ liệu phân vùng.- Xây dựng siêu dữ liệu M mới từ Siêu dữ liệu S (siêu dữ liệu nguồn). Ví dụ: nếu Siêu dữ liệu S sử dụng [
system_s
,vendor_s
,product_s
] làm thiết bị khối thì siêu dữ liệu mới M sử dụng [system_t
,vendor_t
,product_t
] làm thiết bị khối. Tất cả các nhóm và phân vùng đều bị loại bỏ trong M. - Thêm các nhóm mục tiêu và phân vùng theo trường
dynamic_partition_metadata
trong bảng kê khai cập nhật. Kích thước của mỗi phân vùng có thể được tìm thấy trongnew_partition_info
. - Viết M vào siêu dữ liệu T.
- Ánh xạ các phân vùng đã thêm trên trình ánh xạ thiết bị dưới dạng có thể ghi.
- Xây dựng siêu dữ liệu M mới từ Siêu dữ liệu S (siêu dữ liệu nguồn). Ví dụ: nếu Siêu dữ liệu S sử dụng [
- Áp dụng bản cập nhật trên các thiết bị khối.
- Nếu cần, hãy ánh xạ các phân vùng nguồn trên trình ánh xạ thiết bị dưới dạng chỉ đọc. Điều này là cần thiết cho việc tải phụ vì các phân vùng nguồn không được ánh xạ trước khi cập nhật.
- Áp dụng bản cập nhật đầy đủ hoặc delta cho tất cả các thiết bị khối tại vị trí mục tiêu.
- Gắn các phân vùng để chạy tập lệnh sau cài đặt, sau đó ngắt kết nối các phân vùng.
- Bỏ ánh xạ các phân vùng mục tiêu.
Luồng cập nhật bằng gói cập nhật trang bị thêm
Nếu gói cập nhật trang bị thêm được áp dụng trên một thiết bị đã kích hoạt phân vùng động, ứng dụng khách OTA sẽ áp dụng trực tiếp tệp super.img
đã chia trên các thiết bị khối. Luồng cập nhật tương tự như cập nhật trang bị thêm. Xem Trang bị thêm bản cập nhật để biết chi tiết.
Ví dụ: giả sử như sau:
- Khe A là khe hoạt động.
-
system_a
chứa siêu dữ liệu hoạt động ở vị trí 0. -
system_a
,vendor_a
vàproduct_a
được sử dụng làm thiết bị khối.
Khi máy khách OTA nhận được gói cập nhật trang bị thêm, nó sẽ áp dụng super_system.img
trên vật lý system_b
, super_vendor.img
trên vật lý vendor_b
và super_product.img
trên vật lý product_b
. Thiết bị khối vật lý system_b
chứa siêu dữ liệu chính xác để ánh xạ logic system_b
, vendor_b
và product_b
khi khởi động.
Tạo gói cập nhật
OTA gia tăng
Khi tạo các OTA gia tăng cho các thiết bị trang bị thêm, các bản cập nhật tùy thuộc vào việc bản dựng cơ sở có xác định PRODUCT_USE_DYNAMIC_PARTITIONS
và PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
hay không.
- Nếu bản dựng cơ sở không xác định các biến thì đây là bản cập nhật trang bị thêm. Gói cập nhật chứa tệp
super.img
đã tách và vô hiệu hóa bước sau cài đặt. - Nếu bản dựng cơ sở xác định các biến thì bản cập nhật này giống như bản cập nhật thông thường có phân vùng động. Gói cập nhật chứa hình ảnh cho các phân vùng logic (động). Bước sau cài đặt có thể được kích hoạt.
OTA đầy đủ
Hai gói OTA đầy đủ được tạo cho các thiết bị trang bị thêm.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
luôn chứasuper.img
phân tách và vô hiệu hóa bước sau cài đặt để cập nhật trang bị thêm.- Nó được tạo bằng một đối số bổ sung
--retrofit_dynamic_partitions
cho tập lệnhota_from_target_files
. - Nó có thể được áp dụng cho tất cả các bản dựng.
- Nó được tạo bằng một đối số bổ sung
-
$(PRODUCT)-ota-$(TAG).zip
chứa các hình ảnh hợp lý để cập nhật trong tương lai.- Chỉ áp dụng điều này cho các bản dựng đã bật phân vùng động. Xem chi tiết bên dưới về việc thực thi điều này.
Từ chối bản cập nhật không trang bị thêm trên các bản dựng cũ
Chỉ áp dụng gói OTA đầy đủ thông thường cho các bản dựng đã bật phân vùng động. Nếu máy chủ OTA được định cấu hình không chính xác và đẩy các gói này sang các thiết bị chạy Android 9 trở xuống, thiết bị sẽ không khởi động được. Ứng dụng khách OTA trên Android 9 trở xuống không thể phân biệt được sự khác biệt giữa gói OTA trang bị thêm và gói OTA đầy đủ thông thường, vì vậy, ứng dụng khách sẽ không từ chối gói đầy đủ.
Để ngăn thiết bị chấp nhận gói OTA đầy đủ, bạn có thể yêu cầu bước sau cài đặt để kiểm tra cấu hình thiết bị hiện có. Ví dụ:
device/ device_name /dynamic_partitions/check_dynamic_partitions
#!/system/bin/sh DP_PROPERTY_NAME="ro.boot.dynamic_partitions" DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit" DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME}) DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME}) if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then echo "Error: applied non-retrofit update on build without dynamic" \ "partitions." echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}" echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}" exit 1 fi
device/ device_name /dynamic_partitions/Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= check_dynamic_partitions LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_SRC_FILES := check_dynamic_partitions LOCAL_PRODUCT_MODULE := true include $(BUILD_PREBUILT)
device/ device_name /device.mk
PRODUCT_PACKAGES += check_dynamic_partitions # OPTIONAL=false so that the error in check_dynamic_partitions will be # propagated to OTA client. AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_product=true \ POSTINSTALL_PATH_product=bin/check_dynamic_partitions \ FILESYSTEM_TYPE_product=ext4 \ POSTINSTALL_OPTIONAL_product=false \
Khi gói OTA thông thường được áp dụng trên thiết bị không bật phân vùng động, máy khách OTA sẽ chạy check_dynamic_partitions
dưới dạng bước sau cài đặt và từ chối bản cập nhật.