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, đổi kích thước và huỷ phân vùng trong quá trình cập nhật qua mạng không dây (OTA).
Trang này mô tả cách các ứng dụng OTA đổi kích thước phân vùng động trong quá trình cập nhật các thiết bị A/B đã khởi chạy mà không hỗ trợ phân vùng động, cũng như cách các ứng dụng OTA nâng cấp lên Android 10.
Thông tin khái quát
Trong quá trình cập nhật thiết bị A/B để hỗ trợ các phân vùng động, bảng phân vùng GUID (GPT) trên thiết bị sẽ được giữ nguyên, vì vậy, không có phân vùng super
nào trên thiết bị. Siêu dữ liệu được lưu trữ tại system_a
và system_b
, nhưng bạn có thể tuỳ chỉnh siêu dữ liệu này 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ỉ sử dụng một khe siêu dữ liệu trong mỗi thiết bị khối. 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 tại vị trí A và B. Tại thời gian chạy, không quan trọng là khe nào đang được cập nhật.
Trong trang này, các khe siêu dữ liệu được gọi là Siêu dữ liệu S (nguồn) và Siêu dữ liệu T (mục tiêu). 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, vui lòng xem bài viết Nâng cấp thiết bị.
Để biết thêm thông tin về cách các phân vùng thuộc về nhóm cập nhật, hãy xem Thay đổi về cấu hình bảng cho thiết bị mới.
Ví dụ về siêu dữ liệu trên thiết bị:
- Thiết bị khối thực
system_a
- Siêu dữ liệu 0
- Nhóm
foo_a
- Phân vùng logic (động)
system_a
- Phân vùng logic (động)
product_services_a
- Các phân vùng khác do Foo cập nhật
- Phân vùng logic (động)
- Nhóm
bar_a
- Phân vùng logic (động)
vendor_a
- Phân vùng logic (động)
product_a
- Các phân vùng khác do Bar cập nhật
- Phân vùng logic (động)
- Nhóm
- Siêu dữ liệu 1 (không được sử dụng)
- Siêu dữ liệu 0
- Thiết bị khối thực
system_b
- Siêu dữ liệu 0 (không được sử dụng)
- Siêu dữ liệu 1
- Nhóm foo_b
- Phân vùng logic (động)
system_b
- Phân vùng logic (động)
product_services_b
- Các phân vùng khác do Foo cập nhật
- Phân vùng logic (động)
- Nhóm bar_b
- Phân vùng logic (động)
vendor_b
- Phân vùng logic (động)
product_b
- Các phân vùng khác do Bar cập nhật
- Phân vùng logic (động)
- 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ị. Ví dụ:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Cập nhật lại
Trên các thiết bị chạy Android 9 trở xuống, ứng dụng OTA trên thiết bị không hỗ trợ liên kết các phân vùng động trước khi cập nhật. Một nhóm bản vá bổ sung được tạo để có thể áp dụng trực tiếp việc ánh xạ vào các phân vùng vật lý hiện có.
Trình tạo OTA sẽ tạo 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 khớp với kích thước của các thiết bị khối thực tương ứng với hệ thống, nhà cung cấp, v.v. Các hình ảnh này được đặt tên là super_system.img
, super_vendor.img
, v.v.
Ứng dụng OTA áp dụng những hình ảnh này cho các phân vùng thực tế, thay vì áp dụng hình ảnh cho các phân vùng logic (động).
Do ứng dụng OTA không biết cách liên kết các phân vùng động, nên tất cả các bước sau khi cài đặt sẽ tự động bị tắt cho những phân vùng này khi gói cập nhật được tạo. Hãy xem phần Định cấu hình sau khi cài đặt để biết thêm thông tin chi tiết.
Quy trình 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ác bản cập nhật trong tương lai sau khi cải tiến
Sau khi được cập nhật, ứng dụng OTA sẽ đượ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ờ mở rộng trên các phân vùng thực tế mục tiêu.
Cập nhật quy trình bằng gói cập nhật thông thường
- Khởi chạy siêu dữ liệu phân vùng
super
.-
Tạo siêu dữ liệu M mới từ Metadata 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ị chặn, thì siêu dữ liệu mới M sẽ sử dụng [system_t
,vendor_t
,product_t
] làm thiết bị chặn. 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 và phân vùng mục tiêu theo trường
dynamic_partition_metadata
trong tệp kê khai bản cập nhật. Bạn có thể tìm thấy kích thước của mỗi phân vùng trongnew_partition_info
. - Ghi 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ị ở chế độ có thể ghi.
-
Tạo siêu dữ liệu M mới từ Metadata 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ị bị chặn.
- Nếu cần, hãy liên kết các phân vùng nguồn trên trình liên kết thiết bị ở chế độ chỉ có thể đọc. Điều này là cần thiết để tải không qua cửa hàng vì các phân vùng nguồn không được liên kết trước khi cập nhật.
- Áp dụng bản cập nhật đầy đủ hoặc delta cho tất cả thiết bị khối tại khe mục tiêu.
- Gắn các phân vùng để chạy tập lệnh sau khi cài đặt, sau đó tháo các phân vùng đó.
- Huỷ liên kết các phân vùng mục tiêu.
Quy trình cập nhật bằng gói cập nhật Retrofit
Nếu gói cập nhật cải tiến được áp dụng trên một thiết bị đã bật các phân vùng động, thì ứng dụng OTA sẽ trực tiếp áp dụng tệp super.img
phân tách trên các thiết bị khối. Quy trình cập nhật tương tự như bản cập nhật cho phiên bản cải tiến. Hãy xem phần Cập nhật lại bản cập nhật để biết thông tin chi tiết.
Ví dụ: giả sử như sau:
- Vị trí A là vị trí đang hoạt động.
-
system_a
chứa siêu dữ liệu đang hoạt động ở vị trí 0. -
system_a
,vendor_a
vàproduct_a
được dùng làm thiết bị khối.
Khi ứng dụng OTA nhận được gói cập nhật cải tiến, ứng dụng này sẽ áp dụng super_system.img
trên system_b
thực, super_vendor.img
trên vendor_b
thực và super_product.img
trên product_b
thực.
Thiết bị khối thực system_b
chứa siêu dữ liệu chính xác để liên kết system_b
logic, vendor_b
và product_b
logic tại thời điểm khởi động.
Tạo gói cập nhật
OTA gia tăng
Khi tạo OTA gia tăng cho các thiết bị cải tiến, bản cập nhật sẽ phụ 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 để sửa đổi. Gói cập nhật chứa tệp
super.img
phân tách và tắt bước sau khi cài đặt. - Nếu bản dựng cơ sở có xác định các biến, thì trường hợp này giống như một bản cập nhật thông thường với cá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ạn có thể bật bước sau khi cài đặt.
OTA đầy đủ
Hai gói OTA đầy đủ được tạo cho các thiết bị cải tiến.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
luôn chứasuper.img
phân tách và vô hiệu hoá bước sau khi cài đặt để cập nhật cải tiến.-
Tập lệnh này được tạo bằng một đối số bổ sung
--retrofit_dynamic_partitions
cho tập lệnhota_from_target_files
. - Bạn có thể áp dụng cho tất cả các bản dựng.
-
Tập lệnh này được tạo bằng một đối số bổ sung
-
$(PRODUCT)-ota-$(TAG).zip
chứa hình ảnh logic cho các bản 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. Hãy xem thông tin chi tiết bên dưới về việc thực thi chính sách này.
Từ chối bản cập nhật không phải retrofit 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 đến các thiết bị chạy Android 9 trở xuống, thì thiết bị sẽ không khởi động được. Ứng dụng OTA trên Android 9 trở xuống không thể phân biệt giữa gói OTA cải tiến và gói OTA đầy đủ thông thường, vì vậy, ứng dụng 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 một bước sau khi 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 một thiết bị không bật phân vùng động, ứng dụng OTA sẽ chạy check_dynamic_partitions
ở bước sau cài đặt và từ chối quá trình cập nhật.