Allow entering rescue mode via recovery UI.
Only enabled on debuggable builds. Bug: 128415917 Test: Sideload package on taimen. Test: Choose "Enter rescue" from recovery UI. Change-Id: I913dbdbcffd3179e6fa72ca862f74ca8f1364b02
This commit is contained in:
parent
3aff98aee8
commit
c6dc325e88
9 changed files with 60 additions and 17 deletions
|
@ -31,6 +31,7 @@
|
|||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
|
@ -42,6 +43,7 @@
|
|||
#include "fuse_sideload.h"
|
||||
#include "install/install.h"
|
||||
#include "minadbd_types.h"
|
||||
#include "otautil/sysutil.h"
|
||||
#include "recovery_ui/ui.h"
|
||||
|
||||
using CommandFunction = std::function<bool()>;
|
||||
|
@ -228,7 +230,7 @@ static void ListenAndExecuteMinadbdCommands(
|
|||
// b11. exit the listening loop
|
||||
//
|
||||
static void CreateMinadbdServiceAndExecuteCommands(
|
||||
const std::map<MinadbdCommands, CommandFunction>& command_map) {
|
||||
const std::map<MinadbdCommands, CommandFunction>& command_map, bool rescue_mode) {
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
android::base::unique_fd recovery_socket;
|
||||
|
@ -245,9 +247,16 @@ static void CreateMinadbdServiceAndExecuteCommands(
|
|||
}
|
||||
if (child == 0) {
|
||||
recovery_socket.reset();
|
||||
execl("/system/bin/minadbd", "minadbd", "--socket_fd",
|
||||
std::to_string(minadbd_socket.release()).c_str(), nullptr);
|
||||
|
||||
std::vector<std::string> minadbd_commands = {
|
||||
"/system/bin/minadbd",
|
||||
"--socket_fd",
|
||||
std::to_string(minadbd_socket.release()),
|
||||
};
|
||||
if (rescue_mode) {
|
||||
minadbd_commands.push_back("--rescue");
|
||||
}
|
||||
auto exec_args = StringVectorToNullTerminatedArray(minadbd_commands);
|
||||
execv(exec_args[0], exec_args.data());
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
@ -280,7 +289,7 @@ static void CreateMinadbdServiceAndExecuteCommands(
|
|||
signal(SIGPIPE, SIG_DFL);
|
||||
}
|
||||
|
||||
int apply_from_adb(RecoveryUI* ui) {
|
||||
int ApplyFromAdb(RecoveryUI* ui, bool rescue_mode) {
|
||||
// Save the usb state to restore after the sideload operation.
|
||||
std::string usb_state = android::base::GetProperty("sys.usb.state", "none");
|
||||
// Clean up state and stop adbd.
|
||||
|
@ -289,16 +298,20 @@ int apply_from_adb(RecoveryUI* ui) {
|
|||
return INSTALL_ERROR;
|
||||
}
|
||||
|
||||
ui->Print(
|
||||
"\n\nNow send the package you want to apply\n"
|
||||
"to the device with \"adb sideload <filename>\"...\n");
|
||||
if (!rescue_mode) {
|
||||
ui->Print(
|
||||
"\n\nNow send the package you want to apply\n"
|
||||
"to the device with \"adb sideload <filename>\"...\n");
|
||||
} else {
|
||||
ui->Print("\n\nWaiting for rescue commands...\n");
|
||||
}
|
||||
|
||||
int install_result = INSTALL_ERROR;
|
||||
std::map<MinadbdCommands, CommandFunction> command_map{
|
||||
{ MinadbdCommands::kInstall, std::bind(&AdbInstallPackageHandler, ui, &install_result) },
|
||||
};
|
||||
|
||||
CreateMinadbdServiceAndExecuteCommands(command_map);
|
||||
CreateMinadbdServiceAndExecuteCommands(command_map, rescue_mode);
|
||||
|
||||
// Clean up before switching to the older state, for example setting the state
|
||||
// to none sets sys/class/android_usb/android0/enable to 0.
|
||||
|
|
|
@ -18,4 +18,4 @@
|
|||
|
||||
#include <recovery_ui/ui.h>
|
||||
|
||||
int apply_from_adb(RecoveryUI* ui);
|
||||
int ApplyFromAdb(RecoveryUI* ui, bool rescue_mode);
|
||||
|
|
|
@ -31,10 +31,13 @@
|
|||
#include "minadbd_services.h"
|
||||
#include "minadbd_types.h"
|
||||
|
||||
using namespace std::string_literals;
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
android::base::InitLogging(argv, &android::base::StderrLogger);
|
||||
// TODO(xunchang) implement a command parser
|
||||
if (argc != 3 || strcmp("--socket_fd", argv[1]) != 0) {
|
||||
if ((argc != 3 && argc != 4) || argv[1] != "--socket_fd"s ||
|
||||
(argc == 4 && argv[3] != "--rescue"s)) {
|
||||
LOG(ERROR) << "minadbd has invalid arguments, argc: " << argc;
|
||||
exit(kMinadbdArgumentsParsingError);
|
||||
}
|
||||
|
@ -50,7 +53,12 @@ int main(int argc, char** argv) {
|
|||
}
|
||||
SetMinadbdSocketFd(socket_fd);
|
||||
|
||||
adb_device_banner = "sideload";
|
||||
if (argc == 4) {
|
||||
SetMinadbdRescueMode(true);
|
||||
adb_device_banner = "rescue";
|
||||
} else {
|
||||
adb_device_banner = "sideload";
|
||||
}
|
||||
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
|
|
|
@ -45,10 +45,16 @@
|
|||
#include "sysdeps.h"
|
||||
|
||||
static int minadbd_socket = -1;
|
||||
static bool rescue_mode = false;
|
||||
|
||||
void SetMinadbdSocketFd(int socket_fd) {
|
||||
minadbd_socket = socket_fd;
|
||||
}
|
||||
|
||||
void SetMinadbdRescueMode(bool rescue) {
|
||||
rescue_mode = rescue;
|
||||
}
|
||||
|
||||
static bool WriteCommandToFd(MinadbdCommands cmd, int fd) {
|
||||
char message[kMinadbdMessageSize];
|
||||
memcpy(message, kMinadbdCommandPrefix, strlen(kMinadbdStatusPrefix));
|
||||
|
|
|
@ -17,3 +17,5 @@
|
|||
#pragma once
|
||||
|
||||
void SetMinadbdSocketFd(int socket_fd);
|
||||
|
||||
void SetMinadbdRescueMode(bool);
|
||||
|
|
18
recovery.cpp
18
recovery.cpp
|
@ -538,12 +538,20 @@ static Device::BuiltinAction prompt_and_wait(Device* device, int status) {
|
|||
break;
|
||||
}
|
||||
case Device::APPLY_ADB_SIDELOAD:
|
||||
case Device::APPLY_SDCARD: {
|
||||
case Device::APPLY_SDCARD:
|
||||
case Device::ENTER_RESCUE: {
|
||||
save_current_log = true;
|
||||
bool adb = (chosen_action == Device::APPLY_ADB_SIDELOAD);
|
||||
if (adb) {
|
||||
status = apply_from_adb(ui);
|
||||
|
||||
bool adb = true;
|
||||
if (chosen_action == Device::ENTER_RESCUE) {
|
||||
// Switch to graphics screen.
|
||||
ui->ShowText(false);
|
||||
status = ApplyFromAdb(ui, true /* rescue_mode */);
|
||||
ui->ShowText(true);
|
||||
} else if (chosen_action == Device::APPLY_ADB_SIDELOAD) {
|
||||
status = ApplyFromAdb(ui, false /* rescue_mode */);
|
||||
} else {
|
||||
adb = false;
|
||||
status = ApplyFromSdcard(device, ui);
|
||||
}
|
||||
|
||||
|
@ -926,7 +934,7 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
|
|||
if (!sideload_auto_reboot) {
|
||||
ui->ShowText(true);
|
||||
}
|
||||
status = apply_from_adb(ui);
|
||||
status = ApplyFromAdb(ui, false /* rescue_mode */);
|
||||
ui->Print("\nInstall from ADB complete (status: %d).\n", status);
|
||||
if (sideload_auto_reboot) {
|
||||
ui->Print("Rebooting automatically.\n");
|
||||
|
|
|
@ -423,6 +423,10 @@ int main(int argc, char** argv) {
|
|||
device->RemoveMenuItemForAction(Device::ENTER_FASTBOOT);
|
||||
}
|
||||
|
||||
if (!is_ro_debuggable()) {
|
||||
device->RemoveMenuItemForAction(Device::ENTER_RESCUE);
|
||||
}
|
||||
|
||||
ui->SetBackground(RecoveryUI::NONE);
|
||||
if (show_text) ui->ShowText(true);
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ static std::vector<std::pair<std::string, Device::BuiltinAction>> g_menu_actions
|
|||
{ "View recovery logs", Device::VIEW_RECOVERY_LOGS },
|
||||
{ "Run graphics test", Device::RUN_GRAPHICS_TEST },
|
||||
{ "Run locale test", Device::RUN_LOCALE_TEST },
|
||||
{ "Enter rescue", Device::ENTER_RESCUE },
|
||||
{ "Power off", Device::SHUTDOWN },
|
||||
};
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@ class Device {
|
|||
KEY_INTERRUPTED = 13,
|
||||
ENTER_FASTBOOT = 14,
|
||||
ENTER_RECOVERY = 15,
|
||||
ENTER_RESCUE = 16,
|
||||
};
|
||||
|
||||
explicit Device(RecoveryUI* ui);
|
||||
|
|
Loading…
Reference in a new issue