From 403657d9985d2ac06271caa078b5ceb1ae38cd4a Mon Sep 17 00:00:00 2001 From: Daniel Zheng Date: Fri, 10 Mar 2023 07:37:25 +0000 Subject: [PATCH] Changing FlashTask to take in apply_vbmeta Test: tested on Raven Change-Id: I709842d87aa4ad6a7772e4f441886d127c3028a7 --- fastboot/fastboot.cpp | 27 +++++++++++++++++---------- fastboot/fastboot.h | 2 +- fastboot/task.cpp | 11 ++++++----- fastboot/task.h | 6 ++++-- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 15d187437..a9a822c04 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -1159,6 +1159,12 @@ static bool has_vbmeta_partition() { fb->GetVar("partition-type:vbmeta_b", &partition_type) == fastboot::SUCCESS; } +static bool is_vbmeta_partition(const std::string& partition) { + return android::base::EndsWith(partition, "vbmeta") || + android::base::EndsWith(partition, "vbmeta_a") || + android::base::EndsWith(partition, "vbmeta_b"); +} + // Note: this only works in userspace fastboot. In the bootloader, use // should_flash_in_userspace(). bool is_logical(const std::string& partition) { @@ -1251,7 +1257,8 @@ void flash_partition_files(const std::string& partition, const std::vectorResizePartition(pname, std::to_string(buf.image_size)); } std::string flash_pname = repack_ramdisk(pname, &buf); - flash_buf(flash_pname, &buf); + flash_buf(flash_pname, &buf, apply_vbmeta); } // Sets slot_override as the active slot. If slot_override is blank, @@ -1729,7 +1734,8 @@ void FlashAllTool::FlashImage(const Image& image, const std::string& slot, fastb if (is_logical(partition_name)) { fb->ResizePartition(partition_name, std::to_string(buf->image_size)); } - flash_buf(partition_name.c_str(), buf); + + flash_buf(partition_name.c_str(), buf, is_vbmeta_partition(partition_name)); }; do_for_partitions(image.part_name, slot, flash, false); } @@ -1904,7 +1910,7 @@ void fb_perform_format(const std::string& partition, int skip_if_not_supported, if (!load_buf_fd(std::move(fd), &buf)) { die("Cannot read image: %s", strerror(errno)); } - flash_buf(partition, &buf); + flash_buf(partition, &buf, is_vbmeta_partition(partition)); return; failed: @@ -1974,7 +1980,7 @@ static bool wipe_super(const android::fs_mgr::LpMetadata& metadata, const std::s auto image_path = temp_dir.path + "/"s + image_name; auto flash = [&](const std::string& partition_name) { - do_flash(partition_name.c_str(), image_path.c_str()); + do_flash(partition_name.c_str(), image_path.c_str(), false); }; do_for_partitions(partition, slot, flash, force_slot); @@ -2295,7 +2301,8 @@ int FastBootTool::Main(int argc, char* argv[]) { fname = find_item(pname); } if (fname.empty()) die("cannot determine image filename for '%s'", pname.c_str()); - FlashTask task(slot_override, pname, fname); + + FlashTask task(slot_override, pname, fname, is_vbmeta_partition(pname)); task.Run(); } else if (command == "flash:raw") { std::string partition = next_arg(&args); diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index ed33481d5..c9544875b 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -88,7 +88,7 @@ struct FlashingPlan { bool should_flash_in_userspace(const std::string& partition_name); bool is_userspace_fastboot(); -void do_flash(const char* pname, const char* fname); +void do_flash(const char* pname, const char* fname, const bool apply_vbmeta); void do_for_partitions(const std::string& part, const std::string& slot, const std::function& func, bool force_slot); std::string find_item(const std::string& item); diff --git a/fastboot/task.cpp b/fastboot/task.cpp index c70139b9a..44008e582 100644 --- a/fastboot/task.cpp +++ b/fastboot/task.cpp @@ -21,12 +21,13 @@ using namespace std::string_literals; -FlashTask::FlashTask(const std::string& slot, const std::string& pname) - : pname_(pname), fname_(find_item(pname)), slot_(slot) { +FlashTask::FlashTask(const std::string& slot, const std::string& pname, const bool apply_vbmeta) + : pname_(pname), fname_(find_item(pname)), slot_(slot), apply_vbmeta_(apply_vbmeta) { if (fname_.empty()) die("cannot determine image filename for '%s'", pname_.c_str()); } -FlashTask::FlashTask(const std::string& _slot, const std::string& _pname, const std::string& _fname) - : pname_(_pname), fname_(_fname), slot_(_slot) {} +FlashTask::FlashTask(const std::string& _slot, const std::string& _pname, const std::string& _fname, + const bool apply_vbmeta) + : pname_(_pname), fname_(_fname), slot_(_slot), apply_vbmeta_(apply_vbmeta) {} void FlashTask::Run() { auto flash = [&](const std::string& partition) { @@ -39,7 +40,7 @@ void FlashTask::Run() { "And try again. If you are intentionally trying to " "overwrite a fixed partition, use --force."); } - do_flash(partition.c_str(), fname_.c_str()); + do_flash(partition.c_str(), fname_.c_str(), apply_vbmeta_); }; do_for_partitions(pname_, slot_, flash, true); } diff --git a/fastboot/task.h b/fastboot/task.h index 149c34cc5..264e43f5f 100644 --- a/fastboot/task.h +++ b/fastboot/task.h @@ -32,8 +32,9 @@ class Task { class FlashTask : public Task { public: - FlashTask(const std::string& slot, const std::string& pname); - FlashTask(const std::string& slot, const std::string& pname, const std::string& fname); + FlashTask(const std::string& slot, const std::string& pname, const bool apply_vbmeta); + FlashTask(const std::string& slot, const std::string& pname, const std::string& fname, + const bool apply_vbmeta); void Run() override; @@ -41,6 +42,7 @@ class FlashTask : public Task { const std::string pname_; const std::string fname_; const std::string slot_; + const bool apply_vbmeta_; }; class RebootTask : public Task {