Allow brick OTA package to be sideloaded in recovery

Makes testing easier, brick packaegs can now be tested directly in
recovery w/o having to go through GOTA.

Test: adb sideload brick_ota.zip
Bug: 273561331
Change-Id: I48214dc03e63b69e61fc217bc3f58923bb90a9a6
This commit is contained in:
Kelvin Zhang 2023-03-14 15:02:53 -07:00
parent 00bfe128f9
commit 170ad59954
3 changed files with 24 additions and 3 deletions

View file

@ -24,6 +24,7 @@
// Wipes the current A/B device, with a secure wipe of all the partitions in RECOVERY_WIPE.
bool WipeAbDevice(Device* device, size_t wipe_package_size);
bool WipeAbDevice(Device* device, Package* wipe_package);
// Reads the "recovery.wipe" entry in the zip archive returns a list of partitions to wipe.
std::vector<std::string> GetWipePartitionList(Package* wipe_package);

View file

@ -48,6 +48,7 @@
#include "install/spl_check.h"
#include "install/wipe_data.h"
#include "install/wipe_device.h"
#include "otautil/error_code.h"
#include "otautil/package.h"
#include "otautil/paths.h"
@ -71,6 +72,8 @@ static constexpr float VERIFICATION_PROGRESS_FRACTION = 0.25;
// The charater used to separate dynamic fingerprints. e.x. sargo|aosp-sargo
static const char* FINGERPRING_SEPARATOR = "|";
static constexpr auto&& RELEASE_KEYS_TAG = "release-keys";
// If brick packages are smaller than |MEMORY_PACKAGE_LIMIT|, read the entire package into memory
static constexpr size_t MEMORY_PACKAGE_LIMIT = 1024 * 1024;
static std::condition_variable finish_log_temperature;
static bool isInStringList(const std::string& target_token, const std::string& str_list,
@ -382,7 +385,20 @@ static InstallResult TryUpdateBinary(Package* package, bool* wipe_cache,
return INSTALL_CORRUPT;
}
bool package_is_ab = get_value(metadata, "ota-type") == OtaTypeToString(OtaType::AB);
const bool package_is_ab = get_value(metadata, "ota-type") == OtaTypeToString(OtaType::AB);
const bool package_is_brick = get_value(metadata, "ota-type") == OtaTypeToString(OtaType::BRICK);
if (package_is_brick) {
LOG(INFO) << "Installing a brick package";
if (package->GetType() == PackageType::kFile &&
package->GetPackageSize() < MEMORY_PACKAGE_LIMIT) {
std::vector<uint8_t> content(package->GetPackageSize());
if (package->ReadFullyAtOffset(content.data(), content.size(), 0)) {
auto memory_package = Package::CreateMemoryPackage(std::move(content), {});
return WipeAbDevice(device, memory_package.get()) ? INSTALL_SUCCESS : INSTALL_ERROR;
}
}
return WipeAbDevice(device, package) ? INSTALL_SUCCESS : INSTALL_ERROR;
}
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);

View file

@ -182,13 +182,17 @@ bool WipeAbDevice(Device* device, size_t wipe_package_size) {
LOG(ERROR) << "Failed to open wipe package";
return false;
}
return WipeAbDevice(device, wipe_package.get());
}
if (!CheckWipePackage(wipe_package.get(), ui)) {
bool WipeAbDevice(Device* device, Package* wipe_package) {
auto ui = device->GetUI();
if (!CheckWipePackage(wipe_package, ui)) {
LOG(ERROR) << "Failed to verify wipe package";
return false;
}
auto partition_list = GetWipePartitionList(wipe_package.get());
auto partition_list = GetWipePartitionList(wipe_package);
if (partition_list.empty()) {
LOG(ERROR) << "Empty wipe ab partition list";
return false;