diff options
author | Steven Moreland <smoreland@google.com> | 2021-02-24 01:04:12 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-02-24 01:04:12 +0000 |
commit | a3f822ed73d2364b74d91119823cfc57e4d0db86 (patch) | |
tree | dc304ce24e8c448cdcc8226cf7ef7a0b2ed5af75 | |
parent | 18b34ba757c38f1e8c72d3b31120acd358ef5c3e (diff) | |
parent | 33ea854b1f27f9aafbb493cbbe233d19e0d7adfd (diff) | |
download | native-a3f822ed73d2364b74d91119823cfc57e4d0db86.tar.gz |
Merge "libbinder_ndk: expose declared services list" am: 33ea854b1f
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1595574
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: Ib3d4d7842aca87cb9dea70fdd92898eb757d9140
-rw-r--r-- | libs/binder/ndk/include_platform/android/binder_manager.h | 16 | ||||
-rw-r--r-- | libs/binder/ndk/libbinder_ndk.map.txt | 1 | ||||
-rw-r--r-- | libs/binder/ndk/service_manager.cpp | 15 | ||||
-rw-r--r-- | libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp | 19 |
4 files changed, 50 insertions, 1 deletions
diff --git a/libs/binder/ndk/include_platform/android/binder_manager.h b/libs/binder/ndk/include_platform/android/binder_manager.h index 45807515e4..5df0012bd3 100644 --- a/libs/binder/ndk/include_platform/android/binder_manager.h +++ b/libs/binder/ndk/include_platform/android/binder_manager.h @@ -96,6 +96,22 @@ __attribute__((warn_unused_result)) AIBinder* AServiceManager_waitForService(con bool AServiceManager_isDeclared(const char* instance) __INTRODUCED_IN(31); /** + * Returns all declared instances for a particular interface. + * + * For instance, if 'android.foo.IFoo/foo' is declared, and 'android.foo.IFoo' is + * passed here, then ["foo"] would be returned. + * + * See also AServiceManager_isDeclared. + * + * \param interface interface, e.g. 'android.foo.IFoo' + * \param context to pass to callback + * \param callback taking instance (e.g. 'foo') and context + */ +void AServiceManager_forEachDeclaredInstance(const char* interface, void* context, + void (*callback)(const char*, void*)) + __INTRODUCED_IN(31); + +/** * Prevent lazy services without client from shutting down their process * * \param persist 'true' if the process should not exit. diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt index cef0bf31d2..8d08275eec 100644 --- a/libs/binder/ndk/libbinder_ndk.map.txt +++ b/libs/binder/ndk/libbinder_ndk.map.txt @@ -118,6 +118,7 @@ LIBBINDER_NDK31 { # introduced=31 AIBinder_getCallingSid; # apex AIBinder_setRequestingSid; # apex AServiceManager_isDeclared; # apex llndk + AServiceManager_forEachDeclaredInstance; # apex llndk AServiceManager_registerLazyService; # llndk AServiceManager_waitForService; # apex llndk AServiceManager_forceLazyServicesPersist; # llndk diff --git a/libs/binder/ndk/service_manager.cpp b/libs/binder/ndk/service_manager.cpp index cb0987e3e1..1ccd0d2a2b 100644 --- a/libs/binder/ndk/service_manager.cpp +++ b/libs/binder/ndk/service_manager.cpp @@ -19,6 +19,7 @@ #include "ibinder_internal.h" #include "status_internal.h" +#include <android-base/logging.h> #include <binder/IServiceManager.h> #include <binder/LazyServiceRegistrar.h> @@ -28,6 +29,7 @@ using ::android::IServiceManager; using ::android::sp; using ::android::status_t; using ::android::String16; +using ::android::String8; binder_exception_t AServiceManager_addService(AIBinder* binder, const char* instance) { if (binder == nullptr || instance == nullptr) { @@ -92,6 +94,17 @@ bool AServiceManager_isDeclared(const char* instance) { sp<IServiceManager> sm = defaultServiceManager(); return sm->isDeclared(String16(instance)); } +void AServiceManager_forEachDeclaredInstance(const char* interface, void* context, + void (*callback)(const char*, void*)) { + CHECK(interface != nullptr); + // context may be nullptr + CHECK(callback != nullptr); + + sp<IServiceManager> sm = defaultServiceManager(); + for (const String16& instance : sm->getDeclaredInstances(String16(interface))) { + callback(String8(instance).c_str(), context); + } +} void AServiceManager_forceLazyServicesPersist(bool persist) { auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance(); serviceRegistrar.forcePersist(persist); @@ -110,4 +123,4 @@ bool AServiceManager_tryUnregister() { void AServiceManager_reRegister() { auto serviceRegistrar = android::binder::LazyServiceRegistrar::getInstance(); serviceRegistrar.reRegister(); -}
\ No newline at end of file +} diff --git a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp index 7f725e0bfb..496a915f8b 100644 --- a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp +++ b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp @@ -250,6 +250,25 @@ TEST(NdkBinder, DoubleNumber) { EXPECT_EQ(2, out); } +void defaultInstanceCounter(const char* instance, void* context) { + if (strcmp(instance, "default") == 0) { + ++*(size_t*)(context); + } +} + +TEST(NdkBinder, GetDeclaredInstances) { + bool hasLight = AServiceManager_isDeclared("android.hardware.light.ILights/default"); + + size_t count; + AServiceManager_forEachDeclaredInstance("android.hardware.light.ILights", &count, + defaultInstanceCounter); + + // At the time of writing this test, there is no good interface guaranteed + // to be on all devices. Cuttlefish has light, so this will generally test + // things. + EXPECT_EQ(count, hasLight ? 1 : 0); +} + TEST(NdkBinder, GetLazyService) { // Not declared in the vintf manifest ASSERT_FALSE(AServiceManager_isDeclared(kLazyBinderNdkUnitTestService)); |