blob: 7c0319aead10b00ce11d243d20426bccdfc0ff66 [file] [log] [blame]
Parth Sane56a04712024-04-22 14:21:07 +00001/*
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
Devin Moorea3867c72024-10-23 19:29:49 +000018#include <android-base/strings.h>
Alice Wang8578f132024-05-03 09:01:56 +000019#include <android/os/IAccessor.h>
Parth Sane5e1b7e12024-11-29 10:40:41 +000020#include <android/os/IServiceManager.h>
Alice Wang8578f132024-05-03 09:01:56 +000021#include <binder/RpcSession.h>
22
Tomasz Wasilczykfe25f122024-06-26 12:45:57 -070023#if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
24#include <android-base/properties.h>
25#endif
26
Parth Sane56a04712024-04-22 14:21:07 +000027namespace android {
28
Parth Saneb6ed0eb2024-06-25 14:38:42 +000029#ifdef LIBBINDER_CLIENT_CACHE
30constexpr bool kUseCache = true;
31#else
32constexpr bool kUseCache = false;
33#endif
34
Parth Sanedc207542024-11-14 11:49:08 +000035#ifdef LIBBINDER_ADDSERVICE_CACHE
36constexpr bool kUseCacheInAddService = true;
37#else
38constexpr bool kUseCacheInAddService = false;
39#endif
40
Parth Sane5e1b7e12024-11-29 10:40:41 +000041#ifdef LIBBINDER_REMOVE_CACHE_STATIC_LIST
42constexpr bool kRemoveStaticList = true;
43#else
44constexpr bool kRemoveStaticList = false;
45#endif
46
Parth Sane56a04712024-04-22 14:21:07 +000047using AidlServiceManager = android::os::IServiceManager;
Devin Moore678984f2024-10-18 22:43:22 +000048using android::os::IAccessor;
49using binder::Status;
Parth Sane56a04712024-04-22 14:21:07 +000050
Devin Moore3c931112024-10-23 17:45:04 +000051static const char* kUnsupportedOpNoServiceManager =
52 "Unsupported operation without a kernel binder servicemanager process";
53
Parth Saneb6ed0eb2024-06-25 14:38:42 +000054static const char* kStaticCachableList[] = {
Parth Saneac492702024-09-18 15:54:16 +000055 // go/keep-sorted start
56 "accessibility",
57 "account",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000058 "activity",
Parth Saneac492702024-09-18 15:54:16 +000059 "alarm",
Parth Sane0105ea52024-10-11 11:41:16 +000060 "android.frameworks.stats.IStats/default",
Parth Saneac492702024-09-18 15:54:16 +000061 "android.system.keystore2.IKeystoreService/default",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000062 "appops",
63 "audio",
Parth Sane0105ea52024-10-11 11:41:16 +000064 "autofill",
65 "batteryproperties",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000066 "batterystats",
Parth Sane0105ea52024-10-11 11:41:16 +000067 "biometic",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000068 "carrier_config",
69 "connectivity",
Parth Saneac492702024-09-18 15:54:16 +000070 "content",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000071 "content_capture",
72 "device_policy",
73 "display",
74 "dropbox",
75 "econtroller",
Parth Saneac492702024-09-18 15:54:16 +000076 "graphicsstats",
77 "input",
78 "input_method",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000079 "isub",
Parth Saneac492702024-09-18 15:54:16 +000080 "jobscheduler",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000081 "legacy_permission",
82 "location",
Parth Sane0105ea52024-10-11 11:41:16 +000083 "lock_settings",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000084 "media.extractor",
85 "media.metrics",
86 "media.player",
87 "media.resource_manager",
Parth Saneac492702024-09-18 15:54:16 +000088 "media_resource_monitor",
89 "mount",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000090 "netd_listener",
91 "netstats",
92 "network_management",
93 "nfc",
Parth Saneac492702024-09-18 15:54:16 +000094 "notification",
95 "package",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000096 "package_native",
97 "performance_hint",
98 "permission",
Parth Saneb6ed0eb2024-06-25 14:38:42 +000099 "permission_checker",
Parth Saneac492702024-09-18 15:54:16 +0000100 "permissionmgr",
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000101 "phone",
102 "platform_compat",
103 "power",
Parth Sane0105ea52024-10-11 11:41:16 +0000104 "processinfo",
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000105 "role",
Parth Sane0105ea52024-10-11 11:41:16 +0000106 "sensitive_content_protection_service",
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000107 "sensorservice",
108 "statscompanion",
109 "telephony.registry",
110 "thermalservice",
111 "time_detector",
Parth Sane0105ea52024-10-11 11:41:16 +0000112 "tracing.proxy",
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000113 "trust",
114 "uimode",
Parth Saneac492702024-09-18 15:54:16 +0000115 "user",
Parth Sane0105ea52024-10-11 11:41:16 +0000116 "vibrator",
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000117 "virtualdevice",
118 "virtualdevice_native",
119 "webviewupdate",
Parth Saneac492702024-09-18 15:54:16 +0000120 "window",
121 // go/keep-sorted end
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000122};
123
Parth Sane5e1b7e12024-11-29 10:40:41 +0000124os::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
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000131bool BinderCacheWithInvalidation::isClientSideCachingEnabled(const std::string& serviceName) {
Devin Moore74bc5892024-10-23 17:12:19 +0000132 sp<ProcessState> self = ProcessState::selfOrNull();
133 if (!self || self->getThreadPoolMaxTotalThreadCount() <= 0) {
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000134 ALOGW("Thread Pool max thread count is 0. Cannot cache binder as linkToDeath cannot be "
135 "implemented. serviceName: %s",
136 serviceName.c_str());
137 return false;
138 }
Parth Saneb109db32024-12-05 19:43:40 +0000139 if (kRemoveStaticList) return true;
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000140 for (const char* name : kStaticCachableList) {
141 if (name == serviceName) {
142 return true;
143 }
144 }
145 return false;
146}
147
Devin Moore678984f2024-10-18 22:43:22 +0000148Status BackendUnifiedServiceManager::updateCache(const std::string& serviceName,
149 const os::Service& service) {
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000150 if (!kUseCache) {
Devin Moore678984f2024-10-18 22:43:22 +0000151 return Status::ok();
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000152 }
Parth Sanedc207542024-11-14 11:49:08 +0000153
Parth Sane5e1b7e12024-11-29 10:40:41 +0000154 if (service.getTag() == os::Service::Tag::serviceWithMetadata) {
155 auto serviceWithMetadata = service.get<os::Service::Tag::serviceWithMetadata>();
156 return updateCache(serviceName, serviceWithMetadata.service,
157 serviceWithMetadata.isLazyService);
Parth Sanedc207542024-11-14 11:49:08 +0000158 }
159 return Status::ok();
160}
161
162Status BackendUnifiedServiceManager::updateCache(const std::string& serviceName,
Parth Sane5e1b7e12024-11-29 10:40:41 +0000163 const sp<IBinder>& binder, bool isServiceLazy) {
Parth Sanea6676ba2024-10-04 14:14:07 +0000164 std::string traceStr;
Parth Sane5e1b7e12024-11-29 10:40:41 +0000165 // Don't cache if service is lazy
166 if (kRemoveStaticList && isServiceLazy) {
167 return Status::ok();
168 }
Parth Sanea6676ba2024-10-04 14:14:07 +0000169 if (atrace_is_tag_enabled(ATRACE_TAG_AIDL)) {
170 traceStr = "BinderCacheWithInvalidation::updateCache : " + serviceName;
171 }
172 binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL, traceStr.c_str());
Parth Sanedc207542024-11-14 11:49:08 +0000173 if (!binder) {
174 binder::ScopedTrace
175 aidlTrace(ATRACE_TAG_AIDL,
176 "BinderCacheWithInvalidation::updateCache failed: binder_null");
177 } else if (!binder->isBinderAlive()) {
178 binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL,
179 "BinderCacheWithInvalidation::updateCache failed: "
180 "isBinderAlive_false");
Parth Sane5e1b7e12024-11-29 10:40:41 +0000181 }
182 // If we reach here with kRemoveStaticList=true then we know service isn't lazy
Parth Saneb109db32024-12-05 19:43:40 +0000183 else if (mCacheForGetService->isClientSideCachingEnabled(serviceName)) {
Parth Sanedc207542024-11-14 11:49:08 +0000184 binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL,
185 "BinderCacheWithInvalidation::updateCache successful");
186 return mCacheForGetService->setItem(serviceName, binder);
187 } else {
188 binder::ScopedTrace aidlTrace(ATRACE_TAG_AIDL,
189 "BinderCacheWithInvalidation::updateCache failed: "
190 "caching_not_enabled");
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000191 }
Devin Moore678984f2024-10-18 22:43:22 +0000192 return Status::ok();
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000193}
194
195bool BackendUnifiedServiceManager::returnIfCached(const std::string& serviceName,
196 os::Service* _out) {
197 if (!kUseCache) {
198 return false;
199 }
200 sp<IBinder> item = mCacheForGetService->getItem(serviceName);
201 // TODO(b/363177618): Enable caching for binders which are always null.
202 if (item != nullptr && item->isBinderAlive()) {
Parth Sane5e1b7e12024-11-29 10:40:41 +0000203 *_out = createServiceWithMetadata(item, false);
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000204 return true;
205 }
206 return false;
207}
208
Parth Sane56a04712024-04-22 14:21:07 +0000209BackendUnifiedServiceManager::BackendUnifiedServiceManager(const sp<AidlServiceManager>& impl)
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000210 : mTheRealServiceManager(impl) {
211 mCacheForGetService = std::make_shared<BinderCacheWithInvalidation>();
212}
Parth Sane56a04712024-04-22 14:21:07 +0000213
Devin Moore678984f2024-10-18 22:43:22 +0000214Status BackendUnifiedServiceManager::getService(const ::std::string& name,
215 sp<IBinder>* _aidl_return) {
Alice Wang8578f132024-05-03 09:01:56 +0000216 os::Service service;
Devin Moore678984f2024-10-18 22:43:22 +0000217 Status status = getService2(name, &service);
Alice Wang0aa07a12025-01-08 08:59:49 +0000218 if (status.isOk()) {
219 *_aidl_return = service.get<os::Service::Tag::serviceWithMetadata>().service;
220 }
Alice Wang11da1502024-07-25 12:03:22 +0000221 return status;
222}
223
Devin Moore678984f2024-10-18 22:43:22 +0000224Status BackendUnifiedServiceManager::getService2(const ::std::string& name, os::Service* _out) {
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000225 if (returnIfCached(name, _out)) {
Devin Moore678984f2024-10-18 22:43:22 +0000226 return Status::ok();
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000227 }
Alice Wang11da1502024-07-25 12:03:22 +0000228 os::Service service;
Devin Moore3c931112024-10-23 17:45:04 +0000229 Status status = Status::ok();
230 if (mTheRealServiceManager) {
231 status = mTheRealServiceManager->getService2(name, &service);
232 }
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000233
Devin Moore18f63752024-08-08 21:01:24 +0000234 if (status.isOk()) {
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000235 status = toBinderService(name, service, _out);
236 if (status.isOk()) {
237 return updateCache(name, service);
238 }
Devin Moore18f63752024-08-08 21:01:24 +0000239 }
Alice Wang8578f132024-05-03 09:01:56 +0000240 return status;
Parth Sane56a04712024-04-22 14:21:07 +0000241}
Alice Wang8578f132024-05-03 09:01:56 +0000242
Alice Wang2b613442025-01-02 11:53:05 +0000243Status BackendUnifiedServiceManager::checkService(const ::std::string& name,
244 sp<IBinder>* _aidl_return) {
245 os::Service service;
246 Status status = checkService2(name, &service);
247 if (status.isOk()) {
248 *_aidl_return = service.get<os::Service::Tag::serviceWithMetadata>().service;
249 }
250 return status;
251}
252
253Status BackendUnifiedServiceManager::checkService2(const ::std::string& name, os::Service* _out) {
Alice Wang8578f132024-05-03 09:01:56 +0000254 os::Service service;
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000255 if (returnIfCached(name, _out)) {
Devin Moore678984f2024-10-18 22:43:22 +0000256 return Status::ok();
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000257 }
258
Devin Moore3c931112024-10-23 17:45:04 +0000259 Status status = Status::ok();
260 if (mTheRealServiceManager) {
Alice Wang2b613442025-01-02 11:53:05 +0000261 status = mTheRealServiceManager->checkService2(name, &service);
Devin Moore3c931112024-10-23 17:45:04 +0000262 }
Devin Moore18f63752024-08-08 21:01:24 +0000263 if (status.isOk()) {
Parth Saneb6ed0eb2024-06-25 14:38:42 +0000264 status = toBinderService(name, service, _out);
265 if (status.isOk()) {
266 return updateCache(name, service);
267 }
Devin Moore18f63752024-08-08 21:01:24 +0000268 }
Alice Wang8578f132024-05-03 09:01:56 +0000269 return status;
Parth Sane56a04712024-04-22 14:21:07 +0000270}
Alice Wang8578f132024-05-03 09:01:56 +0000271
Devin Moore678984f2024-10-18 22:43:22 +0000272Status BackendUnifiedServiceManager::toBinderService(const ::std::string& name,
273 const os::Service& in, os::Service* _out) {
Alice Wang8578f132024-05-03 09:01:56 +0000274 switch (in.getTag()) {
Parth Sane5e1b7e12024-11-29 10:40:41 +0000275 case os::Service::Tag::serviceWithMetadata: {
276 auto serviceWithMetadata = in.get<os::Service::Tag::serviceWithMetadata>();
277 if (serviceWithMetadata.service == nullptr) {
Devin Moore18f63752024-08-08 21:01:24 +0000278 // failed to find a service. Check to see if we have any local
279 // injected Accessors for this service.
280 os::Service accessor;
Devin Moore678984f2024-10-18 22:43:22 +0000281 Status status = getInjectedAccessor(name, &accessor);
Devin Moore18f63752024-08-08 21:01:24 +0000282 if (!status.isOk()) {
Parth Sane5e1b7e12024-11-29 10:40:41 +0000283 *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(
284 createServiceWithMetadata(nullptr, false));
Devin Moore18f63752024-08-08 21:01:24 +0000285 return status;
286 }
287 if (accessor.getTag() == os::Service::Tag::accessor &&
288 accessor.get<os::Service::Tag::accessor>() != nullptr) {
289 ALOGI("Found local injected service for %s, will attempt to create connection",
290 name.c_str());
291 // Call this again using the accessor Service to get the real
292 // service's binder into _out
293 return toBinderService(name, accessor, _out);
294 }
295 }
296
Alice Wang8578f132024-05-03 09:01:56 +0000297 *_out = in;
Devin Moore678984f2024-10-18 22:43:22 +0000298 return Status::ok();
Alice Wang8578f132024-05-03 09:01:56 +0000299 }
300 case os::Service::Tag::accessor: {
301 sp<IBinder> accessorBinder = in.get<os::Service::Tag::accessor>();
302 sp<IAccessor> accessor = interface_cast<IAccessor>(accessorBinder);
303 if (accessor == nullptr) {
304 ALOGE("Service#accessor doesn't have accessor. VM is maybe starting...");
Parth Sane5e1b7e12024-11-29 10:40:41 +0000305 *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(
306 createServiceWithMetadata(nullptr, false));
Devin Moore678984f2024-10-18 22:43:22 +0000307 return Status::ok();
Alice Wang8578f132024-05-03 09:01:56 +0000308 }
309 auto request = [=] {
310 os::ParcelFileDescriptor fd;
Devin Moore678984f2024-10-18 22:43:22 +0000311 Status ret = accessor->addConnection(&fd);
Alice Wang8578f132024-05-03 09:01:56 +0000312 if (ret.isOk()) {
313 return base::unique_fd(fd.release());
314 } else {
315 ALOGE("Failed to connect to RpcSession: %s", ret.toString8().c_str());
316 return base::unique_fd(-1);
317 }
318 };
319 auto session = RpcSession::make();
Devin Moore18f63752024-08-08 21:01:24 +0000320 status_t status = session->setupPreconnectedClient(base::unique_fd{}, request);
321 if (status != OK) {
322 ALOGE("Failed to set up preconnected binder RPC client: %s",
323 statusToString(status).c_str());
Devin Moore678984f2024-10-18 22:43:22 +0000324 return Status::fromStatusT(status);
Devin Moore18f63752024-08-08 21:01:24 +0000325 }
Alice Wang8578f132024-05-03 09:01:56 +0000326 session->setSessionSpecificRoot(accessorBinder);
Parth Sane5e1b7e12024-11-29 10:40:41 +0000327 *_out = os::Service::make<os::Service::Tag::serviceWithMetadata>(
328 createServiceWithMetadata(session->getRootObject(), false));
Devin Moore678984f2024-10-18 22:43:22 +0000329 return Status::ok();
Alice Wang8578f132024-05-03 09:01:56 +0000330 }
331 default: {
332 LOG_ALWAYS_FATAL("Unknown service type: %d", in.getTag());
333 }
334 }
335}
336
Devin Moore678984f2024-10-18 22:43:22 +0000337Status BackendUnifiedServiceManager::addService(const ::std::string& name,
338 const sp<IBinder>& service, bool allowIsolated,
339 int32_t dumpPriority) {
Devin Moore3c931112024-10-23 17:45:04 +0000340 if (mTheRealServiceManager) {
341 Status status =
342 mTheRealServiceManager->addService(name, service, allowIsolated, dumpPriority);
343 // mEnableAddServiceCache is true by default.
344 if (kUseCacheInAddService && mEnableAddServiceCache && status.isOk()) {
345 return updateCache(name, service,
346 dumpPriority & android::os::IServiceManager::FLAG_IS_LAZY_SERVICE);
347 }
348 return status;
Parth Sanedc207542024-11-14 11:49:08 +0000349 }
Devin Moore3c931112024-10-23 17:45:04 +0000350 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
351 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000352}
Devin Moore678984f2024-10-18 22:43:22 +0000353Status BackendUnifiedServiceManager::listServices(int32_t dumpPriority,
354 ::std::vector<::std::string>* _aidl_return) {
Devin Moorea3867c72024-10-23 19:29:49 +0000355 Status status = Status::ok();
Devin Moore3c931112024-10-23 17:45:04 +0000356 if (mTheRealServiceManager) {
Devin Moorea3867c72024-10-23 19:29:49 +0000357 status = mTheRealServiceManager->listServices(dumpPriority, _aidl_return);
Devin Moore3c931112024-10-23 17:45:04 +0000358 }
Devin Moorea3867c72024-10-23 19:29:49 +0000359 if (!status.isOk()) return status;
360
361 appendInjectedAccessorServices(_aidl_return);
362
363 return status;
Parth Sane56a04712024-04-22 14:21:07 +0000364}
Devin Moore678984f2024-10-18 22:43:22 +0000365Status BackendUnifiedServiceManager::registerForNotifications(
Parth Sane56a04712024-04-22 14:21:07 +0000366 const ::std::string& name, const sp<os::IServiceCallback>& callback) {
Devin Moore3c931112024-10-23 17:45:04 +0000367 if (mTheRealServiceManager) {
368 return mTheRealServiceManager->registerForNotifications(name, callback);
369 }
370 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
371 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000372}
Devin Moore678984f2024-10-18 22:43:22 +0000373Status BackendUnifiedServiceManager::unregisterForNotifications(
Parth Sane56a04712024-04-22 14:21:07 +0000374 const ::std::string& name, const sp<os::IServiceCallback>& callback) {
Devin Moore3c931112024-10-23 17:45:04 +0000375 if (mTheRealServiceManager) {
376 return mTheRealServiceManager->unregisterForNotifications(name, callback);
377 }
378 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
379 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000380}
Devin Moore678984f2024-10-18 22:43:22 +0000381Status BackendUnifiedServiceManager::isDeclared(const ::std::string& name, bool* _aidl_return) {
Devin Moorea3867c72024-10-23 19:29:49 +0000382 Status status = Status::ok();
Devin Moore3c931112024-10-23 17:45:04 +0000383 if (mTheRealServiceManager) {
Devin Moorea3867c72024-10-23 19:29:49 +0000384 status = mTheRealServiceManager->isDeclared(name, _aidl_return);
Devin Moore3c931112024-10-23 17:45:04 +0000385 }
Devin Moorea3867c72024-10-23 19:29:49 +0000386 if (!status.isOk()) return status;
387
388 if (!*_aidl_return) {
389 forEachInjectedAccessorService([&](const std::string& instance) {
390 if (name == instance) {
391 *_aidl_return = true;
392 }
393 });
394 }
395
396 return status;
Parth Sane56a04712024-04-22 14:21:07 +0000397}
Devin Moore678984f2024-10-18 22:43:22 +0000398Status BackendUnifiedServiceManager::getDeclaredInstances(
Parth Sane56a04712024-04-22 14:21:07 +0000399 const ::std::string& iface, ::std::vector<::std::string>* _aidl_return) {
Devin Moorea3867c72024-10-23 19:29:49 +0000400 Status status = Status::ok();
Devin Moore3c931112024-10-23 17:45:04 +0000401 if (mTheRealServiceManager) {
Devin Moorea3867c72024-10-23 19:29:49 +0000402 status = mTheRealServiceManager->getDeclaredInstances(iface, _aidl_return);
Devin Moore3c931112024-10-23 17:45:04 +0000403 }
Devin Moorea3867c72024-10-23 19:29:49 +0000404 if (!status.isOk()) return status;
405
406 forEachInjectedAccessorService([&](const std::string& instance) {
407 // Declared instances have the format
408 // <interface>/instance like foo.bar.ISomething/instance
409 // If it does not have that format, consider the instance to be ""
410 std::string_view name(instance);
411 if (base::ConsumePrefix(&name, iface + "/")) {
412 _aidl_return->emplace_back(name);
413 } else if (iface == instance) {
414 _aidl_return->push_back("");
415 }
416 });
417
418 return status;
Parth Sane56a04712024-04-22 14:21:07 +0000419}
Devin Moore678984f2024-10-18 22:43:22 +0000420Status BackendUnifiedServiceManager::updatableViaApex(
Parth Sane56a04712024-04-22 14:21:07 +0000421 const ::std::string& name, ::std::optional<::std::string>* _aidl_return) {
Devin Moore3c931112024-10-23 17:45:04 +0000422 if (mTheRealServiceManager) {
423 return mTheRealServiceManager->updatableViaApex(name, _aidl_return);
424 }
425 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
426 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000427}
Devin Moore678984f2024-10-18 22:43:22 +0000428Status BackendUnifiedServiceManager::getUpdatableNames(const ::std::string& apexName,
429 ::std::vector<::std::string>* _aidl_return) {
Devin Moore3c931112024-10-23 17:45:04 +0000430 if (mTheRealServiceManager) {
431 return mTheRealServiceManager->getUpdatableNames(apexName, _aidl_return);
432 }
433 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
434 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000435}
Devin Moore678984f2024-10-18 22:43:22 +0000436Status BackendUnifiedServiceManager::getConnectionInfo(
Parth Sane56a04712024-04-22 14:21:07 +0000437 const ::std::string& name, ::std::optional<os::ConnectionInfo>* _aidl_return) {
Devin Moore3c931112024-10-23 17:45:04 +0000438 if (mTheRealServiceManager) {
439 return mTheRealServiceManager->getConnectionInfo(name, _aidl_return);
440 }
441 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
442 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000443}
Devin Moore678984f2024-10-18 22:43:22 +0000444Status BackendUnifiedServiceManager::registerClientCallback(
Parth Sane56a04712024-04-22 14:21:07 +0000445 const ::std::string& name, const sp<IBinder>& service,
446 const sp<os::IClientCallback>& callback) {
Devin Moore3c931112024-10-23 17:45:04 +0000447 if (mTheRealServiceManager) {
448 return mTheRealServiceManager->registerClientCallback(name, service, callback);
449 }
450 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
451 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000452}
Devin Moore678984f2024-10-18 22:43:22 +0000453Status BackendUnifiedServiceManager::tryUnregisterService(const ::std::string& name,
454 const sp<IBinder>& service) {
Devin Moore3c931112024-10-23 17:45:04 +0000455 if (mTheRealServiceManager) {
456 return mTheRealServiceManager->tryUnregisterService(name, service);
457 }
458 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
459 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000460}
Devin Moore678984f2024-10-18 22:43:22 +0000461Status BackendUnifiedServiceManager::getServiceDebugInfo(
Parth Sane56a04712024-04-22 14:21:07 +0000462 ::std::vector<os::ServiceDebugInfo>* _aidl_return) {
Devin Moore3c931112024-10-23 17:45:04 +0000463 if (mTheRealServiceManager) {
464 return mTheRealServiceManager->getServiceDebugInfo(_aidl_return);
465 }
466 return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION,
467 kUnsupportedOpNoServiceManager);
Parth Sane56a04712024-04-22 14:21:07 +0000468}
469
470[[clang::no_destroy]] static std::once_flag gUSmOnce;
471[[clang::no_destroy]] static sp<BackendUnifiedServiceManager> gUnifiedServiceManager;
472
Devin Moore3c931112024-10-23 17:45:04 +0000473static bool hasOutOfProcessServiceManager() {
474#ifndef BINDER_WITH_KERNEL_IPC
475 return false;
476#else
477#if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
478 return android::base::GetBoolProperty("servicemanager.installed", true);
479#else
480 return true;
481#endif
482#endif // BINDER_WITH_KERNEL_IPC
483}
484
Parth Sane56a04712024-04-22 14:21:07 +0000485sp<BackendUnifiedServiceManager> getBackendUnifiedServiceManager() {
486 std::call_once(gUSmOnce, []() {
487#if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
Devin Moore3c931112024-10-23 17:45:04 +0000488 /* wait for service manager */
489 if (hasOutOfProcessServiceManager()) {
Parth Sane56a04712024-04-22 14:21:07 +0000490 using std::literals::chrono_literals::operator""s;
491 using android::base::WaitForProperty;
492 while (!WaitForProperty("servicemanager.ready", "true", 1s)) {
493 ALOGE("Waited for servicemanager.ready for a second, waiting another...");
494 }
495 }
496#endif
497
498 sp<AidlServiceManager> sm = nullptr;
Devin Moore3c931112024-10-23 17:45:04 +0000499 while (hasOutOfProcessServiceManager() && sm == nullptr) {
Parth Sane56a04712024-04-22 14:21:07 +0000500 sm = interface_cast<AidlServiceManager>(
501 ProcessState::self()->getContextObject(nullptr));
502 if (sm == nullptr) {
503 ALOGE("Waiting 1s on context object on %s.",
504 ProcessState::self()->getDriverName().c_str());
505 sleep(1);
506 }
507 }
508
509 gUnifiedServiceManager = sp<BackendUnifiedServiceManager>::make(sm);
510 });
511
512 return gUnifiedServiceManager;
513}
514
Devin Moore18f63752024-08-08 21:01:24 +0000515} // namespace android