xref: /aosp_15_r20/frameworks/native/libs/binder/BackendUnifiedServiceManager.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker #include "BackendUnifiedServiceManager.h"
17*38e8c45fSAndroid Build Coastguard Worker 
18*38e8c45fSAndroid Build Coastguard Worker #include <android/os/IAccessor.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <android/os/IServiceManager.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/RpcSession.h>
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker #if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
23*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
24*38e8c45fSAndroid Build Coastguard Worker #endif
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker namespace android {
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker #ifdef LIBBINDER_CLIENT_CACHE
29*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseCache = true;
30*38e8c45fSAndroid Build Coastguard Worker #else
31*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseCache = false;
32*38e8c45fSAndroid Build Coastguard Worker #endif
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker #ifdef LIBBINDER_ADDSERVICE_CACHE
35*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseCacheInAddService = true;
36*38e8c45fSAndroid Build Coastguard Worker #else
37*38e8c45fSAndroid Build Coastguard Worker constexpr bool kUseCacheInAddService = false;
38*38e8c45fSAndroid Build Coastguard Worker #endif
39*38e8c45fSAndroid Build Coastguard Worker 
40*38e8c45fSAndroid Build Coastguard Worker #ifdef LIBBINDER_REMOVE_CACHE_STATIC_LIST
41*38e8c45fSAndroid Build Coastguard Worker constexpr bool kRemoveStaticList = true;
42*38e8c45fSAndroid Build Coastguard Worker #else
43*38e8c45fSAndroid Build Coastguard Worker constexpr bool kRemoveStaticList = false;
44*38e8c45fSAndroid Build Coastguard Worker #endif
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker using AidlServiceManager = android::os::IServiceManager;
47*38e8c45fSAndroid Build Coastguard Worker using android::os::IAccessor;
48*38e8c45fSAndroid Build Coastguard Worker using binder::Status;
49*38e8c45fSAndroid Build Coastguard Worker 
50*38e8c45fSAndroid Build Coastguard Worker static const char* kStaticCachableList[] = {
51*38e8c45fSAndroid Build Coastguard Worker         // go/keep-sorted start
52*38e8c45fSAndroid Build Coastguard Worker         "accessibility",
53*38e8c45fSAndroid Build Coastguard Worker         "account",
54*38e8c45fSAndroid Build Coastguard Worker         "activity",
55*38e8c45fSAndroid Build Coastguard Worker         "alarm",
56*38e8c45fSAndroid Build Coastguard Worker         "android.frameworks.stats.IStats/default",
57*38e8c45fSAndroid Build Coastguard Worker         "android.system.keystore2.IKeystoreService/default",
58*38e8c45fSAndroid Build Coastguard Worker         "appops",
59*38e8c45fSAndroid Build Coastguard Worker         "audio",
60*38e8c45fSAndroid Build Coastguard Worker         "autofill",
61*38e8c45fSAndroid Build Coastguard Worker         "batteryproperties",
62*38e8c45fSAndroid Build Coastguard Worker         "batterystats",
63*38e8c45fSAndroid Build Coastguard Worker         "biometic",
64*38e8c45fSAndroid Build Coastguard Worker         "carrier_config",
65*38e8c45fSAndroid Build Coastguard Worker         "connectivity",
66*38e8c45fSAndroid Build Coastguard Worker         "content",
67*38e8c45fSAndroid Build Coastguard Worker         "content_capture",
68*38e8c45fSAndroid Build Coastguard Worker         "device_policy",
69*38e8c45fSAndroid Build Coastguard Worker         "display",
70*38e8c45fSAndroid Build Coastguard Worker         "dropbox",
71*38e8c45fSAndroid Build Coastguard Worker         "econtroller",
72*38e8c45fSAndroid Build Coastguard Worker         "graphicsstats",
73*38e8c45fSAndroid Build Coastguard Worker         "input",
74*38e8c45fSAndroid Build Coastguard Worker         "input_method",
75*38e8c45fSAndroid Build Coastguard Worker         "isub",
76*38e8c45fSAndroid Build Coastguard Worker         "jobscheduler",
77*38e8c45fSAndroid Build Coastguard Worker         "legacy_permission",
78*38e8c45fSAndroid Build Coastguard Worker         "location",
79*38e8c45fSAndroid Build Coastguard Worker         "lock_settings",
80*38e8c45fSAndroid Build Coastguard Worker         "media.extractor",
81*38e8c45fSAndroid Build Coastguard Worker         "media.metrics",
82*38e8c45fSAndroid Build Coastguard Worker         "media.player",
83*38e8c45fSAndroid Build Coastguard Worker         "media.resource_manager",
84*38e8c45fSAndroid Build Coastguard Worker         "media_resource_monitor",
85*38e8c45fSAndroid Build Coastguard Worker         "mount",
86*38e8c45fSAndroid Build Coastguard Worker         "netd_listener",
87*38e8c45fSAndroid Build Coastguard Worker         "netstats",
88*38e8c45fSAndroid Build Coastguard Worker         "network_management",
89*38e8c45fSAndroid Build Coastguard Worker         "nfc",
90*38e8c45fSAndroid Build Coastguard Worker         "notification",
91*38e8c45fSAndroid Build Coastguard Worker         "package",
92*38e8c45fSAndroid Build Coastguard Worker         "package_native",
93*38e8c45fSAndroid Build Coastguard Worker         "performance_hint",
94*38e8c45fSAndroid Build Coastguard Worker         "permission",
95*38e8c45fSAndroid Build Coastguard Worker         "permission_checker",
96*38e8c45fSAndroid Build Coastguard Worker         "permissionmgr",
97*38e8c45fSAndroid Build Coastguard Worker         "phone",
98*38e8c45fSAndroid Build Coastguard Worker         "platform_compat",
99*38e8c45fSAndroid Build Coastguard Worker         "power",
100*38e8c45fSAndroid Build Coastguard Worker         "processinfo",
101*38e8c45fSAndroid Build Coastguard Worker         "role",
102*38e8c45fSAndroid Build Coastguard Worker         "sensitive_content_protection_service",
103*38e8c45fSAndroid Build Coastguard Worker         "sensorservice",
104*38e8c45fSAndroid Build Coastguard Worker         "statscompanion",
105*38e8c45fSAndroid Build Coastguard Worker         "telephony.registry",
106*38e8c45fSAndroid Build Coastguard Worker         "thermalservice",
107*38e8c45fSAndroid Build Coastguard Worker         "time_detector",
108*38e8c45fSAndroid Build Coastguard Worker         "tracing.proxy",
109*38e8c45fSAndroid Build Coastguard Worker         "trust",
110*38e8c45fSAndroid Build Coastguard Worker         "uimode",
111*38e8c45fSAndroid Build Coastguard Worker         "user",
112*38e8c45fSAndroid Build Coastguard Worker         "vibrator",
113*38e8c45fSAndroid Build Coastguard Worker         "virtualdevice",
114*38e8c45fSAndroid Build Coastguard Worker         "virtualdevice_native",
115*38e8c45fSAndroid Build Coastguard Worker         "webviewupdate",
116*38e8c45fSAndroid Build Coastguard Worker         "window",
117*38e8c45fSAndroid Build Coastguard Worker         // go/keep-sorted end
118*38e8c45fSAndroid Build Coastguard Worker };
119*38e8c45fSAndroid Build Coastguard Worker 
createServiceWithMetadata(const sp<IBinder> & service,bool isLazyService)120*38e8c45fSAndroid Build Coastguard Worker os::ServiceWithMetadata createServiceWithMetadata(const sp<IBinder>& service, bool isLazyService) {
121*38e8c45fSAndroid Build Coastguard Worker     os::ServiceWithMetadata out = os::ServiceWithMetadata();
122*38e8c45fSAndroid Build Coastguard Worker     out.service = service;
123*38e8c45fSAndroid Build Coastguard Worker     out.isLazyService = isLazyService;
124*38e8c45fSAndroid Build Coastguard Worker     return out;
125*38e8c45fSAndroid Build Coastguard Worker }
126*38e8c45fSAndroid Build Coastguard Worker 
isClientSideCachingEnabled(const std::string & serviceName)127*38e8c45fSAndroid Build Coastguard Worker bool BinderCacheWithInvalidation::isClientSideCachingEnabled(const std::string& serviceName) {
128*38e8c45fSAndroid Build Coastguard Worker     sp<ProcessState> self = ProcessState::selfOrNull();
129*38e8c45fSAndroid Build Coastguard Worker     if (!self || self->getThreadPoolMaxTotalThreadCount() <= 0) {
130*38e8c45fSAndroid Build Coastguard Worker         ALOGW("Thread Pool max thread count is 0. Cannot cache binder as linkToDeath cannot be "
131*38e8c45fSAndroid Build Coastguard Worker               "implemented. serviceName: %s",
132*38e8c45fSAndroid Build Coastguard Worker               serviceName.c_str());
133*38e8c45fSAndroid Build Coastguard Worker         return false;
134*38e8c45fSAndroid Build Coastguard Worker     }
135*38e8c45fSAndroid Build Coastguard Worker     if (kRemoveStaticList) return true;
136*38e8c45fSAndroid Build Coastguard Worker     for (const char* name : kStaticCachableList) {
137*38e8c45fSAndroid Build Coastguard Worker         if (name == serviceName) {
138*38e8c45fSAndroid Build Coastguard Worker             return true;
139*38e8c45fSAndroid Build Coastguard Worker         }
140*38e8c45fSAndroid Build Coastguard Worker     }
141*38e8c45fSAndroid Build Coastguard Worker     return false;
142*38e8c45fSAndroid Build Coastguard Worker }
143*38e8c45fSAndroid Build Coastguard Worker 
updateCache(const std::string & serviceName,const os::Service & service)144*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::updateCache(const std::string& serviceName,
145*38e8c45fSAndroid Build Coastguard Worker                                                  const os::Service& service) {
146*38e8c45fSAndroid Build Coastguard Worker     if (!kUseCache) {
147*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
148*38e8c45fSAndroid Build Coastguard Worker     }
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker     if (service.getTag() == os::Service::Tag::serviceWithMetadata) {
151*38e8c45fSAndroid Build Coastguard Worker         auto serviceWithMetadata = service.get<os::Service::Tag::serviceWithMetadata>();
152*38e8c45fSAndroid Build Coastguard Worker         return updateCache(serviceName, serviceWithMetadata.service,
153*38e8c45fSAndroid Build Coastguard Worker                            serviceWithMetadata.isLazyService);
154*38e8c45fSAndroid Build Coastguard Worker     }
155*38e8c45fSAndroid Build Coastguard Worker     return Status::ok();
156*38e8c45fSAndroid Build Coastguard Worker }
157*38e8c45fSAndroid Build Coastguard Worker 
updateCache(const std::string & serviceName,const sp<IBinder> & binder,bool isServiceLazy)158*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::updateCache(const std::string& serviceName,
159*38e8c45fSAndroid Build Coastguard Worker                                                  const sp<IBinder>& binder, bool isServiceLazy) {
160*38e8c45fSAndroid Build Coastguard Worker     std::string traceStr;
161*38e8c45fSAndroid Build Coastguard Worker     // Don't cache if service is lazy
162*38e8c45fSAndroid Build Coastguard Worker     if (kRemoveStaticList && isServiceLazy) {
163*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
164*38e8c45fSAndroid Build Coastguard Worker     }
165*38e8c45fSAndroid Build Coastguard Worker     if (atrace_is_tag_enabled(ATRACE_TAG_AIDL)) {
166*38e8c45fSAndroid Build Coastguard Worker         traceStr = "BinderCacheWithInvalidation::updateCache : " + serviceName;
167*38e8c45fSAndroid Build Coastguard Worker     }
168*38e8c45fSAndroid Build Coastguard Worker     binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL, traceStr.c_str());
169*38e8c45fSAndroid Build Coastguard Worker     if (!binder) {
170*38e8c45fSAndroid Build Coastguard Worker         binder::ScopedTrace
171*38e8c45fSAndroid Build Coastguard Worker                 aidlTrace(ATRACE_TAG_AIDL,
172*38e8c45fSAndroid Build Coastguard Worker                           "BinderCacheWithInvalidation::updateCache failed: binder_null");
173*38e8c45fSAndroid Build Coastguard Worker     } else if (!binder->isBinderAlive()) {
174*38e8c45fSAndroid Build Coastguard Worker         binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL,
175*38e8c45fSAndroid Build Coastguard Worker                                       "BinderCacheWithInvalidation::updateCache failed: "
176*38e8c45fSAndroid Build Coastguard Worker                                       "isBinderAlive_false");
177*38e8c45fSAndroid Build Coastguard Worker     }
178*38e8c45fSAndroid Build Coastguard Worker     // If we reach here with kRemoveStaticList=true then we know service isn't lazy
179*38e8c45fSAndroid Build Coastguard Worker     else if (mCacheForGetService->isClientSideCachingEnabled(serviceName)) {
180*38e8c45fSAndroid Build Coastguard Worker         binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL,
181*38e8c45fSAndroid Build Coastguard Worker                                       "BinderCacheWithInvalidation::updateCache successful");
182*38e8c45fSAndroid Build Coastguard Worker         return mCacheForGetService->setItem(serviceName, binder);
183*38e8c45fSAndroid Build Coastguard Worker     } else {
184*38e8c45fSAndroid Build Coastguard Worker         binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL,
185*38e8c45fSAndroid Build Coastguard Worker                                       "BinderCacheWithInvalidation::updateCache failed: "
186*38e8c45fSAndroid Build Coastguard Worker                                       "caching_not_enabled");
187*38e8c45fSAndroid Build Coastguard Worker     }
188*38e8c45fSAndroid Build Coastguard Worker     return Status::ok();
189*38e8c45fSAndroid Build Coastguard Worker }
190*38e8c45fSAndroid Build Coastguard Worker 
returnIfCached(const std::string & serviceName,os::Service * _out)191*38e8c45fSAndroid Build Coastguard Worker bool BackendUnifiedServiceManager::returnIfCached(const std::string& serviceName,
192*38e8c45fSAndroid Build Coastguard Worker                                                   os::Service* _out) {
193*38e8c45fSAndroid Build Coastguard Worker     if (!kUseCache) {
194*38e8c45fSAndroid Build Coastguard Worker         return false;
195*38e8c45fSAndroid Build Coastguard Worker     }
196*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> item = mCacheForGetService->getItem(serviceName);
197*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/363177618): Enable caching for binders which are always null.
198*38e8c45fSAndroid Build Coastguard Worker     if (item != nullptr && item->isBinderAlive()) {
199*38e8c45fSAndroid Build Coastguard Worker         *_out = createServiceWithMetadata(item, false);
200*38e8c45fSAndroid Build Coastguard Worker         return true;
201*38e8c45fSAndroid Build Coastguard Worker     }
202*38e8c45fSAndroid Build Coastguard Worker     return false;
203*38e8c45fSAndroid Build Coastguard Worker }
204*38e8c45fSAndroid Build Coastguard Worker 
BackendUnifiedServiceManager(const sp<AidlServiceManager> & impl)205*38e8c45fSAndroid Build Coastguard Worker BackendUnifiedServiceManager::BackendUnifiedServiceManager(const sp<AidlServiceManager>& impl)
206*38e8c45fSAndroid Build Coastguard Worker       : mTheRealServiceManager(impl) {
207*38e8c45fSAndroid Build Coastguard Worker     mCacheForGetService = std::make_shared<BinderCacheWithInvalidation>();
208*38e8c45fSAndroid Build Coastguard Worker }
209*38e8c45fSAndroid Build Coastguard Worker 
getService(const::std::string & name,sp<IBinder> * _aidl_return)210*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::getService(const ::std::string& name,
211*38e8c45fSAndroid Build Coastguard Worker                                                 sp<IBinder>* _aidl_return) {
212*38e8c45fSAndroid Build Coastguard Worker     os::Service service;
213*38e8c45fSAndroid Build Coastguard Worker     Status status = getService2(name, &service);
214*38e8c45fSAndroid Build Coastguard Worker     *_aidl_return = service.get<os::Service::Tag::serviceWithMetadata>().service;
215*38e8c45fSAndroid Build Coastguard Worker     return status;
216*38e8c45fSAndroid Build Coastguard Worker }
217*38e8c45fSAndroid Build Coastguard Worker 
getService2(const::std::string & name,os::Service * _out)218*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::getService2(const ::std::string& name, os::Service* _out) {
219*38e8c45fSAndroid Build Coastguard Worker     if (returnIfCached(name, _out)) {
220*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
221*38e8c45fSAndroid Build Coastguard Worker     }
222*38e8c45fSAndroid Build Coastguard Worker     os::Service service;
223*38e8c45fSAndroid Build Coastguard Worker     Status status = mTheRealServiceManager->getService2(name, &service);
224*38e8c45fSAndroid Build Coastguard Worker 
225*38e8c45fSAndroid Build Coastguard Worker     if (status.isOk()) {
226*38e8c45fSAndroid Build Coastguard Worker         status = toBinderService(name, service, _out);
227*38e8c45fSAndroid Build Coastguard Worker         if (status.isOk()) {
228*38e8c45fSAndroid Build Coastguard Worker             return updateCache(name, service);
229*38e8c45fSAndroid Build Coastguard Worker         }
230*38e8c45fSAndroid Build Coastguard Worker     }
231*38e8c45fSAndroid Build Coastguard Worker     return status;
232*38e8c45fSAndroid Build Coastguard Worker }
233*38e8c45fSAndroid Build Coastguard Worker 
checkService(const::std::string & name,os::Service * _out)234*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::checkService(const ::std::string& name, os::Service* _out) {
235*38e8c45fSAndroid Build Coastguard Worker     os::Service service;
236*38e8c45fSAndroid Build Coastguard Worker     if (returnIfCached(name, _out)) {
237*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
238*38e8c45fSAndroid Build Coastguard Worker     }
239*38e8c45fSAndroid Build Coastguard Worker 
240*38e8c45fSAndroid Build Coastguard Worker     Status status = mTheRealServiceManager->checkService(name, &service);
241*38e8c45fSAndroid Build Coastguard Worker     if (status.isOk()) {
242*38e8c45fSAndroid Build Coastguard Worker         status = toBinderService(name, service, _out);
243*38e8c45fSAndroid Build Coastguard Worker         if (status.isOk()) {
244*38e8c45fSAndroid Build Coastguard Worker             return updateCache(name, service);
245*38e8c45fSAndroid Build Coastguard Worker         }
246*38e8c45fSAndroid Build Coastguard Worker     }
247*38e8c45fSAndroid Build Coastguard Worker     return status;
248*38e8c45fSAndroid Build Coastguard Worker }
249*38e8c45fSAndroid Build Coastguard Worker 
toBinderService(const::std::string & name,const os::Service & in,os::Service * _out)250*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::toBinderService(const ::std::string& name,
251*38e8c45fSAndroid Build Coastguard Worker                                                      const os::Service& in, os::Service* _out) {
252*38e8c45fSAndroid Build Coastguard Worker     switch (in.getTag()) {
253*38e8c45fSAndroid Build Coastguard Worker         case os::Service::Tag::serviceWithMetadata: {
254*38e8c45fSAndroid Build Coastguard Worker             auto serviceWithMetadata = in.get<os::Service::Tag::serviceWithMetadata>();
255*38e8c45fSAndroid Build Coastguard Worker             if (serviceWithMetadata.service == nullptr) {
256*38e8c45fSAndroid Build Coastguard Worker                 // failed to find a service. Check to see if we have any local
257*38e8c45fSAndroid Build Coastguard Worker                 // injected Accessors for this service.
258*38e8c45fSAndroid Build Coastguard Worker                 os::Service accessor;
259*38e8c45fSAndroid Build Coastguard Worker                 Status status = getInjectedAccessor(name, &accessor);
260*38e8c45fSAndroid Build Coastguard Worker                 if (!status.isOk()) {
261*38e8c45fSAndroid Build Coastguard Worker                     *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(
262*38e8c45fSAndroid Build Coastguard Worker                             createServiceWithMetadata(nullptr, false));
263*38e8c45fSAndroid Build Coastguard Worker                     return status;
264*38e8c45fSAndroid Build Coastguard Worker                 }
265*38e8c45fSAndroid Build Coastguard Worker                 if (accessor.getTag() == os::Service::Tag::accessor &&
266*38e8c45fSAndroid Build Coastguard Worker                     accessor.get<os::Service::Tag::accessor>() != nullptr) {
267*38e8c45fSAndroid Build Coastguard Worker                     ALOGI("Found local injected service for %s, will attempt to create connection",
268*38e8c45fSAndroid Build Coastguard Worker                           name.c_str());
269*38e8c45fSAndroid Build Coastguard Worker                     // Call this again using the accessor Service to get the real
270*38e8c45fSAndroid Build Coastguard Worker                     // service's binder into _out
271*38e8c45fSAndroid Build Coastguard Worker                     return toBinderService(name, accessor, _out);
272*38e8c45fSAndroid Build Coastguard Worker                 }
273*38e8c45fSAndroid Build Coastguard Worker             }
274*38e8c45fSAndroid Build Coastguard Worker 
275*38e8c45fSAndroid Build Coastguard Worker             *_out = in;
276*38e8c45fSAndroid Build Coastguard Worker             return Status::ok();
277*38e8c45fSAndroid Build Coastguard Worker         }
278*38e8c45fSAndroid Build Coastguard Worker         case os::Service::Tag::accessor: {
279*38e8c45fSAndroid Build Coastguard Worker             sp<IBinder> accessorBinder = in.get<os::Service::Tag::accessor>();
280*38e8c45fSAndroid Build Coastguard Worker             sp<IAccessor> accessor = interface_cast<IAccessor>(accessorBinder);
281*38e8c45fSAndroid Build Coastguard Worker             if (accessor == nullptr) {
282*38e8c45fSAndroid Build Coastguard Worker                 ALOGE("Service#accessor doesn't have accessor. VM is maybe starting...");
283*38e8c45fSAndroid Build Coastguard Worker                 *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(
284*38e8c45fSAndroid Build Coastguard Worker                         createServiceWithMetadata(nullptr, false));
285*38e8c45fSAndroid Build Coastguard Worker                 return Status::ok();
286*38e8c45fSAndroid Build Coastguard Worker             }
287*38e8c45fSAndroid Build Coastguard Worker             auto request = [=] {
288*38e8c45fSAndroid Build Coastguard Worker                 os::ParcelFileDescriptor fd;
289*38e8c45fSAndroid Build Coastguard Worker                 Status ret = accessor->addConnection(&fd);
290*38e8c45fSAndroid Build Coastguard Worker                 if (ret.isOk()) {
291*38e8c45fSAndroid Build Coastguard Worker                     return base::unique_fd(fd.release());
292*38e8c45fSAndroid Build Coastguard Worker                 } else {
293*38e8c45fSAndroid Build Coastguard Worker                     ALOGE("Failed to connect to RpcSession: %s", ret.toString8().c_str());
294*38e8c45fSAndroid Build Coastguard Worker                     return base::unique_fd(-1);
295*38e8c45fSAndroid Build Coastguard Worker                 }
296*38e8c45fSAndroid Build Coastguard Worker             };
297*38e8c45fSAndroid Build Coastguard Worker             auto session = RpcSession::make();
298*38e8c45fSAndroid Build Coastguard Worker             status_t status = session->setupPreconnectedClient(base::unique_fd{}, request);
299*38e8c45fSAndroid Build Coastguard Worker             if (status != OK) {
300*38e8c45fSAndroid Build Coastguard Worker                 ALOGE("Failed to set up preconnected binder RPC client: %s",
301*38e8c45fSAndroid Build Coastguard Worker                       statusToString(status).c_str());
302*38e8c45fSAndroid Build Coastguard Worker                 return Status::fromStatusT(status);
303*38e8c45fSAndroid Build Coastguard Worker             }
304*38e8c45fSAndroid Build Coastguard Worker             session->setSessionSpecificRoot(accessorBinder);
305*38e8c45fSAndroid Build Coastguard Worker             *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(
306*38e8c45fSAndroid Build Coastguard Worker                     createServiceWithMetadata(session->getRootObject(), false));
307*38e8c45fSAndroid Build Coastguard Worker             return Status::ok();
308*38e8c45fSAndroid Build Coastguard Worker         }
309*38e8c45fSAndroid Build Coastguard Worker         default: {
310*38e8c45fSAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL("Unknown service type: %d", in.getTag());
311*38e8c45fSAndroid Build Coastguard Worker         }
312*38e8c45fSAndroid Build Coastguard Worker     }
313*38e8c45fSAndroid Build Coastguard Worker }
314*38e8c45fSAndroid Build Coastguard Worker 
addService(const::std::string & name,const sp<IBinder> & service,bool allowIsolated,int32_t dumpPriority)315*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::addService(const ::std::string& name,
316*38e8c45fSAndroid Build Coastguard Worker                                                 const sp<IBinder>& service, bool allowIsolated,
317*38e8c45fSAndroid Build Coastguard Worker                                                 int32_t dumpPriority) {
318*38e8c45fSAndroid Build Coastguard Worker     Status status = mTheRealServiceManager->addService(name, service, allowIsolated, dumpPriority);
319*38e8c45fSAndroid Build Coastguard Worker     // mEnableAddServiceCache is true by default.
320*38e8c45fSAndroid Build Coastguard Worker     if (kUseCacheInAddService && mEnableAddServiceCache && status.isOk()) {
321*38e8c45fSAndroid Build Coastguard Worker         return updateCache(name, service,
322*38e8c45fSAndroid Build Coastguard Worker                            dumpPriority & android::os::IServiceManager::FLAG_IS_LAZY_SERVICE);
323*38e8c45fSAndroid Build Coastguard Worker     }
324*38e8c45fSAndroid Build Coastguard Worker     return status;
325*38e8c45fSAndroid Build Coastguard Worker }
listServices(int32_t dumpPriority,::std::vector<::std::string> * _aidl_return)326*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::listServices(int32_t dumpPriority,
327*38e8c45fSAndroid Build Coastguard Worker                                                   ::std::vector<::std::string>* _aidl_return) {
328*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->listServices(dumpPriority, _aidl_return);
329*38e8c45fSAndroid Build Coastguard Worker }
registerForNotifications(const::std::string & name,const sp<os::IServiceCallback> & callback)330*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::registerForNotifications(
331*38e8c45fSAndroid Build Coastguard Worker         const ::std::string& name, const sp<os::IServiceCallback>& callback) {
332*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->registerForNotifications(name, callback);
333*38e8c45fSAndroid Build Coastguard Worker }
unregisterForNotifications(const::std::string & name,const sp<os::IServiceCallback> & callback)334*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::unregisterForNotifications(
335*38e8c45fSAndroid Build Coastguard Worker         const ::std::string& name, const sp<os::IServiceCallback>& callback) {
336*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->unregisterForNotifications(name, callback);
337*38e8c45fSAndroid Build Coastguard Worker }
isDeclared(const::std::string & name,bool * _aidl_return)338*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::isDeclared(const ::std::string& name, bool* _aidl_return) {
339*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->isDeclared(name, _aidl_return);
340*38e8c45fSAndroid Build Coastguard Worker }
getDeclaredInstances(const::std::string & iface,::std::vector<::std::string> * _aidl_return)341*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::getDeclaredInstances(
342*38e8c45fSAndroid Build Coastguard Worker         const ::std::string& iface, ::std::vector<::std::string>* _aidl_return) {
343*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->getDeclaredInstances(iface, _aidl_return);
344*38e8c45fSAndroid Build Coastguard Worker }
updatableViaApex(const::std::string & name,::std::optional<::std::string> * _aidl_return)345*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::updatableViaApex(
346*38e8c45fSAndroid Build Coastguard Worker         const ::std::string& name, ::std::optional<::std::string>* _aidl_return) {
347*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->updatableViaApex(name, _aidl_return);
348*38e8c45fSAndroid Build Coastguard Worker }
getUpdatableNames(const::std::string & apexName,::std::vector<::std::string> * _aidl_return)349*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::getUpdatableNames(const ::std::string& apexName,
350*38e8c45fSAndroid Build Coastguard Worker                                                        ::std::vector<::std::string>* _aidl_return) {
351*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->getUpdatableNames(apexName, _aidl_return);
352*38e8c45fSAndroid Build Coastguard Worker }
getConnectionInfo(const::std::string & name,::std::optional<os::ConnectionInfo> * _aidl_return)353*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::getConnectionInfo(
354*38e8c45fSAndroid Build Coastguard Worker         const ::std::string& name, ::std::optional<os::ConnectionInfo>* _aidl_return) {
355*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->getConnectionInfo(name, _aidl_return);
356*38e8c45fSAndroid Build Coastguard Worker }
registerClientCallback(const::std::string & name,const sp<IBinder> & service,const sp<os::IClientCallback> & callback)357*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::registerClientCallback(
358*38e8c45fSAndroid Build Coastguard Worker         const ::std::string& name, const sp<IBinder>& service,
359*38e8c45fSAndroid Build Coastguard Worker         const sp<os::IClientCallback>& callback) {
360*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->registerClientCallback(name, service, callback);
361*38e8c45fSAndroid Build Coastguard Worker }
tryUnregisterService(const::std::string & name,const sp<IBinder> & service)362*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::tryUnregisterService(const ::std::string& name,
363*38e8c45fSAndroid Build Coastguard Worker                                                           const sp<IBinder>& service) {
364*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->tryUnregisterService(name, service);
365*38e8c45fSAndroid Build Coastguard Worker }
getServiceDebugInfo(::std::vector<os::ServiceDebugInfo> * _aidl_return)366*38e8c45fSAndroid Build Coastguard Worker Status BackendUnifiedServiceManager::getServiceDebugInfo(
367*38e8c45fSAndroid Build Coastguard Worker         ::std::vector<os::ServiceDebugInfo>* _aidl_return) {
368*38e8c45fSAndroid Build Coastguard Worker     return mTheRealServiceManager->getServiceDebugInfo(_aidl_return);
369*38e8c45fSAndroid Build Coastguard Worker }
370*38e8c45fSAndroid Build Coastguard Worker 
371*38e8c45fSAndroid Build Coastguard Worker [[clang::no_destroy]] static std::once_flag gUSmOnce;
372*38e8c45fSAndroid Build Coastguard Worker [[clang::no_destroy]] static sp<BackendUnifiedServiceManager> gUnifiedServiceManager;
373*38e8c45fSAndroid Build Coastguard Worker 
getBackendUnifiedServiceManager()374*38e8c45fSAndroid Build Coastguard Worker sp<BackendUnifiedServiceManager> getBackendUnifiedServiceManager() {
375*38e8c45fSAndroid Build Coastguard Worker     std::call_once(gUSmOnce, []() {
376*38e8c45fSAndroid Build Coastguard Worker #if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
377*38e8c45fSAndroid Build Coastguard Worker         /* wait for service manager */ {
378*38e8c45fSAndroid Build Coastguard Worker             using std::literals::chrono_literals::operator""s;
379*38e8c45fSAndroid Build Coastguard Worker             using android::base::WaitForProperty;
380*38e8c45fSAndroid Build Coastguard Worker             while (!WaitForProperty("servicemanager.ready", "true", 1s)) {
381*38e8c45fSAndroid Build Coastguard Worker                 ALOGE("Waited for servicemanager.ready for a second, waiting another...");
382*38e8c45fSAndroid Build Coastguard Worker             }
383*38e8c45fSAndroid Build Coastguard Worker         }
384*38e8c45fSAndroid Build Coastguard Worker #endif
385*38e8c45fSAndroid Build Coastguard Worker 
386*38e8c45fSAndroid Build Coastguard Worker         sp<AidlServiceManager> sm = nullptr;
387*38e8c45fSAndroid Build Coastguard Worker         while (sm == nullptr) {
388*38e8c45fSAndroid Build Coastguard Worker             sm = interface_cast<AidlServiceManager>(
389*38e8c45fSAndroid Build Coastguard Worker                     ProcessState::self()->getContextObject(nullptr));
390*38e8c45fSAndroid Build Coastguard Worker             if (sm == nullptr) {
391*38e8c45fSAndroid Build Coastguard Worker                 ALOGE("Waiting 1s on context object on %s.",
392*38e8c45fSAndroid Build Coastguard Worker                       ProcessState::self()->getDriverName().c_str());
393*38e8c45fSAndroid Build Coastguard Worker                 sleep(1);
394*38e8c45fSAndroid Build Coastguard Worker             }
395*38e8c45fSAndroid Build Coastguard Worker         }
396*38e8c45fSAndroid Build Coastguard Worker 
397*38e8c45fSAndroid Build Coastguard Worker         gUnifiedServiceManager = sp<BackendUnifiedServiceManager>::make(sm);
398*38e8c45fSAndroid Build Coastguard Worker     });
399*38e8c45fSAndroid Build Coastguard Worker 
400*38e8c45fSAndroid Build Coastguard Worker     return gUnifiedServiceManager;
401*38e8c45fSAndroid Build Coastguard Worker }
402*38e8c45fSAndroid Build Coastguard Worker 
403*38e8c45fSAndroid Build Coastguard Worker } // namespace android
404