diff options
| -rw-r--r-- | libs/binder/ndk/include_apex/android/binder_manager.h | 9 | ||||
| -rw-r--r-- | libs/binder/ndk/libbinder_ndk.map.txt | 1 | ||||
| -rw-r--r-- | libs/binder/ndk/service_manager.cpp | 12 | ||||
| -rw-r--r-- | libs/binder/ndk/test/main_client.cpp | 13 |
4 files changed, 35 insertions, 0 deletions
diff --git a/libs/binder/ndk/include_apex/android/binder_manager.h b/libs/binder/ndk/include_apex/android/binder_manager.h index 80b6c07025..055c79bca1 100644 --- a/libs/binder/ndk/include_apex/android/binder_manager.h +++ b/libs/binder/ndk/include_apex/android/binder_manager.h @@ -33,6 +33,15 @@ __BEGIN_DECLS binder_status_t AServiceManager_addService(AIBinder* binder, const char* instance); /** + * Gets a binder object with this specific instance name. Will return nullptr immediately if the + * service is not available This also implicitly calls AIBinder_incStrong (so the caller of this + * function is responsible for calling AIBinder_decStrong). + * + * \param instance identifier of the service used to lookup the service. + */ +__attribute__((warn_unused_result)) AIBinder* AServiceManager_checkService(const char* instance); + +/** * Gets a binder object with this specific instance name. Blocks for a couple of seconds waiting on * it. This also implicitly calls AIBinder_incStrong (so the caller of this function is responsible * for calling AIBinder_decStrong). diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt index f0d25f79e3..655f4d50aa 100644 --- a/libs/binder/ndk/libbinder_ndk.map.txt +++ b/libs/binder/ndk/libbinder_ndk.map.txt @@ -91,6 +91,7 @@ LIBBINDER_NDK { # introduced=29 ABinderProcess_setThreadPoolMaxThreadCount; # apex ABinderProcess_startThreadPool; # apex AServiceManager_addService; # apex + AServiceManager_checkService; # apex AServiceManager_getService; # apex local: *; diff --git a/libs/binder/ndk/service_manager.cpp b/libs/binder/ndk/service_manager.cpp index 9ddc5559cf..d0b166d318 100644 --- a/libs/binder/ndk/service_manager.cpp +++ b/libs/binder/ndk/service_manager.cpp @@ -37,6 +37,18 @@ binder_status_t AServiceManager_addService(AIBinder* binder, const char* instanc status_t status = sm->addService(String16(instance), binder->getBinder()); return PruneStatusT(status); } +AIBinder* AServiceManager_checkService(const char* instance) { + if (instance == nullptr) { + return nullptr; + } + + sp<IServiceManager> sm = defaultServiceManager(); + sp<IBinder> binder = sm->checkService(String16(instance)); + + sp<AIBinder> ret = ABpBinder::lookupOrCreateFromBinder(binder); + AIBinder_incStrong(ret.get()); + return ret.get(); +} AIBinder* AServiceManager_getService(const char* instance) { if (instance == nullptr) { return nullptr; diff --git a/libs/binder/ndk/test/main_client.cpp b/libs/binder/ndk/test/main_client.cpp index c159d71b59..bff601ec26 100644 --- a/libs/binder/ndk/test/main_client.cpp +++ b/libs/binder/ndk/test/main_client.cpp @@ -35,6 +35,19 @@ constexpr char kExistingNonNdkService[] = "SurfaceFlinger"; // EXPECT_EQ(nullptr, foo.get()); // } +TEST(NdkBinder, CheckServiceThatDoesntExist) { + AIBinder* binder = AServiceManager_checkService("asdfghkl;"); + ASSERT_EQ(nullptr, binder); +} + +TEST(NdkBinder, CheckServiceThatDoesExist) { + AIBinder* binder = AServiceManager_checkService(kExistingNonNdkService); + EXPECT_NE(nullptr, binder); + EXPECT_EQ(STATUS_OK, AIBinder_ping(binder)); + + AIBinder_decStrong(binder); +} + TEST(NdkBinder, DoubleNumber) { sp<IFoo> foo = IFoo::getService(IFoo::kSomeInstanceName); ASSERT_NE(foo, nullptr); |