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 Original line Diff line number Diff line
@@ -266,7 +266,7 @@ cc_defaults {
        "android.hardware.boot@1.1",
        "android.hardware.boot@1.1",
        "libbrotli",
        "libbrotli",
        "libc++fs",
        "libc++fs",
        "libfs_mgr",
        "libfs_mgr_binder",
        "libgsi",
        "libgsi",
        "libgmock",
        "libgmock",
        "liblp",
        "liblp",
+41 −0
Original line number Original line 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 Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#include <android-base/logging.h>
#include <android-base/logging.h>
#include <fs_mgr.h>
#include <fs_mgr.h>
#include <fs_mgr_overlayfs.h>
#include <fs_mgr_overlayfs.h>
#include <libfiemap/image_manager.h>


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


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


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


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

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


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

bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) {
bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) {
#ifdef LIBSNAPSHOT_USE_HAL
#ifdef LIBSNAPSHOT_USE_HAL
    if (!EnsureBootHal()) {
    if (!EnsureBootHal()) {
@@ -120,5 +122,22 @@ bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) {
#endif
#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 snapshot
}  // namespace android
}  // namespace android
+5 −1
Original line number Original line Diff line number Diff line
@@ -29,7 +29,6 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo {
    using MergeStatus = android::hardware::boot::V1_1::MergeStatus;
    using MergeStatus = android::hardware::boot::V1_1::MergeStatus;


  public:
  public:
    std::string GetGsidDir() const override;
    std::string GetMetadataDir() const override;
    std::string GetMetadataDir() const override;
    std::string GetSlotSuffix() const override;
    std::string GetSlotSuffix() const override;
    std::string GetOtherSlotSuffix() const override;
    std::string GetOtherSlotSuffix() const override;
@@ -39,11 +38,16 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo {
    bool SetBootControlMergeStatus(MergeStatus status) override;
    bool SetBootControlMergeStatus(MergeStatus status) override;
    bool SetSlotAsUnbootable(unsigned int slot) override;
    bool SetSlotAsUnbootable(unsigned int slot) override;
    bool IsRecovery() const 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:
  private:
    bool EnsureBootHal();
    bool EnsureBootHal();


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


class MockDeviceInfo : public SnapshotManager::IDeviceInfo {
class MockDeviceInfo : public SnapshotManager::IDeviceInfo {
  public:
  public:
    MOCK_METHOD(std::string, GetGsidDir, (), (const, override));
    MOCK_METHOD(std::string, GetMetadataDir, (), (const, override));
    MOCK_METHOD(std::string, GetMetadataDir, (), (const, override));
    MOCK_METHOD(std::string, GetSlotSuffix, (), (const, override));
    MOCK_METHOD(std::string, GetSlotSuffix, (), (const, override));
    MOCK_METHOD(std::string, GetOtherSlotSuffix, (), (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, SetBootControlMergeStatus, (MergeStatus status), (override));
    MOCK_METHOD(bool, SetSlotAsUnbootable, (unsigned int slot), (override));
    MOCK_METHOD(bool, SetSlotAsUnbootable, (unsigned int slot), (override));
    MOCK_METHOD(bool, IsRecovery, (), (const, 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
}  // namespace android::snapshot
Loading