diff options
-rw-r--r-- | transport/ServiceManagement.cpp | 116 | ||||
-rw-r--r-- | vintfdata/frozen/6.xml | 116 | ||||
-rw-r--r-- | vintfdata/frozen/7.xml | 100 |
3 files changed, 332 insertions, 0 deletions
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp index c638279..5d1979f 100644 --- a/transport/ServiceManagement.cpp +++ b/transport/ServiceManagement.cpp @@ -59,6 +59,7 @@ using IServiceManager1_0 = android::hidl::manager::V1_0::IServiceManager; using IServiceManager1_1 = android::hidl::manager::V1_1::IServiceManager; using IServiceManager1_2 = android::hidl::manager::V1_2::IServiceManager; using ::android::hidl::manager::V1_0::IServiceNotification; +using ::android::hidl::manager::V1_2::IClientCallback; namespace android { namespace hardware { @@ -201,6 +202,109 @@ sp<IServiceManager1_0> defaultServiceManager() { sp<IServiceManager1_1> defaultServiceManager1_1() { return defaultServiceManager1_2(); } +static bool isServiceManager(const hidl_string& fqName) { + return fqName == IServiceManager1_0::descriptor || fqName == IServiceManager1_1::descriptor || + fqName == IServiceManager1_2::descriptor; +} +static bool isHwServiceManagerInstalled() { + return access("/system/bin/hwservicemanager", F_OK) == 0; +} + +/* + * A replacement for hwservicemanager when it is not installed on a device. + * + * Clients in the framework need to continue supporting HIDL services through + * hwservicemanager for upgrading devices. Being unable to get an instance of + * hardware service manager is a hard error, so this implementation is returned + * to be able service the requests and tell clients there are no services + * registered. + */ +struct NoHwServiceManager : public IServiceManager1_2 { + Return<sp<IBase>> get(const hidl_string& fqName, const hidl_string&) override { + sp<IBase> ret = nullptr; + + if (isServiceManager(fqName)) { + ret = defaultServiceManager1_2(); + } + return ret; + } + + Return<bool> add(const hidl_string& name, const sp<IBase>& /* service */) override { + LOG(INFO) << "Cannot add " << name << " without hwservicemanager"; + return false; + } + + Return<Transport> getTransport(const hidl_string& fqName, const hidl_string& name) { + LOG(INFO) << "Trying to get transport of " << fqName << "/" << name + << " without hwservicemanager"; + return Transport::PASSTHROUGH; + } + + Return<void> list(list_cb _hidl_cb) override { + _hidl_cb({}); + LOG(INFO) << "Cannot list all services without hwservicemanager"; + return Void(); + } + Return<void> listByInterface(const hidl_string& fqName, listByInterface_cb _hidl_cb) override { + _hidl_cb({}); + LOG(INFO) << "Cannot list service " << fqName << " without hwservicemanager"; + return Void(); + } + + Return<bool> registerForNotifications(const hidl_string& fqName, const hidl_string& name, + const sp<IServiceNotification>& /* callback */) override { + LOG(INFO) << "Cannot register for notifications for " << fqName << "/" << name + << " without hwservicemanager"; + return false; + } + + Return<void> debugDump(debugDump_cb _hidl_cb) override { + _hidl_cb({}); + return Void(); + } + + Return<void> registerPassthroughClient(const hidl_string& fqName, + const hidl_string& name) override { + LOG(INFO) << "This process is a client of " << fqName << "/" << name + << " passthrough HAL, but it won't show up in lshal because hwservicemanager is " + "not installed"; + return Void(); + } + + Return<bool> unregisterForNotifications( + const hidl_string& fqName, const hidl_string& name, + const sp<IServiceNotification>& /* callback */) override { + LOG(INFO) << "Cannot unregister for notifications for " << fqName << "/" << name + << " without hwservicemanager"; + return false; + } + Return<bool> registerClientCallback(const hidl_string& fqName, const hidl_string& name, + const sp<IBase>&, const sp<IClientCallback>&) { + LOG(INFO) << "Cannot add client callback for " << fqName << "/" << name + << " without hwservicemanager"; + return false; + } + Return<bool> unregisterClientCallback(const sp<IBase>&, const sp<IClientCallback>&) { + LOG(INFO) << "Cannot unregister client callbacks without hwservicemanager"; + return false; + } + Return<bool> addWithChain(const hidl_string& fqName, const sp<IBase>&, + const hidl_vec<hidl_string>&) { + LOG(INFO) << "Cannot add " << fqName << " with chain without hwservicemanager"; + return false; + } + Return<void> listManifestByInterface(const hidl_string& fqName, listManifestByInterface_cb) { + LOG(INFO) << "Cannot list manifest for " << fqName << " without hwservicemanager"; + return Void(); + } + Return<bool> tryUnregister(const hidl_string& fqName, const hidl_string& name, + const sp<IBase>&) { + LOG(INFO) << "Cannot unregister service " << fqName << "/" << name + << " without hwservicemanager"; + return false; + } +}; + sp<IServiceManager1_2> defaultServiceManager1_2() { using android::hidl::manager::V1_2::BnHwServiceManager; using android::hidl::manager::V1_2::BpHwServiceManager; @@ -214,6 +318,12 @@ sp<IServiceManager1_2> defaultServiceManager1_2() { return gDefaultServiceManager; } + if (!isHwServiceManagerInstalled()) { + // hwservicemanager is not available on this device. + gDefaultServiceManager = sp<NoHwServiceManager>::make(); + return gDefaultServiceManager; + } + if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) { // HwBinder not available on this device or not accessible to // this process. @@ -410,6 +520,12 @@ struct PassthroughServiceManager : IServiceManager1_1 { Return<sp<IBase>> get(const hidl_string& fqName, const hidl_string& name) override { sp<IBase> ret = nullptr; + // This is required to run without hwservicemanager while we have + // passthrough HIDL services. Once the passthrough HIDL services have + // been removed, the PassthroughServiceManager will no longer be needed. + if (!isHwServiceManagerInstalled() && isServiceManager(fqName)) { + return defaultServiceManager1_2(); + } openLibs(fqName, [&](void* handle, const std::string &lib, const std::string &sym) { IBase* (*generator)(const char* name); diff --git a/vintfdata/frozen/6.xml b/vintfdata/frozen/6.xml new file mode 100644 index 0000000..eb078c0 --- /dev/null +++ b/vintfdata/frozen/6.xml @@ -0,0 +1,116 @@ +<compatibility-matrix version="5.0" type="device"> + <!-- + cameraserver is installed for all phones and tablets, but not + auto or TV. + --> + <hal format="hidl" optional="true"> + <name>android.frameworks.cameraservice.service</name> + <version>2.2</version> + <interface> + <name>ICameraService</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.frameworks.displayservice</name> + <version>1.0</version> + <interface> + <name>IDisplayService</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.frameworks.sensorservice</name> + <version>1.0</version> + <interface> + <name>ISensorManager</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="false"> + <name>android.frameworks.stats</name> + <interface> + <name>IStats</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hardware.media.c2</name> + <version>1.2</version> + <interface> + <name>IComponentStore</name> + <instance>software</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.allocator</name> + <version>1.0</version> + <interface> + <name>IAllocator</name> + <instance>ashmem</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.manager</name> + <version>1.2</version> + <interface> + <name>IServiceManager</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.memory</name> + <version>1.0</version> + <interface> + <name>IMapper</name> + <instance>ashmem</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.token</name> + <version>1.0</version> + <interface> + <name>ITokenManager</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="false"> + <name>android.system.keystore2</name> + <version>2</version> + <interface> + <name>IKeystoreService</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.system.net.netd</name> + <version>1.1</version> + <interface> + <name>INetd</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.system.suspend</name> + <version>1.0</version> + <interface> + <name>ISystemSuspend</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="false"> + <name>android.system.suspend</name> + <interface> + <name>ISystemSuspend</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.system.wifi.keystore</name> + <version>1.0</version> + <interface> + <name>IKeystore</name> + <instance>default</instance> + </interface> + </hal> +</compatibility-matrix> diff --git a/vintfdata/frozen/7.xml b/vintfdata/frozen/7.xml new file mode 100644 index 0000000..fcfeba7 --- /dev/null +++ b/vintfdata/frozen/7.xml @@ -0,0 +1,100 @@ +<compatibility-matrix version="5.0" type="device"> + <!-- + cameraserver is installed for all phones and tablets, but not + auto or TV. + --> + <hal format="hidl" optional="true"> + <name>android.frameworks.cameraservice.service</name> + <version>2.2</version> + <interface> + <name>ICameraService</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.frameworks.sensorservice</name> + <version>1.0</version> + <interface> + <name>ISensorManager</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="false"> + <name>android.frameworks.stats</name> + <interface> + <name>IStats</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hardware.media.c2</name> + <version>1.2</version> + <interface> + <name>IComponentStore</name> + <instance>software</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.allocator</name> + <version>1.0</version> + <interface> + <name>IAllocator</name> + <instance>ashmem</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.manager</name> + <version>1.2</version> + <interface> + <name>IServiceManager</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.memory</name> + <version>1.0</version> + <interface> + <name>IMapper</name> + <instance>ashmem</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.hidl.token</name> + <version>1.0</version> + <interface> + <name>ITokenManager</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="false"> + <name>android.system.keystore2</name> + <version>2</version> + <interface> + <name>IKeystoreService</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.system.net.netd</name> + <version>1.1</version> + <interface> + <name>INetd</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="false"> + <name>android.system.suspend</name> + <interface> + <name>ISystemSuspend</name> + <instance>default</instance> + </interface> + </hal> + <hal format="hidl" optional="false"> + <name>android.system.wifi.keystore</name> + <version>1.0</version> + <interface> + <name>IKeystore</name> + <instance>default</instance> + </interface> + </hal> +</compatibility-matrix> |