Add a flag to manually override VABC

Test: generate an OTA with --disable_vabc
Change-Id: I4a42319584dc1388d097dba343fe3ace82479bec
diff --git a/payload_generator/generate_delta_main.cc b/payload_generator/generate_delta_main.cc
index a187b32..5e2e555 100644
--- a/payload_generator/generate_delta_main.cc
+++ b/payload_generator/generate_delta_main.cc
@@ -421,6 +421,10 @@
               false,
               "The payload only targets a subset of partitions on the device,"
               "e.g. generic kernel image update.");
+  DEFINE_bool(
+      disable_vabc,
+      false,
+      "Whether to disable Virtual AB Compression when installing the OTA");
 
   brillo::FlagHelper::Init(
       argc,
@@ -584,6 +588,7 @@
   if (FLAGS_is_partial_update) {
     payload_config.is_partial_update = true;
   }
+  payload_config.disable_vabc = FLAGS_disable_vabc;
 
   if (!FLAGS_in_file.empty()) {
     return ApplyPayload(FLAGS_in_file, payload_config) ? 0 : 1;
diff --git a/payload_generator/payload_file.cc b/payload_generator/payload_file.cc
index 33c0749..1174597 100644
--- a/payload_generator/payload_file.cc
+++ b/payload_generator/payload_file.cc
@@ -71,6 +71,9 @@
     *(manifest_.mutable_dynamic_partition_metadata()) =
         *(config.target.dynamic_partition_metadata);
 
+  if (config.disable_vabc) {
+    manifest_.mutable_dynamic_partition_metadata()->set_vabc_enabled(false);
+  }
   if (config.is_partial_update) {
     manifest_.set_partial_update(true);
   }
diff --git a/payload_generator/payload_generation_config.h b/payload_generator/payload_generation_config.h
index 1d88101..64733e1 100644
--- a/payload_generator/payload_generation_config.h
+++ b/payload_generator/payload_generation_config.h
@@ -230,6 +230,11 @@
 
   // The maximum timestamp of the OS allowed to apply this payload.
   int64_t max_timestamp = 0;
+
+  // Permit use of VABC by default. Even if this is set to true, the device must
+  // support VABC in order to use it. If this is set to false, device must not
+  // use VABC regardless.
+  bool disable_vabc = false;
 };
 
 }  // namespace chromeos_update_engine
diff --git a/scripts/brillo_update_payload b/scripts/brillo_update_payload
index 1e729bd..439a42a 100755
--- a/scripts/brillo_update_payload
+++ b/scripts/brillo_update_payload
@@ -200,6 +200,8 @@
     "Optional: True if the payload is for partial update. i.e. it only updates \
 a subset of partitions on device."
   DEFINE_string full_boot "" "Will include full boot image"
+  DEFINE_string disable_vabc "" \
+    "Optional: Disables Virtual AB Compression when installing the OTA"
 fi
 if [[ "${COMMAND}" == "hash" || "${COMMAND}" == "sign" ]]; then
   DEFINE_string unsigned_payload "" "Path to the input unsigned payload."
@@ -694,6 +696,10 @@
       GENERATOR_ARGS+=(
         --disable_verity_computation="${FLAGS_disable_verity_computation}" )
     fi
+    if [[ -n "${FLAGS_disable_vabc}" ]]; then
+      GENERATOR_ARGS+=(
+        --disable_vabc="${FLAGS_disable_vabc}" )
+    fi
   fi
 
   # minor version is set only for delta or partial payload.