Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa554fed authored by Kelvin Zhang's avatar Kelvin Zhang
Browse files

Convert recovery to use AIDL bootcontrol HAL

Test: th
Bug; 227536004

Change-Id: I14c0c337c931d10c9b9865a1c15eaff8fedf191e
parent 6adffc35
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -94,6 +94,8 @@ cc_defaults {
    shared_libs: [
        "android.hardware.boot@1.0",
        "android.hardware.boot@1.1",
        "android.hardware.boot-V1-ndk",
        "libboot_control_client",
        "libbase",
        "libbootloader_message",
        "libcrypto",
@@ -158,6 +160,7 @@ cc_binary {

    shared_libs: [
        "android.hardware.health-V1-ndk", // from librecovery_utils
        "android.hardware.boot-V1-ndk",
        "librecovery_ui",
    ],

+3 −1
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ cc_library_static {

    shared_libs: [
        "android.hardware.boot@1.0",
        "libboot_control_client",
        "libbase",
        "libcutils",
        "libbinder",
@@ -118,6 +119,7 @@ cc_binary {
        "libprotobuf-cpp-lite",
        "libbinder",
        "libutils",
        "libboot_control_client",
    ],

    init_rc: [
+13 −16
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@
#include <future>
#include <thread>

#include <BootControlClient.h>
#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/logging.h>
@@ -59,7 +60,6 @@
#include <android-base/properties.h>
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
#include <android/hardware/boot/1.0/IBootControl.h>
#include <android/os/IVold.h>
#include <binder/BinderService.h>
#include <binder/Status.h>
@@ -67,11 +67,6 @@

#include "care_map.pb.h"

using android::sp;
using android::hardware::boot::V1_0::IBootControl;
using android::hardware::boot::V1_0::BoolResult;
using android::hardware::boot::V1_0::CommandResult;

// TODO(xunchang) remove the prefix and use a default path instead.
constexpr const char* kDefaultCareMapPrefix = "/data/ota_package/care_map";

@@ -92,7 +87,7 @@ UpdateVerifier::UpdateVerifier()
// partition's integrity.
std::map<std::string, std::string> UpdateVerifier::FindDmPartitions() {
  static constexpr auto DM_PATH_PREFIX = "/sys/block/";
  dirent** namelist;
  dirent** namelist = nullptr;
  int n = scandir(DM_PATH_PREFIX, &namelist, dm_name_filter, alphasort);
  if (n == -1) {
    PLOG(ERROR) << "Failed to scan dir " << DM_PATH_PREFIX;
@@ -329,18 +324,21 @@ int update_verifier(int argc, char** argv) {
    LOG(INFO) << "Started with arg " << i << ": " << argv[i];
  }

  sp<IBootControl> module = IBootControl::getService();
  const auto module = android::hal::BootControlClient::WaitForService();
  if (module == nullptr) {
    LOG(ERROR) << "Error getting bootctrl module.";
    return reboot_device();
  }

  uint32_t current_slot = module->getCurrentSlot();
  BoolResult is_successful = module->isSlotMarkedSuccessful(current_slot);
  LOG(INFO) << "Booting slot " << current_slot << ": isSlotMarkedSuccessful="
            << static_cast<int32_t>(is_successful);

  if (is_successful == BoolResult::FALSE) {
  uint32_t current_slot = module->GetCurrentSlot();
  const auto is_successful = module->IsSlotMarkedSuccessful(current_slot);
  if (!is_successful.has_value()) {
    LOG(INFO) << "Booting slot " << current_slot << " failed";
  } else {
    LOG(INFO) << "Booting slot " << current_slot
              << ": isSlotMarkedSuccessful=" << is_successful.value();
  }
  if (is_successful.has_value() && !is_successful.value()) {
    // The current slot has not booted successfully.

    bool skip_verification = false;
@@ -386,8 +384,7 @@ int update_verifier(int argc, char** argv) {
    }

    if (!supports_checkpoint) {
      CommandResult cr;
      module->markBootSuccessful([&cr](CommandResult result) { cr = result; });
      const auto cr = module->MarkBootSuccessful();
      if (!cr.success) {
        LOG(ERROR) << "Error marking booted successfully: " << cr.errMsg;
        return reboot_device();