Support host simulation of partial update
There were two problems for partial update's host verification:
1. We cannot generate copy commands for partitions not included
in the payload on host side.
2. Partial update should always be delta updates, while the
logic was missing on host side.
Address both issues in this cl.
Bug: 171519321
Test: delta_generator --is_partial_update true --in_file=payload.bin \
--partition_names=product:system:system_ext:vbmeta_system \
--new_partitions=/tmp/1:/tmp/2:/tmp/3:/tmp/4 --major_version=2
Change-Id: I87c1b162d1688c04be0dd81566966eced3690ca1
diff --git a/payload_consumer/partition_update_generator_android.cc b/payload_consumer/partition_update_generator_android.cc
index 25771e1..4467182 100644
--- a/payload_consumer/partition_update_generator_android.cc
+++ b/payload_consumer/partition_update_generator_android.cc
@@ -41,6 +41,11 @@
BootControlInterface::Slot target_slot,
const std::set<std::string>& partitions_in_payload,
std::vector<PartitionUpdate>* update_list) {
+#ifndef __ANDROID__
+ // Skip copying partitions for host verification.
+ return true;
+#endif
+
auto ab_partitions = GetAbPartitionsOnDevice();
if (ab_partitions.empty()) {
LOG(ERROR) << "Failed to load static a/b partitions";
diff --git a/payload_generator/generate_delta_main.cc b/payload_generator/generate_delta_main.cc
index 2e32f1b..8cda9d1 100644
--- a/payload_generator/generate_delta_main.cc
+++ b/payload_generator/generate_delta_main.cc
@@ -183,8 +183,11 @@
install_plan.source_slot =
config.is_delta ? 0 : BootControlInterface::kInvalidSlot;
install_plan.target_slot = 1;
- payload.type =
- config.is_delta ? InstallPayloadType::kDelta : InstallPayloadType::kFull;
+ // For partial updates, we always write kDelta to the payload. Make it
+ // consistent for host simulation.
+ payload.type = config.is_delta || config.is_partial_update
+ ? InstallPayloadType::kDelta
+ : InstallPayloadType::kFull;
payload.size = utils::FileSize(payload_file);
// TODO(senj): This hash is only correct for unsigned payload, need to support
// signed payload using PayloadSigner.
@@ -576,6 +579,10 @@
}
}
+ if (FLAGS_is_partial_update) {
+ payload_config.is_partial_update = true;
+ }
+
if (!FLAGS_in_file.empty()) {
return ApplyPayload(FLAGS_in_file, payload_config) ? 0 : 1;
}
@@ -604,10 +611,6 @@
CHECK(payload_config.target.ValidateDynamicPartitionMetadata());
}
- if (FLAGS_is_partial_update) {
- payload_config.is_partial_update = true;
- }
-
CHECK(!FLAGS_out_file.empty());
payload_config.rootfs_partition_size = FLAGS_rootfs_partition_size;