fastbootd: Add command to remove GSI installs

Note: this only removes the bootable marker, since we're unable to
remove the userdata files within recovery.

Bug: 121210348
Test: fastboot gsi wipe
      fastboot gsi disable
Change-Id: I64fe848c787d426ae9d18a1557a9d6b340bfc2cf
This commit is contained in:
David Anderson 2019-01-15 14:38:20 -08:00
parent 0e330f12bc
commit 1d504e3342
6 changed files with 35 additions and 0 deletions

View File

@ -132,6 +132,7 @@ cc_binary {
"libext2_uuid",
"libext4_utils",
"libfs_mgr",
"libgsi",
"libhidlbase",
"libhidltransport",
"libhwbinder",

View File

@ -33,6 +33,7 @@
#define FB_CMD_RESIZE_PARTITION "resize-logical-partition"
#define FB_CMD_UPDATE_SUPER "update-super"
#define FB_CMD_OEM "oem"
#define FB_CMD_GSI "gsi"
#define RESPONSE_OKAY "OKAY"
#define RESPONSE_FAIL "FAIL"

View File

@ -28,6 +28,7 @@
#include <cutils/android_reboot.h>
#include <ext4_utils/wipe.h>
#include <fs_mgr.h>
#include <libgsi/libgsi.h>
#include <liblp/builder.h>
#include <liblp/liblp.h>
#include <uuid/uuid.h>
@ -460,3 +461,22 @@ bool UpdateSuperHandler(FastbootDevice* device, const std::vector<std::string>&
bool wipe = (args.size() >= 3 && args[2] == "wipe");
return UpdateSuper(device, args[1], wipe);
}
bool GsiHandler(FastbootDevice* device, const std::vector<std::string>& args) {
if (!android::gsi::IsGsiInstalled()) {
return device->WriteStatus(FastbootResult::FAIL, "No GSI is installed");
}
if (args.size() != 2) {
return device->WriteFail("Invalid arguments");
}
if (args[1] == "wipe") {
if (!android::gsi::UninstallGsi()) {
return device->WriteStatus(FastbootResult::FAIL, strerror(errno));
}
} else if (args[1] == "disable") {
if (!android::gsi::DisableGsi()) {
return device->WriteStatus(FastbootResult::FAIL, strerror(errno));
}
}
return device->WriteStatus(FastbootResult::OKAY, "Success");
}

View File

@ -48,3 +48,4 @@ bool DeletePartitionHandler(FastbootDevice* device, const std::vector<std::strin
bool ResizePartitionHandler(FastbootDevice* device, const std::vector<std::string>& args);
bool UpdateSuperHandler(FastbootDevice* device, const std::vector<std::string>& args);
bool OemCmdHandler(FastbootDevice* device, const std::vector<std::string>& args);
bool GsiHandler(FastbootDevice* device, const std::vector<std::string>& args);

View File

@ -53,6 +53,7 @@ FastbootDevice::FastbootDevice()
{FB_CMD_RESIZE_PARTITION, ResizePartitionHandler},
{FB_CMD_UPDATE_SUPER, UpdateSuperHandler},
{FB_CMD_OEM, OemCmdHandler},
{FB_CMD_GSI, GsiHandler},
}),
transport_(std::make_unique<ClientUsbTransport>()),
boot_control_hal_(IBootControl::getService()),

View File

@ -387,6 +387,7 @@ static int show_help() {
" Format a flash partition.\n"
" set_active SLOT Set the active slot.\n"
" oem [COMMAND...] Execute OEM-specific command.\n"
" gsi wipe|disable Wipe or disable a GSI installation (fastbootd only).\n"
"\n"
"boot image:\n"
" boot KERNEL [RAMDISK [SECOND]]\n"
@ -1926,6 +1927,16 @@ int FastBootTool::Main(int argc, char* argv[]) {
std::string partition = next_arg(&args);
std::string size = next_arg(&args);
fb->ResizePartition(partition, size);
} else if (command == "gsi") {
if (args.empty()) {
syntax_error("missing 'wipe' or 'disable' argument");
} else if (args.size() == 1 && args[0] == "wipe") {
fb->RawCommand("gsi:wipe", "wiping GSI");
} else if (args.size() == 1 && args[0] == "disable") {
fb->RawCommand("gsi:disable", "disabling GSI");
} else {
syntax_error("expected 'wipe' or 'disable'");
}
} else {
syntax_error("unknown command %s", command.c_str());
}