recovery: Add runtime checks for A/B vs traditional updates
This allows A/B devices to install legacy (non-payload) style update.zip
packages like our addonsu or gapps.
Do not abort an update if META-INF/com/android/metadata is missing,
instead use it to determine whether the update is an A/B ota or not.
Change-Id: I907a92732470b947de007dde11fb71db64d94c9b
diff --git a/install/install.cpp b/install/install.cpp
index 83f3cad..6e1bc1e 100644
--- a/install/install.cpp
+++ b/install/install.cpp
@@ -80,7 +80,6 @@
static constexpr const char* METADATA_PATH = "META-INF/com/android/metadata";
ZipEntry64 entry;
if (FindEntry(zip, METADATA_PATH, &entry) != 0) {
- LOG(ERROR) << "Failed to find " << METADATA_PATH;
return false;
}
@@ -359,15 +358,11 @@
auto ui = device->GetUI();
std::map<std::string, std::string> metadata;
auto zip = package->GetZipArchiveHandle();
- if (!ReadMetadataFromPackage(zip, &metadata)) {
- LOG(ERROR) << "Failed to parse metadata in the zip file";
- return INSTALL_CORRUPT;
- }
+ bool has_metadata = ReadMetadataFromPackage(zip, &metadata);
- bool package_is_ab = get_value(metadata, "ota-type") == OtaTypeToString(OtaType::AB);
+ bool package_is_ab = has_metadata && 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 ab_device_supports_nonab = true;
bool device_only_supports_ab = device_supports_ab && !ab_device_supports_nonab;
const auto current_spl = android::base::GetProperty("ro.build.version.security_patch", "");