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

Commit b2ee4c14 authored by David Anderson's avatar David Anderson
Browse files

libsnapshot: Move ImageManager creation to DeviceInfo.

This refactoring moves ImageManager creation out of SnapshotManager,
where it had always been rather awkward, and into IDeviceInfo so it can
participate in dependency injection.

The "first-stage init" state is now part of IDeviceInfo as well.

Bug: 187396878
Test: vts_libsnapshot_test
      libsnapshot_fuzzer_test
Change-Id: Ic4b3e93527cc074ec18c0c26440dbdb2504d0d5e
parent fcd105d5
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ cc_defaults {
        "android.hardware.boot@1.1",
        "libbrotli",
        "libc++fs",
        "libfs_mgr",
        "libfs_mgr_binder",
        "libgsi",
        "libgmock",
        "liblp",
+41 −0
Original line number Diff line number Diff line
device_info_data {
  allow_set_slot_as_unbootable: true
  is_recovery: true
}
is_super_metadata_valid: true
super_data {
  partitions {
    partition_name: "sys_a"
    new_partition_info {
      size: 3145728
    }
  }
  partitions {
    partition_name: "vnnd_"
    new_partition_info {
      size: 3145728
    }
  }
  partitions {
    partition_name: "prd_a"
    new_partition_info {
    }
  }
  dynamic_partition_metadata {
    groups {
      name: "group_google_dp_a"
      size: 34375467008
      partition_names: "sys_a"
      partition_names: "vnd_a"
      partition_names: "prd_a"
    }
  }
}
has_metadata_snapshots_dir: true
actions {
  handle_imminent_data_wipe: true
}
actions {
  begin_update {
  }
}
+23 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <android-base/logging.h>
#include <fs_mgr.h>
#include <fs_mgr_overlayfs.h>
#include <libfiemap/image_manager.h>

namespace android {
namespace snapshot {
@@ -26,6 +27,7 @@ using android::hardware::boot::V1_0::BoolResult;
using android::hardware::boot::V1_0::CommandResult;
#endif

using namespace std::chrono_literals;
using namespace std::string_literals;

#ifdef __ANDROID_RECOVERY__
@@ -34,10 +36,6 @@ constexpr bool kIsRecovery = true;
constexpr bool kIsRecovery = false;
#endif

std::string DeviceInfo::GetGsidDir() const {
    return "ota"s;
}

std::string DeviceInfo::GetMetadataDir() const {
    return "/metadata/ota"s;
}
@@ -100,6 +98,10 @@ bool DeviceInfo::IsRecovery() const {
    return kIsRecovery;
}

bool DeviceInfo::IsFirstStageInit() const {
    return first_stage_init_;
}

bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) {
#ifdef LIBSNAPSHOT_USE_HAL
    if (!EnsureBootHal()) {
@@ -120,5 +122,22 @@ bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) {
#endif
}

std::unique_ptr<android::fiemap::IImageManager> DeviceInfo::OpenImageManager() const {
    return IDeviceInfo::OpenImageManager("ota");
}

std::unique_ptr<android::fiemap::IImageManager> ISnapshotManager::IDeviceInfo::OpenImageManager(
        const std::string& gsid_dir) const {
    if (IsRecovery() || IsFirstStageInit()) {
        android::fiemap::ImageManager::DeviceInfo device_info = {
                .is_recovery = {IsRecovery()},
        };
        return android::fiemap::ImageManager::Open(gsid_dir, device_info);
    } else {
        // For now, use a preset timeout.
        return android::fiemap::IImageManager::Open(gsid_dir, 15000ms);
    }
}

}  // namespace snapshot
}  // namespace android
+5 −1
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo {
    using MergeStatus = android::hardware::boot::V1_1::MergeStatus;

  public:
    std::string GetGsidDir() const override;
    std::string GetMetadataDir() const override;
    std::string GetSlotSuffix() const override;
    std::string GetOtherSlotSuffix() const override;
@@ -39,11 +38,16 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo {
    bool SetBootControlMergeStatus(MergeStatus status) override;
    bool SetSlotAsUnbootable(unsigned int slot) override;
    bool IsRecovery() const override;
    std::unique_ptr<IImageManager> OpenImageManager() const override;
    bool IsFirstStageInit() const override;

    void set_first_stage_init(bool value) { first_stage_init_ = value; }

  private:
    bool EnsureBootHal();

    android::fs_mgr::PartitionOpener opener_;
    bool first_stage_init_ = false;
#ifdef LIBSNAPSHOT_USE_HAL
    android::sp<android::hardware::boot::V1_1::IBootControl> boot_control_;
#endif
+3 −1
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ namespace android::snapshot {

class MockDeviceInfo : public SnapshotManager::IDeviceInfo {
  public:
    MOCK_METHOD(std::string, GetGsidDir, (), (const, override));
    MOCK_METHOD(std::string, GetMetadataDir, (), (const, override));
    MOCK_METHOD(std::string, GetSlotSuffix, (), (const, override));
    MOCK_METHOD(std::string, GetOtherSlotSuffix, (), (const, override));
@@ -32,6 +31,9 @@ class MockDeviceInfo : public SnapshotManager::IDeviceInfo {
    MOCK_METHOD(bool, SetBootControlMergeStatus, (MergeStatus status), (override));
    MOCK_METHOD(bool, SetSlotAsUnbootable, (unsigned int slot), (override));
    MOCK_METHOD(bool, IsRecovery, (), (const, override));
    MOCK_METHOD(bool, IsFirstStageInit, (), (const, override));
    MOCK_METHOD(std::unique_ptr<android::fiemap::IImageManager>, OpenImageManager, (),
                (const, override));
};

}  // namespace android::snapshot
Loading