@@ -47,6 +47,9 @@ using AidlServiceManager = android::os::IServiceManager;
4747using android::os::IAccessor;
4848using binder::Status;
4949
50+ static const char * kUnsupportedOpNoServiceManager =
51+ " Unsupported operation without a kernel binder servicemanager process" ;
52+
5053static const char * kStaticCachableList [] = {
5154 // go/keep-sorted start
5255 " accessibility" ,
@@ -220,7 +223,10 @@ Status BackendUnifiedServiceManager::getService2(const ::std::string& name, os::
220223 return Status::ok ();
221224 }
222225 os::Service service;
223- Status status = mTheRealServiceManager ->getService2 (name, &service);
226+ Status status = Status::ok ();
227+ if (mTheRealServiceManager ) {
228+ status = mTheRealServiceManager ->getService2 (name, &service);
229+ }
224230
225231 if (status.isOk ()) {
226232 status = toBinderService (name, service, _out);
@@ -237,7 +243,10 @@ Status BackendUnifiedServiceManager::checkService(const ::std::string& name, os:
237243 return Status::ok ();
238244 }
239245
240- Status status = mTheRealServiceManager ->checkService (name, &service);
246+ Status status = Status::ok ();
247+ if (mTheRealServiceManager ) {
248+ status = mTheRealServiceManager ->checkService (name, &service);
249+ }
241250 if (status.isOk ()) {
242251 status = toBinderService (name, service, _out);
243252 if (status.isOk ()) {
@@ -315,66 +324,128 @@ Status BackendUnifiedServiceManager::toBinderService(const ::std::string& name,
315324Status BackendUnifiedServiceManager::addService (const ::std::string& name,
316325 const sp<IBinder>& service, bool allowIsolated,
317326 int32_t dumpPriority) {
318- Status status = mTheRealServiceManager ->addService (name, service, allowIsolated, dumpPriority);
319- // mEnableAddServiceCache is true by default.
320- if (kUseCacheInAddService && mEnableAddServiceCache && status.isOk ()) {
321- return updateCache (name, service,
322- dumpPriority & android::os::IServiceManager::FLAG_IS_LAZY_SERVICE);
327+ if (mTheRealServiceManager ) {
328+ Status status =
329+ mTheRealServiceManager ->addService (name, service, allowIsolated, dumpPriority);
330+ // mEnableAddServiceCache is true by default.
331+ if (kUseCacheInAddService && mEnableAddServiceCache && status.isOk ()) {
332+ return updateCache (name, service,
333+ dumpPriority & android::os::IServiceManager::FLAG_IS_LAZY_SERVICE);
334+ }
335+ return status;
323336 }
324- return status;
337+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
338+ kUnsupportedOpNoServiceManager );
325339}
326340Status BackendUnifiedServiceManager::listServices (int32_t dumpPriority,
327341 ::std::vector<::std::string>* _aidl_return) {
328- return mTheRealServiceManager ->listServices (dumpPriority, _aidl_return);
342+ if (mTheRealServiceManager ) {
343+ return mTheRealServiceManager ->listServices (dumpPriority, _aidl_return);
344+ }
345+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
346+ kUnsupportedOpNoServiceManager );
329347}
330348Status BackendUnifiedServiceManager::registerForNotifications (
331349 const ::std::string& name, const sp<os::IServiceCallback>& callback) {
332- return mTheRealServiceManager ->registerForNotifications (name, callback);
350+ if (mTheRealServiceManager ) {
351+ return mTheRealServiceManager ->registerForNotifications (name, callback);
352+ }
353+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
354+ kUnsupportedOpNoServiceManager );
333355}
334356Status BackendUnifiedServiceManager::unregisterForNotifications (
335357 const ::std::string& name, const sp<os::IServiceCallback>& callback) {
336- return mTheRealServiceManager ->unregisterForNotifications (name, callback);
358+ if (mTheRealServiceManager ) {
359+ return mTheRealServiceManager ->unregisterForNotifications (name, callback);
360+ }
361+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
362+ kUnsupportedOpNoServiceManager );
337363}
338364Status BackendUnifiedServiceManager::isDeclared (const ::std::string& name, bool * _aidl_return) {
339- return mTheRealServiceManager ->isDeclared (name, _aidl_return);
365+ if (mTheRealServiceManager ) {
366+ return mTheRealServiceManager ->isDeclared (name, _aidl_return);
367+ }
368+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
369+ kUnsupportedOpNoServiceManager );
340370}
341371Status BackendUnifiedServiceManager::getDeclaredInstances (
342372 const ::std::string& iface, ::std::vector<::std::string>* _aidl_return) {
343- return mTheRealServiceManager ->getDeclaredInstances (iface, _aidl_return);
373+ if (mTheRealServiceManager ) {
374+ return mTheRealServiceManager ->getDeclaredInstances (iface, _aidl_return);
375+ }
376+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
377+ kUnsupportedOpNoServiceManager );
344378}
345379Status BackendUnifiedServiceManager::updatableViaApex (
346380 const ::std::string& name, ::std::optional<::std::string>* _aidl_return) {
347- return mTheRealServiceManager ->updatableViaApex (name, _aidl_return);
381+ if (mTheRealServiceManager ) {
382+ return mTheRealServiceManager ->updatableViaApex (name, _aidl_return);
383+ }
384+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
385+ kUnsupportedOpNoServiceManager );
348386}
349387Status BackendUnifiedServiceManager::getUpdatableNames (const ::std::string& apexName,
350388 ::std::vector<::std::string>* _aidl_return) {
351- return mTheRealServiceManager ->getUpdatableNames (apexName, _aidl_return);
389+ if (mTheRealServiceManager ) {
390+ return mTheRealServiceManager ->getUpdatableNames (apexName, _aidl_return);
391+ }
392+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
393+ kUnsupportedOpNoServiceManager );
352394}
353395Status BackendUnifiedServiceManager::getConnectionInfo (
354396 const ::std::string& name, ::std::optional<os::ConnectionInfo>* _aidl_return) {
355- return mTheRealServiceManager ->getConnectionInfo (name, _aidl_return);
397+ if (mTheRealServiceManager ) {
398+ return mTheRealServiceManager ->getConnectionInfo (name, _aidl_return);
399+ }
400+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
401+ kUnsupportedOpNoServiceManager );
356402}
357403Status BackendUnifiedServiceManager::registerClientCallback (
358404 const ::std::string& name, const sp<IBinder>& service,
359405 const sp<os::IClientCallback>& callback) {
360- return mTheRealServiceManager ->registerClientCallback (name, service, callback);
406+ if (mTheRealServiceManager ) {
407+ return mTheRealServiceManager ->registerClientCallback (name, service, callback);
408+ }
409+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
410+ kUnsupportedOpNoServiceManager );
361411}
362412Status BackendUnifiedServiceManager::tryUnregisterService (const ::std::string& name,
363413 const sp<IBinder>& service) {
364- return mTheRealServiceManager ->tryUnregisterService (name, service);
414+ if (mTheRealServiceManager ) {
415+ return mTheRealServiceManager ->tryUnregisterService (name, service);
416+ }
417+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
418+ kUnsupportedOpNoServiceManager );
365419}
366420Status BackendUnifiedServiceManager::getServiceDebugInfo (
367421 ::std::vector<os::ServiceDebugInfo>* _aidl_return) {
368- return mTheRealServiceManager ->getServiceDebugInfo (_aidl_return);
422+ if (mTheRealServiceManager ) {
423+ return mTheRealServiceManager ->getServiceDebugInfo (_aidl_return);
424+ }
425+ return Status::fromExceptionCode (Status::EX_UNSUPPORTED_OPERATION,
426+ kUnsupportedOpNoServiceManager );
369427}
370428
371429[[clang::no_destroy]] static std::once_flag gUSmOnce ;
372430[[clang::no_destroy]] static sp<BackendUnifiedServiceManager> gUnifiedServiceManager ;
373431
432+ static bool hasOutOfProcessServiceManager () {
433+ #ifndef BINDER_WITH_KERNEL_IPC
434+ return false ;
435+ #else
436+ #if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
437+ return android::base::GetBoolProperty (" servicemanager.installed" , true );
438+ #else
439+ return true ;
440+ #endif
441+ #endif // BINDER_WITH_KERNEL_IPC
442+ }
443+
374444sp<BackendUnifiedServiceManager> getBackendUnifiedServiceManager () {
375445 std::call_once (gUSmOnce , []() {
376446#if defined(__BIONIC__) && !defined(__ANDROID_VNDK__)
377- /* wait for service manager */ {
447+ /* wait for service manager */
448+ if (hasOutOfProcessServiceManager ()) {
378449 using std::literals::chrono_literals::operator " " s;
379450 using android::base::WaitForProperty;
380451 while (!WaitForProperty (" servicemanager.ready" , " true" , 1s)) {
@@ -384,7 +455,7 @@ sp<BackendUnifiedServiceManager> getBackendUnifiedServiceManager() {
384455#endif
385456
386457 sp<AidlServiceManager> sm = nullptr ;
387- while (sm == nullptr ) {
458+ while (hasOutOfProcessServiceManager () && sm == nullptr ) {
388459 sm = interface_cast<AidlServiceManager>(
389460 ProcessState::self ()->getContextObject (nullptr ));
390461 if (sm == nullptr ) {
0 commit comments