diff options
| author | 2022-10-25 17:02:45 +0900 | |
|---|---|---|
| committer | 2022-10-26 09:42:59 +0900 | |
| commit | 76944fee1a642cdfbabaa72ef7d29e53af1d50db (patch) | |
| tree | 3b0d45fa894dc8b3d9f7d2677e6a74d99323ba25 /libs | |
| parent | 4e84148059c54ccbf64740c6841fdae46ce64b30 (diff) | |
servicemanager: getUpdatableNames()
This new method is a reverse of updatableViaApex(). It returns the list
of declared instances which can be updated via the passed APEX.
Updatable vendor apexes are supposed to be used only to update HAL
services. APEXd can use this method to see if the target APEX is
actually to updating HALs.
It's not exposed to NDK/Java yet because there's no clients.
Bug: 254201177
Test: TBD
Change-Id: I7b5aa7d00a3ddeb13855816006a9561dfa601529
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/binder/IServiceManager.cpp | 18 | ||||
| -rw-r--r-- | libs/binder/aidl/android/os/IServiceManager.aidl | 6 | ||||
| -rw-r--r-- | libs/binder/include/binder/IServiceManager.h | 6 | ||||
| -rw-r--r-- | libs/binder/servicedispatcher.cpp | 4 | ||||
| -rw-r--r-- | libs/fakeservicemanager/ServiceManager.cpp | 5 | ||||
| -rw-r--r-- | libs/fakeservicemanager/include/fakeservicemanager/ServiceManager.h | 2 |
6 files changed, 41 insertions, 0 deletions
diff --git a/libs/binder/IServiceManager.cpp b/libs/binder/IServiceManager.cpp index 05db7743f2..a0c43349a7 100644 --- a/libs/binder/IServiceManager.cpp +++ b/libs/binder/IServiceManager.cpp @@ -81,6 +81,7 @@ public: bool isDeclared(const String16& name) override; Vector<String16> getDeclaredInstances(const String16& interface) override; std::optional<String16> updatableViaApex(const String16& name) override; + Vector<String16> getUpdatableNames(const String16& apexName) override; std::optional<IServiceManager::ConnectionInfo> getConnectionInfo(const String16& name) override; class RegistrationWaiter : public android::os::BnServiceCallback { public: @@ -479,6 +480,23 @@ std::optional<String16> ServiceManagerShim::updatableViaApex(const String16& nam return declared ? std::optional<String16>(String16(declared.value().c_str())) : std::nullopt; } +Vector<String16> ServiceManagerShim::getUpdatableNames(const String16& apexName) { + std::vector<std::string> out; + if (Status status = mTheRealServiceManager->getUpdatableNames(String8(apexName).c_str(), &out); + !status.isOk()) { + ALOGW("Failed to getUpdatableNames for %s: %s", String8(apexName).c_str(), + status.toString8().c_str()); + return {}; + } + + Vector<String16> res; + res.setCapacity(out.size()); + for (const std::string& instance : out) { + res.push(String16(instance.c_str())); + } + return res; +} + std::optional<IServiceManager::ConnectionInfo> ServiceManagerShim::getConnectionInfo( const String16& name) { std::optional<os::ConnectionInfo> connectionInfo; diff --git a/libs/binder/aidl/android/os/IServiceManager.aidl b/libs/binder/aidl/android/os/IServiceManager.aidl index 5880c0a1bd..0fb1615391 100644 --- a/libs/binder/aidl/android/os/IServiceManager.aidl +++ b/libs/binder/aidl/android/os/IServiceManager.aidl @@ -114,6 +114,12 @@ interface IServiceManager { @nullable @utf8InCpp String updatableViaApex(@utf8InCpp String name); /** + * Returns all instances which are updatable via the APEX. Instance names are fully qualified + * like `pack.age.IFoo/default`. + */ + @utf8InCpp String[] getUpdatableNames(@utf8InCpp String apexName); + + /** * If connection info is available for the given instance, returns the ConnectionInfo */ @nullable ConnectionInfo getConnectionInfo(@utf8InCpp String name); diff --git a/libs/binder/include/binder/IServiceManager.h b/libs/binder/include/binder/IServiceManager.h index 413c97f349..79e771f092 100644 --- a/libs/binder/include/binder/IServiceManager.h +++ b/libs/binder/include/binder/IServiceManager.h @@ -115,6 +115,12 @@ public: virtual std::optional<String16> updatableViaApex(const String16& name) = 0; /** + * Returns all instances which are updatable via the APEX. Instance names are fully qualified + * like `pack.age.IFoo/default`. + */ + virtual Vector<String16> getUpdatableNames(const String16& apexName) = 0; + + /** * If this instance has declared remote connection information, returns * the ConnectionInfo. */ diff --git a/libs/binder/servicedispatcher.cpp b/libs/binder/servicedispatcher.cpp index 777f3c9354..692cc95e3b 100644 --- a/libs/binder/servicedispatcher.cpp +++ b/libs/binder/servicedispatcher.cpp @@ -156,6 +156,10 @@ public: std::optional<std::string>* _aidl_return) override { return mImpl->updatableViaApex(name, _aidl_return); } + android::binder::Status getUpdatableNames(const std::string& apexName, + std::vector<std::string>* _aidl_return) override { + return mImpl->getUpdatableNames(apexName, _aidl_return); + } android::binder::Status getConnectionInfo( const std::string& name, std::optional<android::os::ConnectionInfo>* _aidl_return) override { diff --git a/libs/fakeservicemanager/ServiceManager.cpp b/libs/fakeservicemanager/ServiceManager.cpp index 6c6d7f3641..480ec79725 100644 --- a/libs/fakeservicemanager/ServiceManager.cpp +++ b/libs/fakeservicemanager/ServiceManager.cpp @@ -78,6 +78,11 @@ std::optional<String16> ServiceManager::updatableViaApex(const String16& name) { return std::nullopt; } +Vector<String16> ServiceManager::getUpdatableNames(const String16& apexName) { + (void)apexName; + return {}; +} + std::optional<IServiceManager::ConnectionInfo> ServiceManager::getConnectionInfo( const String16& name) { (void)name; diff --git a/libs/fakeservicemanager/include/fakeservicemanager/ServiceManager.h b/libs/fakeservicemanager/include/fakeservicemanager/ServiceManager.h index e0af5d4ba8..ee0637eb7e 100644 --- a/libs/fakeservicemanager/include/fakeservicemanager/ServiceManager.h +++ b/libs/fakeservicemanager/include/fakeservicemanager/ServiceManager.h @@ -52,6 +52,8 @@ public: std::optional<String16> updatableViaApex(const String16& name) override; + Vector<String16> getUpdatableNames(const String16& apexName) override; + std::optional<IServiceManager::ConnectionInfo> getConnectionInfo(const String16& name) override; status_t registerForNotifications(const String16& name, |