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