You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
5.2 KiB
122 lines
5.2 KiB
/*
|
|
* Copyright (C) 2019 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <android-base/unique_fd.h>
|
|
#include <android/gsi/BnGsiService.h>
|
|
#include <binder/BinderService.h>
|
|
#include <libfiemap/split_fiemap_writer.h>
|
|
#include <liblp/builder.h>
|
|
#include "libgsi/libgsi.h"
|
|
|
|
#include "partition_installer.h"
|
|
|
|
namespace android {
|
|
namespace gsi {
|
|
|
|
class GsiService : public BinderService<GsiService>, public BnGsiService {
|
|
public:
|
|
static void Register();
|
|
|
|
binder::Status openInstall(const std::string& install_dir, int* _aidl_return) override;
|
|
binder::Status closeInstall(int32_t* _aidl_return) override;
|
|
binder::Status createPartition(const ::std::string& name, int64_t size, bool readOnly,
|
|
int32_t* _aidl_return) override;
|
|
binder::Status closePartition(int32_t* _aidl_return) override;
|
|
binder::Status commitGsiChunkFromStream(const ::android::os::ParcelFileDescriptor& stream,
|
|
int64_t bytes, bool* _aidl_return) override;
|
|
binder::Status getInstallProgress(::android::gsi::GsiProgress* _aidl_return) override;
|
|
binder::Status setGsiAshmem(const ::android::os::ParcelFileDescriptor& ashmem, int64_t size,
|
|
bool* _aidl_return) override;
|
|
binder::Status commitGsiChunkFromAshmem(int64_t bytes, bool* _aidl_return) override;
|
|
binder::Status cancelGsiInstall(bool* _aidl_return) override;
|
|
binder::Status enableGsi(bool oneShot, const std::string& dsuSlot, int* _aidl_return) override;
|
|
binder::Status enableGsiAsync(bool oneShot, const ::std::string& dsuSlot,
|
|
const sp<IGsiServiceCallback>& resultCallback) override;
|
|
binder::Status isGsiEnabled(bool* _aidl_return) override;
|
|
binder::Status removeGsi(bool* _aidl_return) override;
|
|
binder::Status removeGsiAsync(const sp<IGsiServiceCallback>& resultCallback) override;
|
|
binder::Status disableGsi(bool* _aidl_return) override;
|
|
binder::Status isGsiInstalled(bool* _aidl_return) override;
|
|
binder::Status isGsiRunning(bool* _aidl_return) override;
|
|
binder::Status isGsiInstallInProgress(bool* _aidl_return) override;
|
|
binder::Status getInstalledGsiImageDir(std::string* _aidl_return) override;
|
|
binder::Status getActiveDsuSlot(std::string* _aidl_return) override;
|
|
binder::Status getInstalledDsuSlots(std::vector<std::string>* _aidl_return) override;
|
|
binder::Status zeroPartition(const std::string& name, int* _aidl_return) override;
|
|
binder::Status openImageService(const std::string& prefix,
|
|
android::sp<IImageService>* _aidl_return) override;
|
|
binder::Status dumpDeviceMapperDevices(std::string* _aidl_return) override;
|
|
binder::Status getAvbPublicKey(AvbPublicKey* dst, int32_t* _aidl_return) override;
|
|
binder::Status suggestScratchSize(int64_t* _aidl_return) override;
|
|
|
|
// This is in GsiService, rather than GsiInstaller, since we need to access
|
|
// it outside of the main lock which protects the unique_ptr.
|
|
void StartAsyncOperation(const std::string& step, int64_t total_bytes);
|
|
void UpdateProgress(int status, int64_t bytes_processed);
|
|
|
|
// Helper methods for GsiInstaller.
|
|
static bool RemoveGsiFiles(const std::string& install_dir);
|
|
bool should_abort() const { return should_abort_; }
|
|
|
|
static void RunStartupTasks();
|
|
static std::string GetInstalledImageDir();
|
|
std::string GetActiveDsuSlot();
|
|
std::string GetActiveInstalledImageDir();
|
|
|
|
static std::vector<std::string> GetInstalledDsuSlots();
|
|
|
|
private:
|
|
friend class ImageService;
|
|
|
|
GsiService();
|
|
static int ValidateInstallParams(std::string& install_dir);
|
|
bool DisableGsiInstall();
|
|
int ReenableGsi(bool one_shot);
|
|
static void CleanCorruptedInstallation();
|
|
static int SaveInstallation(const std::string&);
|
|
static bool IsInstallationComplete(const std::string&);
|
|
static std::string GetCompleteIndication(const std::string&);
|
|
|
|
enum class AccessLevel { System, SystemOrShell };
|
|
binder::Status CheckUid(AccessLevel level = AccessLevel::System);
|
|
bool CreateInstallStatusFile();
|
|
bool SetBootMode(bool one_shot);
|
|
|
|
static android::wp<GsiService> sInstance;
|
|
|
|
std::string install_dir_ = {};
|
|
std::unique_ptr<PartitionInstaller> installer_;
|
|
std::mutex lock_;
|
|
std::mutex& lock() { return lock_; }
|
|
// These are initialized or set in StartInstall().
|
|
std::atomic<bool> should_abort_ = false;
|
|
|
|
// Progress bar state.
|
|
std::mutex progress_lock_;
|
|
GsiProgress progress_;
|
|
};
|
|
|
|
} // namespace gsi
|
|
} // namespace android
|