Remove common.h
Additionally kill the global variable: reason, stage; move them to a separate BootState class instead. Vendor specific recovery code will need to call getters from Device() class to access these variables. Bug: 137705917 Test: unit tests pass, boot sailfish into recovery, code search and no code includes common.h in vendor specific recovery. Change-Id: Ia50a5ea951212c25548562f29cc9cf78505b5e34
This commit is contained in:
parent
7b87949ae1
commit
b63a2215b5
5 changed files with 64 additions and 20 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2007 The Android Open Source Project
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -17,9 +17,20 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
// The current stage, e.g. "1/2".
|
class BootState {
|
||||||
extern std::string stage;
|
public:
|
||||||
|
BootState(std::string_view reason, std::string_view stage) : reason_(reason), stage_(stage) {}
|
||||||
|
|
||||||
// The reason argument provided in "--reason=".
|
std::string reason() const {
|
||||||
extern const char* reason;
|
return reason_;
|
||||||
|
}
|
||||||
|
std::string stage() const {
|
||||||
|
return stage_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string reason_; // The reason argument provided in "--reason=".
|
||||||
|
std::string stage_; // The current stage, e.g. "1/2".
|
||||||
|
};
|
21
recovery.cpp
21
recovery.cpp
|
@ -46,7 +46,6 @@
|
||||||
#include <ziparchive/zip_archive.h>
|
#include <ziparchive/zip_archive.h>
|
||||||
|
|
||||||
#include "bootloader_message/bootloader_message.h"
|
#include "bootloader_message/bootloader_message.h"
|
||||||
#include "common.h"
|
|
||||||
#include "fsck_unshare_blocks.h"
|
#include "fsck_unshare_blocks.h"
|
||||||
#include "install/adb_install.h"
|
#include "install/adb_install.h"
|
||||||
#include "install/fuse_install.h"
|
#include "install/fuse_install.h"
|
||||||
|
@ -54,6 +53,7 @@
|
||||||
#include "install/package.h"
|
#include "install/package.h"
|
||||||
#include "install/wipe_data.h"
|
#include "install/wipe_data.h"
|
||||||
#include "install/wipe_device.h"
|
#include "install/wipe_device.h"
|
||||||
|
#include "otautil/boot_state.h"
|
||||||
#include "otautil/error_code.h"
|
#include "otautil/error_code.h"
|
||||||
#include "otautil/logging.h"
|
#include "otautil/logging.h"
|
||||||
#include "otautil/paths.h"
|
#include "otautil/paths.h"
|
||||||
|
@ -70,8 +70,6 @@ static constexpr const char* LOCALE_FILE = "/cache/recovery/last_locale";
|
||||||
static constexpr const char* CACHE_ROOT = "/cache";
|
static constexpr const char* CACHE_ROOT = "/cache";
|
||||||
|
|
||||||
static bool save_current_log = false;
|
static bool save_current_log = false;
|
||||||
std::string stage;
|
|
||||||
const char* reason = nullptr;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The recovery tool communicates with the main system through /cache files.
|
* The recovery tool communicates with the main system through /cache files.
|
||||||
|
@ -208,7 +206,8 @@ static InstallResult prompt_and_wipe_data(Device* device) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ask_to_wipe_data(device)) {
|
if (ask_to_wipe_data(device)) {
|
||||||
bool convert_fbe = reason && strcmp(reason, "convert_fbe") == 0;
|
CHECK(device->GetReason().has_value());
|
||||||
|
bool convert_fbe = device->GetReason().value() == "convert_fbe";
|
||||||
if (WipeData(device, convert_fbe)) {
|
if (WipeData(device, convert_fbe)) {
|
||||||
return INSTALL_SUCCESS;
|
return INSTALL_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
|
@ -635,12 +634,10 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
|
||||||
fsck_unshare_blocks = true;
|
fsck_unshare_blocks = true;
|
||||||
} else if (option == "install_with_fuse") {
|
} else if (option == "install_with_fuse") {
|
||||||
install_with_fuse = true;
|
install_with_fuse = true;
|
||||||
} else if (option == "locale" || option == "fastboot") {
|
} else if (option == "locale" || option == "fastboot" || option == "reason") {
|
||||||
// Handled in recovery_main.cpp
|
// Handled in recovery_main.cpp
|
||||||
} else if (option == "prompt_and_wipe_data") {
|
} else if (option == "prompt_and_wipe_data") {
|
||||||
should_prompt_and_wipe_data = true;
|
should_prompt_and_wipe_data = true;
|
||||||
} else if (option == "reason") {
|
|
||||||
reason = optarg;
|
|
||||||
} else if (option == "rescue") {
|
} else if (option == "rescue") {
|
||||||
rescue = true;
|
rescue = true;
|
||||||
} else if (option == "retry_count") {
|
} else if (option == "retry_count") {
|
||||||
|
@ -674,8 +671,8 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
|
||||||
}
|
}
|
||||||
optind = 1;
|
optind = 1;
|
||||||
|
|
||||||
printf("stage is [%s]\n", stage.c_str());
|
printf("stage is [%s]\n", device->GetStage().value_or("").c_str());
|
||||||
printf("reason is [%s]\n", reason);
|
printf("reason is [%s]\n", device->GetReason().value_or("").c_str());
|
||||||
|
|
||||||
auto ui = device->GetUI();
|
auto ui = device->GetUI();
|
||||||
|
|
||||||
|
@ -684,7 +681,8 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
|
||||||
ui->SetSystemUpdateText(security_update);
|
ui->SetSystemUpdateText(security_update);
|
||||||
|
|
||||||
int st_cur, st_max;
|
int st_cur, st_max;
|
||||||
if (!stage.empty() && sscanf(stage.c_str(), "%d/%d", &st_cur, &st_max) == 2) {
|
if (!device->GetStage().has_value() &&
|
||||||
|
sscanf(device->GetStage().value().c_str(), "%d/%d", &st_cur, &st_max) == 2) {
|
||||||
ui->SetStage(st_cur, st_max);
|
ui->SetStage(st_cur, st_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -790,7 +788,8 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri
|
||||||
}
|
}
|
||||||
} else if (should_wipe_data) {
|
} else if (should_wipe_data) {
|
||||||
save_current_log = true;
|
save_current_log = true;
|
||||||
bool convert_fbe = reason && strcmp(reason, "convert_fbe") == 0;
|
CHECK(device->GetReason().has_value());
|
||||||
|
bool convert_fbe = device->GetReason().value() == "convert_fbe";
|
||||||
if (!WipeData(device, convert_fbe)) {
|
if (!WipeData(device, convert_fbe)) {
|
||||||
status = INSTALL_ERROR;
|
status = INSTALL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,9 +48,9 @@
|
||||||
#include <selinux/label.h>
|
#include <selinux/label.h>
|
||||||
#include <selinux/selinux.h>
|
#include <selinux/selinux.h>
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
#include "fastboot/fastboot.h"
|
#include "fastboot/fastboot.h"
|
||||||
#include "install/wipe_data.h"
|
#include "install/wipe_data.h"
|
||||||
|
#include "otautil/boot_state.h"
|
||||||
#include "otautil/logging.h"
|
#include "otautil/logging.h"
|
||||||
#include "otautil/paths.h"
|
#include "otautil/paths.h"
|
||||||
#include "otautil/roots.h"
|
#include "otautil/roots.h"
|
||||||
|
@ -80,11 +80,12 @@ static void UiLogger(android::base::LogId /* id */, android::base::LogSeverity s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parses the command line argument from various sources; and reads the stage field from BCB.
|
||||||
// command line args come from, in decreasing precedence:
|
// command line args come from, in decreasing precedence:
|
||||||
// - the actual command line
|
// - the actual command line
|
||||||
// - the bootloader control block (one per line, after "recovery")
|
// - the bootloader control block (one per line, after "recovery")
|
||||||
// - the contents of COMMAND_FILE (one per line)
|
// - the contents of COMMAND_FILE (one per line)
|
||||||
static std::vector<std::string> get_args(const int argc, char** const argv) {
|
static std::vector<std::string> get_args(const int argc, char** const argv, std::string* stage) {
|
||||||
CHECK_GT(argc, 0);
|
CHECK_GT(argc, 0);
|
||||||
|
|
||||||
bootloader_message boot = {};
|
bootloader_message boot = {};
|
||||||
|
@ -94,7 +95,9 @@ static std::vector<std::string> get_args(const int argc, char** const argv) {
|
||||||
// If fails, leave a zeroed bootloader_message.
|
// If fails, leave a zeroed bootloader_message.
|
||||||
boot = {};
|
boot = {};
|
||||||
}
|
}
|
||||||
stage = std::string(boot.stage);
|
if (stage) {
|
||||||
|
*stage = std::string(boot.stage);
|
||||||
|
}
|
||||||
|
|
||||||
std::string boot_command;
|
std::string boot_command;
|
||||||
if (boot.command[0] != 0) {
|
if (boot.command[0] != 0) {
|
||||||
|
@ -331,12 +334,14 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
load_volume_table();
|
load_volume_table();
|
||||||
|
|
||||||
std::vector<std::string> args = get_args(argc, argv);
|
std::string stage;
|
||||||
|
std::vector<std::string> args = get_args(argc, argv, &stage);
|
||||||
auto args_to_parse = StringVectorToNullTerminatedArray(args);
|
auto args_to_parse = StringVectorToNullTerminatedArray(args);
|
||||||
|
|
||||||
static constexpr struct option OPTIONS[] = {
|
static constexpr struct option OPTIONS[] = {
|
||||||
{ "fastboot", no_argument, nullptr, 0 },
|
{ "fastboot", no_argument, nullptr, 0 },
|
||||||
{ "locale", required_argument, nullptr, 0 },
|
{ "locale", required_argument, nullptr, 0 },
|
||||||
|
{ "reason", required_argument, nullptr, 0 },
|
||||||
{ "show_text", no_argument, nullptr, 't' },
|
{ "show_text", no_argument, nullptr, 't' },
|
||||||
{ nullptr, 0, nullptr, 0 },
|
{ nullptr, 0, nullptr, 0 },
|
||||||
};
|
};
|
||||||
|
@ -344,6 +349,7 @@ int main(int argc, char** argv) {
|
||||||
bool show_text = false;
|
bool show_text = false;
|
||||||
bool fastboot = false;
|
bool fastboot = false;
|
||||||
std::string locale;
|
std::string locale;
|
||||||
|
std::string reason;
|
||||||
|
|
||||||
int arg;
|
int arg;
|
||||||
int option_index;
|
int option_index;
|
||||||
|
@ -357,6 +363,8 @@ int main(int argc, char** argv) {
|
||||||
std::string option = OPTIONS[option_index].name;
|
std::string option = OPTIONS[option_index].name;
|
||||||
if (option == "locale") {
|
if (option == "locale") {
|
||||||
locale = optarg;
|
locale = optarg;
|
||||||
|
} else if (option == "reason") {
|
||||||
|
reason = optarg;
|
||||||
} else if (option == "fastboot" &&
|
} else if (option == "fastboot" &&
|
||||||
android::base::GetBoolProperty("ro.boot.dynamic_partitions", false)) {
|
android::base::GetBoolProperty("ro.boot.dynamic_partitions", false)) {
|
||||||
fastboot = true;
|
fastboot = true;
|
||||||
|
@ -412,6 +420,9 @@ int main(int argc, char** argv) {
|
||||||
device->ResetUI(new StubRecoveryUI());
|
device->ResetUI(new StubRecoveryUI());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BootState boot_state(reason, stage); // recovery_main owns the state of boot.
|
||||||
|
device->SetBootState(&boot_state);
|
||||||
ui = device->GetUI();
|
ui = device->GetUI();
|
||||||
|
|
||||||
if (!HasCache()) {
|
if (!HasCache()) {
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include <android-base/logging.h>
|
#include <android-base/logging.h>
|
||||||
|
|
||||||
|
#include "otautil/boot_state.h"
|
||||||
#include "recovery_ui/ui.h"
|
#include "recovery_ui/ui.h"
|
||||||
|
|
||||||
static std::vector<std::pair<std::string, Device::BuiltinAction>> g_menu_actions{
|
static std::vector<std::pair<std::string, Device::BuiltinAction>> g_menu_actions{
|
||||||
|
@ -95,3 +96,15 @@ int Device::HandleMenuKey(int key, bool visible) {
|
||||||
return ui_->HasThreeButtons() ? kNoAction : kHighlightDown;
|
return ui_->HasThreeButtons() ? kNoAction : kHighlightDown;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Device::SetBootState(const BootState* state) {
|
||||||
|
boot_state_ = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> Device::GetReason() const {
|
||||||
|
return boot_state_ ? std::make_optional(boot_state_->reason()) : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::string> Device::GetStage() const {
|
||||||
|
return boot_state_ ? std::make_optional(boot_state_->stage()) : std::nullopt;
|
||||||
|
}
|
||||||
|
|
|
@ -20,12 +20,15 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
// Forward declaration to avoid including "ui.h".
|
// Forward declaration to avoid including "ui.h".
|
||||||
class RecoveryUI;
|
class RecoveryUI;
|
||||||
|
|
||||||
|
class BootState;
|
||||||
|
|
||||||
class Device {
|
class Device {
|
||||||
public:
|
public:
|
||||||
static constexpr const int kNoAction = -1;
|
static constexpr const int kNoAction = -1;
|
||||||
|
@ -126,9 +129,16 @@ class Device {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetBootState(const BootState* state);
|
||||||
|
// The getters for reason and stage may return std::nullopt until StartRecovery() is called. It's
|
||||||
|
// the caller's responsibility to perform the check and handle the exception.
|
||||||
|
std::optional<std::string> GetReason() const;
|
||||||
|
std::optional<std::string> GetStage() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The RecoveryUI object that should be used to display the user interface for this device.
|
// The RecoveryUI object that should be used to display the user interface for this device.
|
||||||
std::unique_ptr<RecoveryUI> ui_;
|
std::unique_ptr<RecoveryUI> ui_;
|
||||||
|
const BootState* boot_state_{ nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
// Disable name mangling, as this function will be loaded via dlsym(3).
|
// Disable name mangling, as this function will be loaded via dlsym(3).
|
||||||
|
|
Loading…
Reference in a new issue