1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #pragma once 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include <android-base/function_ref.h> 20*d57664e9SAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 21*d57664e9SAndroid Build Coastguard Worker #include <android/content/pm/DataLoaderParamsParcel.h> 22*d57664e9SAndroid Build Coastguard Worker #include <android/content/pm/FileSystemControlParcel.h> 23*d57664e9SAndroid Build Coastguard Worker #include <android/content/pm/IDataLoader.h> 24*d57664e9SAndroid Build Coastguard Worker #include <android/content/pm/IDataLoaderStatusListener.h> 25*d57664e9SAndroid Build Coastguard Worker #include <android/os/incremental/PerUidReadTimeouts.h> 26*d57664e9SAndroid Build Coastguard Worker #include <binder/IAppOpsCallback.h> 27*d57664e9SAndroid Build Coastguard Worker #include <binder/IServiceManager.h> 28*d57664e9SAndroid Build Coastguard Worker #include <binder/Status.h> 29*d57664e9SAndroid Build Coastguard Worker #include <incfs.h> 30*d57664e9SAndroid Build Coastguard Worker #include <jni.h> 31*d57664e9SAndroid Build Coastguard Worker #include <utils/Looper.h> 32*d57664e9SAndroid Build Coastguard Worker 33*d57664e9SAndroid Build Coastguard Worker #include <memory> 34*d57664e9SAndroid Build Coastguard Worker #include <span> 35*d57664e9SAndroid Build Coastguard Worker #include <string> 36*d57664e9SAndroid Build Coastguard Worker #include <string_view> 37*d57664e9SAndroid Build Coastguard Worker 38*d57664e9SAndroid Build Coastguard Worker namespace android::incremental { 39*d57664e9SAndroid Build Coastguard Worker 40*d57664e9SAndroid Build Coastguard Worker using Clock = std::chrono::steady_clock; 41*d57664e9SAndroid Build Coastguard Worker using TimePoint = std::chrono::time_point<Clock>; 42*d57664e9SAndroid Build Coastguard Worker using Milliseconds = std::chrono::milliseconds; 43*d57664e9SAndroid Build Coastguard Worker using Job = std::function<void()>; 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker // --- Wrapper interfaces --- 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Worker using MountId = int32_t; 48*d57664e9SAndroid Build Coastguard Worker 49*d57664e9SAndroid Build Coastguard Worker class VoldServiceWrapper { 50*d57664e9SAndroid Build Coastguard Worker public: 51*d57664e9SAndroid Build Coastguard Worker virtual ~VoldServiceWrapper() = default; 52*d57664e9SAndroid Build Coastguard Worker virtual binder::Status mountIncFs( 53*d57664e9SAndroid Build Coastguard Worker const std::string& backingPath, const std::string& targetDir, int32_t flags, 54*d57664e9SAndroid Build Coastguard Worker const std::string& sysfsName, 55*d57664e9SAndroid Build Coastguard Worker os::incremental::IncrementalFileSystemControlParcel* result) const = 0; 56*d57664e9SAndroid Build Coastguard Worker virtual binder::Status unmountIncFs(const std::string& dir) const = 0; 57*d57664e9SAndroid Build Coastguard Worker virtual binder::Status bindMount(const std::string& sourceDir, 58*d57664e9SAndroid Build Coastguard Worker const std::string& targetDir) const = 0; 59*d57664e9SAndroid Build Coastguard Worker virtual binder::Status setIncFsMountOptions( 60*d57664e9SAndroid Build Coastguard Worker const os::incremental::IncrementalFileSystemControlParcel& control, bool enableReadLogs, 61*d57664e9SAndroid Build Coastguard Worker bool enableReadTimeouts, const std::string& sysfsName) const = 0; 62*d57664e9SAndroid Build Coastguard Worker }; 63*d57664e9SAndroid Build Coastguard Worker 64*d57664e9SAndroid Build Coastguard Worker class DataLoaderManagerWrapper { 65*d57664e9SAndroid Build Coastguard Worker public: 66*d57664e9SAndroid Build Coastguard Worker virtual ~DataLoaderManagerWrapper() = default; 67*d57664e9SAndroid Build Coastguard Worker virtual binder::Status bindToDataLoader( 68*d57664e9SAndroid Build Coastguard Worker MountId mountId, const content::pm::DataLoaderParamsParcel& params, int bindDelayMs, 69*d57664e9SAndroid Build Coastguard Worker const sp<content::pm::IDataLoaderStatusListener>& listener, bool* result) const = 0; 70*d57664e9SAndroid Build Coastguard Worker virtual binder::Status getDataLoader(MountId mountId, 71*d57664e9SAndroid Build Coastguard Worker sp<content::pm::IDataLoader>* result) const = 0; 72*d57664e9SAndroid Build Coastguard Worker virtual binder::Status unbindFromDataLoader(MountId mountId) const = 0; 73*d57664e9SAndroid Build Coastguard Worker }; 74*d57664e9SAndroid Build Coastguard Worker 75*d57664e9SAndroid Build Coastguard Worker class IncFsWrapper { 76*d57664e9SAndroid Build Coastguard Worker public: 77*d57664e9SAndroid Build Coastguard Worker using Control = incfs::Control; 78*d57664e9SAndroid Build Coastguard Worker using FileId = incfs::FileId; 79*d57664e9SAndroid Build Coastguard Worker using ErrorCode = incfs::ErrorCode; 80*d57664e9SAndroid Build Coastguard Worker using UniqueFd = incfs::UniqueFd; 81*d57664e9SAndroid Build Coastguard Worker using WaitResult = incfs::WaitResult; 82*d57664e9SAndroid Build Coastguard Worker using Features = incfs::Features; 83*d57664e9SAndroid Build Coastguard Worker using Metrics = incfs::Metrics; 84*d57664e9SAndroid Build Coastguard Worker using LastReadError = incfs::LastReadError; 85*d57664e9SAndroid Build Coastguard Worker 86*d57664e9SAndroid Build Coastguard Worker using ExistingMountCallback = android::base::function_ref< 87*d57664e9SAndroid Build Coastguard Worker void(std::string_view root, std::string_view backingDir, 88*d57664e9SAndroid Build Coastguard Worker std::span<std::pair<std::string_view, std::string_view>> binds)>; 89*d57664e9SAndroid Build Coastguard Worker 90*d57664e9SAndroid Build Coastguard Worker using FileCallback = android::base::function_ref<bool(const Control& control, FileId fileId)>; 91*d57664e9SAndroid Build Coastguard Worker 92*d57664e9SAndroid Build Coastguard Worker static std::string toString(FileId fileId); 93*d57664e9SAndroid Build Coastguard Worker 94*d57664e9SAndroid Build Coastguard Worker virtual ~IncFsWrapper() = default; 95*d57664e9SAndroid Build Coastguard Worker virtual Features features() const = 0; 96*d57664e9SAndroid Build Coastguard Worker virtual void listExistingMounts(const ExistingMountCallback& cb) const = 0; 97*d57664e9SAndroid Build Coastguard Worker virtual Control openMount(std::string_view path) const = 0; 98*d57664e9SAndroid Build Coastguard Worker virtual Control createControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs, 99*d57664e9SAndroid Build Coastguard Worker IncFsFd blocksWritten) const = 0; 100*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode makeFile(const Control& control, std::string_view path, int mode, FileId id, 101*d57664e9SAndroid Build Coastguard Worker incfs::NewFileParams params) const = 0; 102*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode makeMappedFile(const Control& control, std::string_view path, int mode, 103*d57664e9SAndroid Build Coastguard Worker incfs::NewMappedFileParams params) const = 0; 104*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode makeDir(const Control& control, std::string_view path, int mode) const = 0; 105*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode makeDirs(const Control& control, std::string_view path, int mode) const = 0; 106*d57664e9SAndroid Build Coastguard Worker virtual incfs::RawMetadata getMetadata(const Control& control, FileId fileid) const = 0; 107*d57664e9SAndroid Build Coastguard Worker virtual incfs::RawMetadata getMetadata(const Control& control, std::string_view path) const = 0; 108*d57664e9SAndroid Build Coastguard Worker virtual FileId getFileId(const Control& control, std::string_view path) const = 0; 109*d57664e9SAndroid Build Coastguard Worker virtual std::pair<IncFsBlockIndex, IncFsBlockIndex> countFilledBlocks( 110*d57664e9SAndroid Build Coastguard Worker const Control& control, std::string_view path) const = 0; 111*d57664e9SAndroid Build Coastguard Worker virtual incfs::LoadingState isFileFullyLoaded(const Control& control, 112*d57664e9SAndroid Build Coastguard Worker std::string_view path) const = 0; 113*d57664e9SAndroid Build Coastguard Worker virtual incfs::LoadingState isFileFullyLoaded(const Control& control, FileId id) const = 0; 114*d57664e9SAndroid Build Coastguard Worker virtual incfs::LoadingState isEverythingFullyLoaded(const Control& control) const = 0; 115*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode link(const Control& control, std::string_view from, 116*d57664e9SAndroid Build Coastguard Worker std::string_view to) const = 0; 117*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode unlink(const Control& control, std::string_view path) const = 0; 118*d57664e9SAndroid Build Coastguard Worker virtual UniqueFd openForSpecialOps(const Control& control, FileId id) const = 0; 119*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode writeBlocks(std::span<const incfs::DataBlock> blocks) const = 0; 120*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode reserveSpace(const Control& control, FileId id, IncFsSize size) const = 0; 121*d57664e9SAndroid Build Coastguard Worker virtual WaitResult waitForPendingReads( 122*d57664e9SAndroid Build Coastguard Worker const Control& control, std::chrono::milliseconds timeout, 123*d57664e9SAndroid Build Coastguard Worker std::vector<incfs::ReadInfoWithUid>* pendingReadsBuffer) const = 0; 124*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode setUidReadTimeouts( 125*d57664e9SAndroid Build Coastguard Worker const Control& control, 126*d57664e9SAndroid Build Coastguard Worker const std::vector<::android::os::incremental::PerUidReadTimeouts>& perUidReadTimeouts) 127*d57664e9SAndroid Build Coastguard Worker const = 0; 128*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode forEachFile(const Control& control, FileCallback cb) const = 0; 129*d57664e9SAndroid Build Coastguard Worker virtual ErrorCode forEachIncompleteFile(const Control& control, FileCallback cb) const = 0; 130*d57664e9SAndroid Build Coastguard Worker virtual std::optional<Metrics> getMetrics(std::string_view sysfsName) const = 0; 131*d57664e9SAndroid Build Coastguard Worker virtual std::optional<LastReadError> getLastReadError(const Control& control) const = 0; 132*d57664e9SAndroid Build Coastguard Worker }; 133*d57664e9SAndroid Build Coastguard Worker 134*d57664e9SAndroid Build Coastguard Worker class AppOpsManagerWrapper { 135*d57664e9SAndroid Build Coastguard Worker public: 136*d57664e9SAndroid Build Coastguard Worker virtual ~AppOpsManagerWrapper() = default; 137*d57664e9SAndroid Build Coastguard Worker virtual binder::Status checkPermission(const char* permission, const char* operation, 138*d57664e9SAndroid Build Coastguard Worker const char* package) const = 0; 139*d57664e9SAndroid Build Coastguard Worker virtual void startWatchingMode(int32_t op, const String16& packageName, 140*d57664e9SAndroid Build Coastguard Worker const sp<IAppOpsCallback>& callback) = 0; 141*d57664e9SAndroid Build Coastguard Worker virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) = 0; 142*d57664e9SAndroid Build Coastguard Worker }; 143*d57664e9SAndroid Build Coastguard Worker 144*d57664e9SAndroid Build Coastguard Worker class JniWrapper { 145*d57664e9SAndroid Build Coastguard Worker public: 146*d57664e9SAndroid Build Coastguard Worker virtual ~JniWrapper() = default; 147*d57664e9SAndroid Build Coastguard Worker virtual void initializeForCurrentThread() const = 0; 148*d57664e9SAndroid Build Coastguard Worker }; 149*d57664e9SAndroid Build Coastguard Worker 150*d57664e9SAndroid Build Coastguard Worker class LooperWrapper { 151*d57664e9SAndroid Build Coastguard Worker public: 152*d57664e9SAndroid Build Coastguard Worker virtual ~LooperWrapper() = default; 153*d57664e9SAndroid Build Coastguard Worker virtual int addFd(int fd, int ident, int events, android::Looper_callbackFunc callback, 154*d57664e9SAndroid Build Coastguard Worker void* data) = 0; 155*d57664e9SAndroid Build Coastguard Worker virtual int removeFd(int fd) = 0; 156*d57664e9SAndroid Build Coastguard Worker virtual void wake() = 0; 157*d57664e9SAndroid Build Coastguard Worker virtual int pollAll(int timeoutMillis) = 0; 158*d57664e9SAndroid Build Coastguard Worker }; 159*d57664e9SAndroid Build Coastguard Worker 160*d57664e9SAndroid Build Coastguard Worker class TimedQueueWrapper { 161*d57664e9SAndroid Build Coastguard Worker public: 162*d57664e9SAndroid Build Coastguard Worker virtual ~TimedQueueWrapper() = default; 163*d57664e9SAndroid Build Coastguard Worker virtual void addJob(MountId id, Milliseconds after, Job what) = 0; 164*d57664e9SAndroid Build Coastguard Worker virtual void removeJobs(MountId id) = 0; 165*d57664e9SAndroid Build Coastguard Worker virtual void stop() = 0; 166*d57664e9SAndroid Build Coastguard Worker }; 167*d57664e9SAndroid Build Coastguard Worker 168*d57664e9SAndroid Build Coastguard Worker class FsWrapper { 169*d57664e9SAndroid Build Coastguard Worker public: 170*d57664e9SAndroid Build Coastguard Worker virtual ~FsWrapper() = default; 171*d57664e9SAndroid Build Coastguard Worker 172*d57664e9SAndroid Build Coastguard Worker using FileCallback = android::base::function_ref<bool(std::string_view)>; 173*d57664e9SAndroid Build Coastguard Worker virtual void listFilesRecursive(std::string_view directoryPath, FileCallback onFile) const = 0; 174*d57664e9SAndroid Build Coastguard Worker }; 175*d57664e9SAndroid Build Coastguard Worker 176*d57664e9SAndroid Build Coastguard Worker class ClockWrapper { 177*d57664e9SAndroid Build Coastguard Worker public: 178*d57664e9SAndroid Build Coastguard Worker virtual ~ClockWrapper() = default; 179*d57664e9SAndroid Build Coastguard Worker virtual TimePoint now() const = 0; 180*d57664e9SAndroid Build Coastguard Worker }; 181*d57664e9SAndroid Build Coastguard Worker 182*d57664e9SAndroid Build Coastguard Worker class ServiceManagerWrapper { 183*d57664e9SAndroid Build Coastguard Worker public: 184*d57664e9SAndroid Build Coastguard Worker virtual ~ServiceManagerWrapper() = default; 185*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<VoldServiceWrapper> getVoldService() = 0; 186*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() = 0; 187*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<IncFsWrapper> getIncFs() = 0; 188*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() = 0; 189*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<JniWrapper> getJni() = 0; 190*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<LooperWrapper> getLooper() = 0; 191*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<TimedQueueWrapper> getTimedQueue() = 0; 192*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() = 0; 193*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<FsWrapper> getFs() = 0; 194*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<ClockWrapper> getClock() = 0; 195*d57664e9SAndroid Build Coastguard Worker }; 196*d57664e9SAndroid Build Coastguard Worker 197*d57664e9SAndroid Build Coastguard Worker // --- Real stuff --- 198*d57664e9SAndroid Build Coastguard Worker 199*d57664e9SAndroid Build Coastguard Worker class RealServiceManager : public ServiceManagerWrapper { 200*d57664e9SAndroid Build Coastguard Worker public: 201*d57664e9SAndroid Build Coastguard Worker RealServiceManager(sp<IServiceManager> serviceManager, JNIEnv* env); 202*d57664e9SAndroid Build Coastguard Worker ~RealServiceManager() = default; 203*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<VoldServiceWrapper> getVoldService() final; 204*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final; 205*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<IncFsWrapper> getIncFs() final; 206*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final; 207*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<JniWrapper> getJni() final; 208*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<LooperWrapper> getLooper() final; 209*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<TimedQueueWrapper> getTimedQueue() final; 210*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<TimedQueueWrapper> getProgressUpdateJobQueue() final; 211*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<FsWrapper> getFs() final; 212*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<ClockWrapper> getClock() final; 213*d57664e9SAndroid Build Coastguard Worker 214*d57664e9SAndroid Build Coastguard Worker private: 215*d57664e9SAndroid Build Coastguard Worker template <class INTERFACE> 216*d57664e9SAndroid Build Coastguard Worker sp<INTERFACE> getRealService(std::string_view serviceName) const; 217*d57664e9SAndroid Build Coastguard Worker sp<android::IServiceManager> mServiceManager; 218*d57664e9SAndroid Build Coastguard Worker JavaVM* const mJvm; 219*d57664e9SAndroid Build Coastguard Worker }; 220*d57664e9SAndroid Build Coastguard Worker 221*d57664e9SAndroid Build Coastguard Worker } // namespace android::incremental 222