diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 080ad4261..63f784359 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -1413,12 +1413,19 @@ void do_for_partitions(const std::string& part, const std::string& slot, } } -bool is_retrofit_device(fastboot::IFastBootDriver* fb) { - std::string value; - if (fb->GetVar("super-partition-name", &value) != fastboot::SUCCESS) { +bool is_retrofit_device(const ImageSource* source) { + // Does this device use dynamic partitions at all? + std::vector contents; + if (!source->ReadFile("super_empty.img", &contents)) { return false; } - return android::base::StartsWith(value, "system_"); + auto metadata = android::fs_mgr::ReadFromImageBlob(contents.data(), contents.size()); + for (const auto& partition : metadata->partitions) { + if (partition.attributes & LP_PARTITION_ATTR_SLOT_SUFFIXED) { + return true; + } + } + return false; } // Fetch a partition from the device to a given fd. This is a wrapper over FetchToFd to fetch @@ -1876,7 +1883,7 @@ std::vector> FlashAllTool::CollectTasksFromImageList() { // On these devices, secondary slots must be flashed as physical // partitions (otherwise they would not mount on first boot). To enforce // this, we delete any logical partitions for the "other" slot. - if (is_retrofit_device(fp_->fb)) { + if (is_retrofit_device(fp_->source)) { std::string partition_name = image->part_name + "_" + slot; if (image->IsSecondary() && should_flash_in_userspace(partition_name)) { tasks.emplace_back(std::make_unique(fp_, partition_name)); diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index 35deea7d2..eead82c92 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -187,7 +187,7 @@ int64_t get_sparse_limit(int64_t size, const FlashingPlan* fp); std::vector resparse_file(sparse_file* s, int64_t max_size); bool supports_AB(fastboot::IFastBootDriver* fb); -bool is_retrofit_device(fastboot::IFastBootDriver* fb); +bool is_retrofit_device(const ImageSource* source); bool is_logical(const std::string& partition); void fb_perform_format(const std::string& partition, int skip_if_not_supported, const std::string& type_override, const std::string& size_override,