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:
parent
00bfe128f9
commit
170ad59954
3 changed files with 24 additions and 3 deletions
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
// Wipes the current A/B device, with a secure wipe of all the partitions in RECOVERY_WIPE.
|
// 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, 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.
|
// Reads the "recovery.wipe" entry in the zip archive returns a list of partitions to wipe.
|
||||||
std::vector<std::string> GetWipePartitionList(Package* wipe_package);
|
std::vector<std::string> GetWipePartitionList(Package* wipe_package);
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
|
|
||||||
#include "install/spl_check.h"
|
#include "install/spl_check.h"
|
||||||
#include "install/wipe_data.h"
|
#include "install/wipe_data.h"
|
||||||
|
#include "install/wipe_device.h"
|
||||||
#include "otautil/error_code.h"
|
#include "otautil/error_code.h"
|
||||||
#include "otautil/package.h"
|
#include "otautil/package.h"
|
||||||
#include "otautil/paths.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
|
// The charater used to separate dynamic fingerprints. e.x. sargo|aosp-sargo
|
||||||
static const char* FINGERPRING_SEPARATOR = "|";
|
static const char* FINGERPRING_SEPARATOR = "|";
|
||||||
static constexpr auto&& RELEASE_KEYS_TAG = "release-keys";
|
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 std::condition_variable finish_log_temperature;
|
||||||
static bool isInStringList(const std::string& target_token, const std::string& str_list,
|
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;
|
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 device_supports_ab = android::base::GetBoolProperty("ro.build.ab_update", false);
|
||||||
bool ab_device_supports_nonab =
|
bool ab_device_supports_nonab =
|
||||||
android::base::GetBoolProperty("ro.virtual_ab.allow_non_ab", false);
|
android::base::GetBoolProperty("ro.virtual_ab.allow_non_ab", false);
|
||||||
|
|
|
@ -182,13 +182,17 @@ bool WipeAbDevice(Device* device, size_t wipe_package_size) {
|
||||||
LOG(ERROR) << "Failed to open wipe package";
|
LOG(ERROR) << "Failed to open wipe package";
|
||||||
return false;
|
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";
|
LOG(ERROR) << "Failed to verify wipe package";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto partition_list = GetWipePartitionList(wipe_package.get());
|
auto partition_list = GetWipePartitionList(wipe_package);
|
||||||
if (partition_list.empty()) {
|
if (partition_list.empty()) {
|
||||||
LOG(ERROR) << "Empty wipe ab partition list";
|
LOG(ERROR) << "Empty wipe ab partition list";
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue