• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005 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 
17 #define LOG_TAG "ServiceManager"
18 
19 #include <binder/IServiceManager.h>
20 
21 #include <inttypes.h>
22 #include <unistd.h>
23 
24 #include <android/os/BnServiceCallback.h>
25 #include <android/os/IServiceManager.h>
26 #include <binder/IPCThreadState.h>
27 #include <binder/Parcel.h>
28 #include <utils/Log.h>
29 #include <utils/String8.h>
30 #include <utils/SystemClock.h>
31 
32 #ifndef __ANDROID_VNDK__
33 #include <binder/IPermissionController.h>
34 #endif
35 
36 #ifdef __ANDROID__
37 #include <cutils/properties.h>
38 #else
39 #include "ServiceManagerHost.h"
40 #endif
41 
42 #include "Static.h"
43 
44 namespace android {
45 
46 using AidlRegistrationCallback = IServiceManager::LocalRegistrationCallback;
47 
48 using AidlServiceManager = android::os::IServiceManager;
49 using android::binder::Status;
50 
51 // libbinder's IServiceManager.h can't rely on the values generated by AIDL
52 // because many places use its headers via include_dirs (meaning, without
53 // declaring the dependency in the build system). So, for now, we can just check
54 // the values here.
55 static_assert(AidlServiceManager::DUMP_FLAG_PRIORITY_CRITICAL == IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL);
56 static_assert(AidlServiceManager::DUMP_FLAG_PRIORITY_HIGH == IServiceManager::DUMP_FLAG_PRIORITY_HIGH);
57 static_assert(AidlServiceManager::DUMP_FLAG_PRIORITY_NORMAL == IServiceManager::DUMP_FLAG_PRIORITY_NORMAL);
58 static_assert(AidlServiceManager::DUMP_FLAG_PRIORITY_DEFAULT == IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
59 static_assert(AidlServiceManager::DUMP_FLAG_PRIORITY_ALL == IServiceManager::DUMP_FLAG_PRIORITY_ALL);
60 static_assert(AidlServiceManager::DUMP_FLAG_PROTO == IServiceManager::DUMP_FLAG_PROTO);
61 
getInterfaceDescriptor() const62 const String16& IServiceManager::getInterfaceDescriptor() const {
63     return AidlServiceManager::descriptor;
64 }
IServiceManager()65 IServiceManager::IServiceManager() {}
~IServiceManager()66 IServiceManager::~IServiceManager() {}
67 
68 // From the old libbinder IServiceManager interface to IServiceManager.
69 class ServiceManagerShim : public IServiceManager
70 {
71 public:
72     explicit ServiceManagerShim (const sp<AidlServiceManager>& impl);
73 
74     sp<IBinder> getService(const String16& name) const override;
75     sp<IBinder> checkService(const String16& name) const override;
76     status_t addService(const String16& name, const sp<IBinder>& service,
77                         bool allowIsolated, int dumpsysPriority) override;
78     Vector<String16> listServices(int dumpsysPriority) override;
79     sp<IBinder> waitForService(const String16& name16) override;
80     bool isDeclared(const String16& name) override;
81     Vector<String16> getDeclaredInstances(const String16& interface) override;
82     std::optional<String16> updatableViaApex(const String16& name) override;
83     std::optional<IServiceManager::ConnectionInfo> getConnectionInfo(const String16& name) override;
84     class RegistrationWaiter : public android::os::BnServiceCallback {
85     public:
RegistrationWaiter(const sp<AidlRegistrationCallback> & callback)86         explicit RegistrationWaiter(const sp<AidlRegistrationCallback>& callback)
87               : mImpl(callback) {}
onRegistration(const std::string & name,const sp<IBinder> & binder)88         Status onRegistration(const std::string& name, const sp<IBinder>& binder) override {
89             mImpl->onServiceRegistration(String16(name.c_str()), binder);
90             return Status::ok();
91         }
92 
93     private:
94         sp<AidlRegistrationCallback> mImpl;
95     };
96 
97     status_t registerForNotifications(const String16& service,
98                                       const sp<AidlRegistrationCallback>& cb) override;
99 
100     status_t unregisterForNotifications(const String16& service,
101                                         const sp<AidlRegistrationCallback>& cb) override;
102 
103     std::vector<IServiceManager::ServiceDebugInfo> getServiceDebugInfo() override;
104     // for legacy ABI
getInterfaceDescriptor() const105     const String16& getInterfaceDescriptor() const override {
106         return mTheRealServiceManager->getInterfaceDescriptor();
107     }
onAsBinder()108     IBinder* onAsBinder() override {
109         return IInterface::asBinder(mTheRealServiceManager).get();
110     }
111 
112 protected:
113     sp<AidlServiceManager> mTheRealServiceManager;
114     // AidlRegistrationCallback -> services that its been registered for
115     // notifications.
116     using LocalRegistrationAndWaiter =
117             std::pair<sp<LocalRegistrationCallback>, sp<RegistrationWaiter>>;
118     using ServiceCallbackMap = std::map<std::string, std::vector<LocalRegistrationAndWaiter>>;
119     ServiceCallbackMap mNameToRegistrationCallback;
120     std::mutex mNameToRegistrationLock;
121 
122     void removeRegistrationCallbackLocked(const sp<AidlRegistrationCallback>& cb,
123                                           ServiceCallbackMap::iterator* it,
124                                           sp<RegistrationWaiter>* waiter);
125 
126     // Directly get the service in a way that, for lazy services, requests the service to be started
127     // if it is not currently started. This way, calls directly to ServiceManagerShim::getService
128     // will still have the 5s delay that is expected by a large amount of Android code.
129     //
130     // When implementing ServiceManagerShim, use realGetService instead of
131     // mTheRealServiceManager->getService so that it can be overridden in ServiceManagerHostShim.
realGetService(const std::string & name,sp<IBinder> * _aidl_return)132     virtual Status realGetService(const std::string& name, sp<IBinder>* _aidl_return) {
133         return mTheRealServiceManager->getService(name, _aidl_return);
134     }
135 };
136 
137 [[clang::no_destroy]] static std::once_flag gSmOnce;
138 [[clang::no_destroy]] static sp<IServiceManager> gDefaultServiceManager;
139 
defaultServiceManager()140 sp<IServiceManager> defaultServiceManager()
141 {
142     std::call_once(gSmOnce, []() {
143         sp<AidlServiceManager> sm = nullptr;
144         while (sm == nullptr) {
145             sm = interface_cast<AidlServiceManager>(ProcessState::self()->getContextObject(nullptr));
146             if (sm == nullptr) {
147                 ALOGE("Waiting 1s on context object on %s.", ProcessState::self()->getDriverName().c_str());
148                 sleep(1);
149             }
150         }
151 
152         gDefaultServiceManager = sp<ServiceManagerShim>::make(sm);
153     });
154 
155     return gDefaultServiceManager;
156 }
157 
setDefaultServiceManager(const sp<IServiceManager> & sm)158 void setDefaultServiceManager(const sp<IServiceManager>& sm) {
159     bool called = false;
160     std::call_once(gSmOnce, [&]() {
161         gDefaultServiceManager = sm;
162         called = true;
163     });
164 
165     if (!called) {
166         LOG_ALWAYS_FATAL("setDefaultServiceManager() called after defaultServiceManager().");
167     }
168 }
169 
170 #if !defined(__ANDROID_VNDK__) && defined(__ANDROID__)
171 // IPermissionController is not accessible to vendors
172 
checkCallingPermission(const String16 & permission)173 bool checkCallingPermission(const String16& permission)
174 {
175     return checkCallingPermission(permission, nullptr, nullptr);
176 }
177 
178 static StaticString16 _permission(u"permission");
179 
checkCallingPermission(const String16 & permission,int32_t * outPid,int32_t * outUid)180 bool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid)
181 {
182     IPCThreadState* ipcState = IPCThreadState::self();
183     pid_t pid = ipcState->getCallingPid();
184     uid_t uid = ipcState->getCallingUid();
185     if (outPid) *outPid = pid;
186     if (outUid) *outUid = uid;
187     return checkPermission(permission, pid, uid);
188 }
189 
checkPermission(const String16 & permission,pid_t pid,uid_t uid,bool logPermissionFailure)190 bool checkPermission(const String16& permission, pid_t pid, uid_t uid, bool logPermissionFailure) {
191     static Mutex gPermissionControllerLock;
192     static sp<IPermissionController> gPermissionController;
193 
194     sp<IPermissionController> pc;
195     gPermissionControllerLock.lock();
196     pc = gPermissionController;
197     gPermissionControllerLock.unlock();
198 
199     int64_t startTime = 0;
200 
201     while (true) {
202         if (pc != nullptr) {
203             bool res = pc->checkPermission(permission, pid, uid);
204             if (res) {
205                 if (startTime != 0) {
206                     ALOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
207                             (int)((uptimeMillis()-startTime)/1000),
208                             String8(permission).string(), uid, pid);
209                 }
210                 return res;
211             }
212 
213             // Is this a permission failure, or did the controller go away?
214             if (IInterface::asBinder(pc)->isBinderAlive()) {
215                 if (logPermissionFailure) {
216                     ALOGW("Permission failure: %s from uid=%d pid=%d", String8(permission).string(),
217                           uid, pid);
218                 }
219                 return false;
220             }
221 
222             // Object is dead!
223             gPermissionControllerLock.lock();
224             if (gPermissionController == pc) {
225                 gPermissionController = nullptr;
226             }
227             gPermissionControllerLock.unlock();
228         }
229 
230         // Need to retrieve the permission controller.
231         sp<IBinder> binder = defaultServiceManager()->checkService(_permission);
232         if (binder == nullptr) {
233             // Wait for the permission controller to come back...
234             if (startTime == 0) {
235                 startTime = uptimeMillis();
236                 ALOGI("Waiting to check permission %s from uid=%d pid=%d",
237                         String8(permission).string(), uid, pid);
238             }
239             sleep(1);
240         } else {
241             pc = interface_cast<IPermissionController>(binder);
242             // Install the new permission controller, and try again.
243             gPermissionControllerLock.lock();
244             gPermissionController = pc;
245             gPermissionControllerLock.unlock();
246         }
247     }
248 }
249 
250 #endif //__ANDROID_VNDK__
251 
252 // ----------------------------------------------------------------------
253 
ServiceManagerShim(const sp<AidlServiceManager> & impl)254 ServiceManagerShim::ServiceManagerShim(const sp<AidlServiceManager>& impl)
255  : mTheRealServiceManager(impl)
256 {}
257 
258 // This implementation could be simplified and made more efficient by delegating
259 // to waitForService. However, this changes the threading structure in some
260 // cases and could potentially break prebuilts. Once we have higher logistical
261 // complexity, this could be attempted.
getService(const String16 & name) const262 sp<IBinder> ServiceManagerShim::getService(const String16& name) const
263 {
264     static bool gSystemBootCompleted = false;
265 
266     sp<IBinder> svc = checkService(name);
267     if (svc != nullptr) return svc;
268 
269     const bool isVendorService =
270         strcmp(ProcessState::self()->getDriverName().c_str(), "/dev/vndbinder") == 0;
271     constexpr int64_t timeout = 5000;
272     int64_t startTime = uptimeMillis();
273     // Vendor code can't access system properties
274     if (!gSystemBootCompleted && !isVendorService) {
275 #ifdef __ANDROID__
276         char bootCompleted[PROPERTY_VALUE_MAX];
277         property_get("sys.boot_completed", bootCompleted, "0");
278         gSystemBootCompleted = strcmp(bootCompleted, "1") == 0 ? true : false;
279 #else
280         gSystemBootCompleted = true;
281 #endif
282     }
283     // retry interval in millisecond; note that vendor services stay at 100ms
284     const useconds_t sleepTime = gSystemBootCompleted ? 1000 : 100;
285 
286     ALOGI("Waiting for service '%s' on '%s'...", String8(name).string(),
287           ProcessState::self()->getDriverName().c_str());
288 
289     int n = 0;
290     while (uptimeMillis() - startTime < timeout) {
291         n++;
292         usleep(1000*sleepTime);
293 
294         sp<IBinder> svc = checkService(name);
295         if (svc != nullptr) {
296             ALOGI("Waiting for service '%s' on '%s' successful after waiting %" PRIi64 "ms",
297                   String8(name).string(), ProcessState::self()->getDriverName().c_str(),
298                   uptimeMillis() - startTime);
299             return svc;
300         }
301     }
302     ALOGW("Service %s didn't start. Returning NULL", String8(name).string());
303     return nullptr;
304 }
305 
checkService(const String16 & name) const306 sp<IBinder> ServiceManagerShim::checkService(const String16& name) const
307 {
308     sp<IBinder> ret;
309     if (!mTheRealServiceManager->checkService(String8(name).c_str(), &ret).isOk()) {
310         return nullptr;
311     }
312     return ret;
313 }
314 
addService(const String16 & name,const sp<IBinder> & service,bool allowIsolated,int dumpsysPriority)315 status_t ServiceManagerShim::addService(const String16& name, const sp<IBinder>& service,
316                                         bool allowIsolated, int dumpsysPriority)
317 {
318     Status status = mTheRealServiceManager->addService(
319         String8(name).c_str(), service, allowIsolated, dumpsysPriority);
320     return status.exceptionCode();
321 }
322 
listServices(int dumpsysPriority)323 Vector<String16> ServiceManagerShim::listServices(int dumpsysPriority)
324 {
325     std::vector<std::string> ret;
326     if (!mTheRealServiceManager->listServices(dumpsysPriority, &ret).isOk()) {
327         return {};
328     }
329 
330     Vector<String16> res;
331     res.setCapacity(ret.size());
332     for (const std::string& name : ret) {
333         res.push(String16(name.c_str()));
334     }
335     return res;
336 }
337 
waitForService(const String16 & name16)338 sp<IBinder> ServiceManagerShim::waitForService(const String16& name16)
339 {
340     class Waiter : public android::os::BnServiceCallback {
341         Status onRegistration(const std::string& /*name*/,
342                               const sp<IBinder>& binder) override {
343             std::unique_lock<std::mutex> lock(mMutex);
344             mBinder = binder;
345             lock.unlock();
346             // Flushing here helps ensure the service's ref count remains accurate
347             IPCThreadState::self()->flushCommands();
348             mCv.notify_one();
349             return Status::ok();
350         }
351     public:
352         sp<IBinder> mBinder;
353         std::mutex mMutex;
354         std::condition_variable mCv;
355     };
356 
357     // Simple RAII object to ensure a function call immediately before going out of scope
358     class Defer {
359     public:
360         explicit Defer(std::function<void()>&& f) : mF(std::move(f)) {}
361         ~Defer() { mF(); }
362     private:
363         std::function<void()> mF;
364     };
365 
366     const std::string name = String8(name16).c_str();
367 
368     sp<IBinder> out;
369     if (Status status = realGetService(name, &out); !status.isOk()) {
370         ALOGW("Failed to getService in waitForService for %s: %s", name.c_str(),
371               status.toString8().c_str());
372         return nullptr;
373     }
374     if (out != nullptr) return out;
375 
376     sp<Waiter> waiter = sp<Waiter>::make();
377     if (Status status = mTheRealServiceManager->registerForNotifications(name, waiter);
378         !status.isOk()) {
379         ALOGW("Failed to registerForNotifications in waitForService for %s: %s", name.c_str(),
380               status.toString8().c_str());
381         return nullptr;
382     }
383     Defer unregister ([&] {
384         mTheRealServiceManager->unregisterForNotifications(name, waiter);
385     });
386 
387     while(true) {
388         {
389             // It would be really nice if we could read binder commands on this
390             // thread instead of needing a threadpool to be started, but for
391             // instance, if we call getAndExecuteCommand, it might be the case
392             // that another thread serves the callback, and we never get a
393             // command, so we hang indefinitely.
394             std::unique_lock<std::mutex> lock(waiter->mMutex);
395             using std::literals::chrono_literals::operator""s;
396             waiter->mCv.wait_for(lock, 1s, [&] {
397                 return waiter->mBinder != nullptr;
398             });
399             if (waiter->mBinder != nullptr) return waiter->mBinder;
400         }
401 
402         ALOGW("Waited one second for %s (is service started? are binder threads started and available?)", name.c_str());
403 
404         // Handle race condition for lazy services. Here is what can happen:
405         // - the service dies (not processed by init yet).
406         // - sm processes death notification.
407         // - sm gets getService and calls init to start service.
408         // - init gets the start signal, but the service already appears
409         //   started, so it does nothing.
410         // - init gets death signal, but doesn't know it needs to restart
411         //   the service
412         // - we need to request service again to get it to start
413         if (Status status = realGetService(name, &out); !status.isOk()) {
414             ALOGW("Failed to getService in waitForService on later try for %s: %s", name.c_str(),
415                   status.toString8().c_str());
416             return nullptr;
417         }
418         if (out != nullptr) return out;
419     }
420 }
421 
isDeclared(const String16 & name)422 bool ServiceManagerShim::isDeclared(const String16& name) {
423     bool declared;
424     if (Status status = mTheRealServiceManager->isDeclared(String8(name).c_str(), &declared);
425         !status.isOk()) {
426         ALOGW("Failed to get isDeclard for %s: %s", String8(name).c_str(),
427               status.toString8().c_str());
428         return false;
429     }
430     return declared;
431 }
432 
getDeclaredInstances(const String16 & interface)433 Vector<String16> ServiceManagerShim::getDeclaredInstances(const String16& interface) {
434     std::vector<std::string> out;
435     if (Status status =
436                 mTheRealServiceManager->getDeclaredInstances(String8(interface).c_str(), &out);
437         !status.isOk()) {
438         ALOGW("Failed to getDeclaredInstances for %s: %s", String8(interface).c_str(),
439               status.toString8().c_str());
440         return {};
441     }
442 
443     Vector<String16> res;
444     res.setCapacity(out.size());
445     for (const std::string& instance : out) {
446         res.push(String16(instance.c_str()));
447     }
448     return res;
449 }
450 
updatableViaApex(const String16 & name)451 std::optional<String16> ServiceManagerShim::updatableViaApex(const String16& name) {
452     std::optional<std::string> declared;
453     if (Status status = mTheRealServiceManager->updatableViaApex(String8(name).c_str(), &declared);
454         !status.isOk()) {
455         ALOGW("Failed to get updatableViaApex for %s: %s", String8(name).c_str(),
456               status.toString8().c_str());
457         return std::nullopt;
458     }
459     return declared ? std::optional<String16>(String16(declared.value().c_str())) : std::nullopt;
460 }
461 
getConnectionInfo(const String16 & name)462 std::optional<IServiceManager::ConnectionInfo> ServiceManagerShim::getConnectionInfo(
463         const String16& name) {
464     std::optional<os::ConnectionInfo> connectionInfo;
465     if (Status status =
466                 mTheRealServiceManager->getConnectionInfo(String8(name).c_str(), &connectionInfo);
467         !status.isOk()) {
468         ALOGW("Failed to get ConnectionInfo for %s: %s", String8(name).c_str(),
469               status.toString8().c_str());
470     }
471     return connectionInfo.has_value()
472             ? std::make_optional<IServiceManager::ConnectionInfo>(
473                       {connectionInfo->ipAddress, static_cast<unsigned int>(connectionInfo->port)})
474             : std::nullopt;
475 }
476 
registerForNotifications(const String16 & name,const sp<AidlRegistrationCallback> & cb)477 status_t ServiceManagerShim::registerForNotifications(const String16& name,
478                                                       const sp<AidlRegistrationCallback>& cb) {
479     if (cb == nullptr) {
480         ALOGE("%s: null cb passed", __FUNCTION__);
481         return BAD_VALUE;
482     }
483     std::string nameStr = String8(name).c_str();
484     sp<RegistrationWaiter> registrationWaiter = sp<RegistrationWaiter>::make(cb);
485     std::lock_guard<std::mutex> lock(mNameToRegistrationLock);
486     if (Status status =
487                 mTheRealServiceManager->registerForNotifications(nameStr, registrationWaiter);
488         !status.isOk()) {
489         ALOGW("Failed to registerForNotifications for %s: %s", nameStr.c_str(),
490               status.toString8().c_str());
491         return UNKNOWN_ERROR;
492     }
493     mNameToRegistrationCallback[nameStr].push_back(std::make_pair(cb, registrationWaiter));
494     return OK;
495 }
496 
removeRegistrationCallbackLocked(const sp<AidlRegistrationCallback> & cb,ServiceCallbackMap::iterator * it,sp<RegistrationWaiter> * waiter)497 void ServiceManagerShim::removeRegistrationCallbackLocked(const sp<AidlRegistrationCallback>& cb,
498                                                           ServiceCallbackMap::iterator* it,
499                                                           sp<RegistrationWaiter>* waiter) {
500     std::vector<LocalRegistrationAndWaiter>& localRegistrationAndWaiters = (*it)->second;
501     for (auto lit = localRegistrationAndWaiters.begin();
502          lit != localRegistrationAndWaiters.end();) {
503         if (lit->first == cb) {
504             if (waiter) {
505                 *waiter = lit->second;
506             }
507             lit = localRegistrationAndWaiters.erase(lit);
508         } else {
509             ++lit;
510         }
511     }
512 
513     if (localRegistrationAndWaiters.empty()) {
514         mNameToRegistrationCallback.erase(*it);
515     }
516 }
517 
unregisterForNotifications(const String16 & name,const sp<AidlRegistrationCallback> & cb)518 status_t ServiceManagerShim::unregisterForNotifications(const String16& name,
519                                                         const sp<AidlRegistrationCallback>& cb) {
520     if (cb == nullptr) {
521         ALOGE("%s: null cb passed", __FUNCTION__);
522         return BAD_VALUE;
523     }
524     std::string nameStr = String8(name).c_str();
525     std::lock_guard<std::mutex> lock(mNameToRegistrationLock);
526     auto it = mNameToRegistrationCallback.find(nameStr);
527     sp<RegistrationWaiter> registrationWaiter;
528     if (it != mNameToRegistrationCallback.end()) {
529         removeRegistrationCallbackLocked(cb, &it, &registrationWaiter);
530     } else {
531         ALOGE("%s no callback registered for notifications on %s", __FUNCTION__, nameStr.c_str());
532         return BAD_VALUE;
533     }
534     if (registrationWaiter == nullptr) {
535         ALOGE("%s Callback passed wasn't used to register for notifications", __FUNCTION__);
536         return BAD_VALUE;
537     }
538     if (Status status = mTheRealServiceManager->unregisterForNotifications(String8(name).c_str(),
539                                                                            registrationWaiter);
540         !status.isOk()) {
541         ALOGW("Failed to get service manager to unregisterForNotifications for %s: %s",
542               String8(name).c_str(), status.toString8().c_str());
543         return UNKNOWN_ERROR;
544     }
545     return OK;
546 }
547 
getServiceDebugInfo()548 std::vector<IServiceManager::ServiceDebugInfo> ServiceManagerShim::getServiceDebugInfo() {
549     std::vector<os::ServiceDebugInfo> serviceDebugInfos;
550     std::vector<IServiceManager::ServiceDebugInfo> ret;
551     if (Status status = mTheRealServiceManager->getServiceDebugInfo(&serviceDebugInfos);
552         !status.isOk()) {
553         ALOGW("%s Failed to get ServiceDebugInfo", __FUNCTION__);
554         return ret;
555     }
556     for (const auto& serviceDebugInfo : serviceDebugInfos) {
557         IServiceManager::ServiceDebugInfo retInfo;
558         retInfo.pid = serviceDebugInfo.debugPid;
559         retInfo.name = serviceDebugInfo.name;
560         ret.emplace_back(retInfo);
561     }
562     return ret;
563 }
564 
565 #ifndef __ANDROID__
566 // ServiceManagerShim for host. Implements the old libbinder android::IServiceManager API.
567 // The internal implementation of the AIDL interface android::os::IServiceManager calls into
568 // on-device service manager.
569 class ServiceManagerHostShim : public ServiceManagerShim {
570 public:
ServiceManagerHostShim(const sp<AidlServiceManager> & impl,const RpcDelegateServiceManagerOptions & options)571     ServiceManagerHostShim(const sp<AidlServiceManager>& impl,
572                            const RpcDelegateServiceManagerOptions& options)
573           : ServiceManagerShim(impl), mOptions(options) {}
574     // ServiceManagerShim::getService is based on checkService, so no need to override it.
checkService(const String16 & name) const575     sp<IBinder> checkService(const String16& name) const override {
576         return getDeviceService({String8(name).c_str()}, mOptions);
577     }
578 
579 protected:
580     // Override realGetService for ServiceManagerShim::waitForService.
realGetService(const std::string & name,sp<IBinder> * _aidl_return)581     Status realGetService(const std::string& name, sp<IBinder>* _aidl_return) {
582         *_aidl_return = getDeviceService({"-g", name}, mOptions);
583         return Status::ok();
584     }
585 
586 private:
587     RpcDelegateServiceManagerOptions mOptions;
588 };
createRpcDelegateServiceManager(const RpcDelegateServiceManagerOptions & options)589 sp<IServiceManager> createRpcDelegateServiceManager(
590         const RpcDelegateServiceManagerOptions& options) {
591     auto binder = getDeviceService({"manager"}, options);
592     if (binder == nullptr) {
593         ALOGE("getDeviceService(\"manager\") returns null");
594         return nullptr;
595     }
596     auto interface = AidlServiceManager::asInterface(binder);
597     if (interface == nullptr) {
598         ALOGE("getDeviceService(\"manager\") returns non service manager");
599         return nullptr;
600     }
601     return sp<ServiceManagerHostShim>::make(interface, options);
602 }
603 #endif
604 
605 } // namespace android
606