summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--transport/ServiceManagement.cpp116
-rw-r--r--vintfdata/frozen/6.xml116
-rw-r--r--vintfdata/frozen/7.xml100
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>