xref: /aosp_15_r20/frameworks/base/services/incremental/ServiceWrappers.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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