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