diff options
author | Yifan Hong <elsk@google.com> | 2020-05-20 02:55:00 +0200 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-05-20 02:55:00 +0200 |
commit | d5c56cee2971d14c026e596e5cf185c5c2b4851f (patch) | |
tree | 5eacf16ef2e37e980e94e101bae0de958139edb3 | |
parent | Merge "recovery: fastbootd: retry opening graphics" am: 082bea6325 (diff) | |
parent | Detect non-A/B vs. A/B packages correctly. (diff) | |
download | android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.tar android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.tar.gz android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.tar.bz2 android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.tar.lz android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.tar.xz android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.tar.zst android_bootable_recovery-d5c56cee2971d14c026e596e5cf185c5c2b4851f.zip |
-rw-r--r-- | install/install.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/install/install.cpp b/install/install.cpp index 1c9bf2fd2..d404997dc 100644 --- a/install/install.cpp +++ b/install/install.cpp @@ -331,15 +331,25 @@ static InstallResult TryUpdateBinary(Package* package, bool* wipe_cache, return INSTALL_CORRUPT; } - bool is_ab = android::base::GetBoolProperty("ro.build.ab_update", false); - if (is_ab) { + bool package_is_ab = get_value(metadata, "ota-type") == OtaTypeToString(OtaType::AB); + bool device_supports_ab = android::base::GetBoolProperty("ro.build.ab_update", false); + bool ab_device_supports_nonab = + android::base::GetBoolProperty("ro.virtual_ab.allow_non_ab", false); + bool device_only_supports_ab = device_supports_ab && !ab_device_supports_nonab; + + if (package_is_ab) { CHECK(package->GetType() == PackageType::kFile); } - // Verify against the metadata in the package first. - if (is_ab && !CheckPackageMetadata(metadata, OtaType::AB)) { - log_buffer->push_back(android::base::StringPrintf("error: %d", kUpdateBinaryCommandFailure)); - return INSTALL_ERROR; + // Verify against the metadata in the package first. Expects A/B metadata if: + // Package declares itself as an A/B package + // Package does not declare itself as an A/B package, but device only supports A/B; + // still calls CheckPackageMetadata to get a meaningful error message. + if (package_is_ab || device_only_supports_ab) { + if (!CheckPackageMetadata(metadata, OtaType::AB)) { + log_buffer->push_back(android::base::StringPrintf("error: %d", kUpdateBinaryCommandFailure)); + return INSTALL_ERROR; + } } ReadSourceTargetBuild(metadata, log_buffer); @@ -389,8 +399,9 @@ static InstallResult TryUpdateBinary(Package* package, bool* wipe_cache, std::vector<std::string> args; if (auto setup_result = - is_ab ? SetUpAbUpdateCommands(package_path, zip, pipe_write.get(), &args) - : SetUpNonAbUpdateCommands(package_path, zip, retry_count, pipe_write.get(), &args); + package_is_ab + ? SetUpAbUpdateCommands(package_path, zip, pipe_write.get(), &args) + : SetUpNonAbUpdateCommands(package_path, zip, retry_count, pipe_write.get(), &args); !setup_result) { log_buffer->push_back(android::base::StringPrintf("error: %d", kUpdateBinaryCommandFailure)); return INSTALL_CORRUPT; |