Add definition for IServiceManager 1.2
Adding a new version of IServiceManager to introduce the
following features:
- Better notifications (onRegistration will contain the interface)
- Remove service (for b/64678982, lazy HALs)
- Callbacks to support lazy hal shutdown when there are no clients (b/79983843)
- Method to list interfaces in the manifest (for b/76108617, since if they are
lazy, they will no longer show up in listByInterface)
- Broadcast to all HALs for systrace w/o root (b/78136428)
- Register w/o it having to call interface chain (b/36424585)
This CL intentionally does not introduce a method called
getPassthroughServiceManager1_2 since the passthrough manager
didn't even support 1.1 IServiceManager features. This may
be added in the future if we want some of the above features
in passthrough mode.
Test: (sanity) boot and check for fatal logs
Test: check for @1.2::IServiceManager in lshal
Test: hidl_test
Change-Id: Ife5a439a12e0e016c31187ac0bb62f9e4111113e
diff --git a/transport/Android.bp b/transport/Android.bp
index 9216cd1..27aa952 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -47,16 +47,19 @@
generated_sources: [
"android.hidl.manager@1.0_genc++",
"android.hidl.manager@1.1_genc++",
+ "android.hidl.manager@1.2_genc++",
"android.hidl.base@1.0_genc++"
],
generated_headers: [
"android.hidl.manager@1.0_genc++_headers",
"android.hidl.manager@1.1_genc++_headers",
+ "android.hidl.manager@1.2_genc++_headers",
"android.hidl.base@1.0_genc++_headers"
],
export_generated_headers: [
"android.hidl.manager@1.0_genc++_headers",
"android.hidl.manager@1.1_genc++_headers",
+ "android.hidl.manager@1.2_genc++_headers",
"android.hidl.base@1.0_genc++_headers"
],
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 8c46506..e652c66 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -41,9 +41,9 @@
#include <hwbinder/Parcel.h>
#include <vndksupport/linker.h>
-#include <android/hidl/manager/1.1/IServiceManager.h>
-#include <android/hidl/manager/1.1/BpHwServiceManager.h>
-#include <android/hidl/manager/1.1/BnHwServiceManager.h>
+#include <android/hidl/manager/1.2/BnHwServiceManager.h>
+#include <android/hidl/manager/1.2/BpHwServiceManager.h>
+#include <android/hidl/manager/1.2/IServiceManager.h>
#define RE_COMPONENT "[a-zA-Z_][a-zA-Z_0-9]*"
#define RE_PATH RE_COMPONENT "(?:[.]" RE_COMPONENT ")*"
@@ -53,18 +53,12 @@
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_1::BpHwServiceManager;
-using android::hidl::manager::V1_1::BnHwServiceManager;
namespace android {
namespace hardware {
-namespace details {
-extern Mutex gDefaultServiceManagerLock;
-extern sp<android::hidl::manager::V1_1::IServiceManager> gDefaultServiceManager;
-} // namespace details
-
static const char* kHwServicemanagerReadyProperty = "hwservicemanager.ready";
void waitForHwServiceManager() {
@@ -137,13 +131,22 @@
} // details
sp<IServiceManager1_0> defaultServiceManager() {
- return defaultServiceManager1_1();
+ return defaultServiceManager1_2();
}
sp<IServiceManager1_1> defaultServiceManager1_1() {
+ return defaultServiceManager1_2();
+}
+sp<IServiceManager1_2> defaultServiceManager1_2() {
+ using android::hidl::manager::V1_2::BnHwServiceManager;
+ using android::hidl::manager::V1_2::BpHwServiceManager;
+
+ static std::mutex gDefaultServiceManagerLock;
+ static sp<IServiceManager1_2> gDefaultServiceManager;
+
{
- AutoMutex _l(details::gDefaultServiceManagerLock);
- if (details::gDefaultServiceManager != nullptr) {
- return details::gDefaultServiceManager;
+ std::lock_guard<std::mutex> _l(gDefaultServiceManagerLock);
+ if (gDefaultServiceManager != nullptr) {
+ return gDefaultServiceManager;
}
if (access("/dev/hwbinder", F_OK|R_OK|W_OK) != 0) {
@@ -154,18 +157,18 @@
waitForHwServiceManager();
- while (details::gDefaultServiceManager == nullptr) {
- details::gDefaultServiceManager =
- fromBinder<IServiceManager1_1, BpHwServiceManager, BnHwServiceManager>(
- ProcessState::self()->getContextObject(nullptr));
- if (details::gDefaultServiceManager == nullptr) {
+ while (gDefaultServiceManager == nullptr) {
+ gDefaultServiceManager =
+ fromBinder<IServiceManager1_2, BpHwServiceManager, BnHwServiceManager>(
+ ProcessState::self()->getContextObject(nullptr));
+ if (gDefaultServiceManager == nullptr) {
LOG(ERROR) << "Waited for hwservicemanager, but got nullptr.";
sleep(1);
}
}
}
- return details::gDefaultServiceManager;
+ return gDefaultServiceManager;
}
std::vector<std::string> search(const std::string &path,
diff --git a/transport/Static.cpp b/transport/Static.cpp
index cbe6add..9875311 100644
--- a/transport/Static.cpp
+++ b/transport/Static.cpp
@@ -26,9 +26,6 @@
namespace hardware {
namespace details {
-Mutex gDefaultServiceManagerLock;
-sp<android::hidl::manager::V1_0::IServiceManager> gDefaultServiceManager;
-
// Deprecated; kept for ABI compatibility. Use getBnConstructorMap.
BnConstructorMap gBnConstructorMap{};
diff --git a/transport/include/hidl/ServiceManagement.h b/transport/include/hidl/ServiceManagement.h
index 968c385..a26a282 100644
--- a/transport/include/hidl/ServiceManagement.h
+++ b/transport/include/hidl/ServiceManagement.h
@@ -28,12 +28,15 @@
namespace manager {
namespace V1_0 {
struct IServiceManager;
-}; // namespace V1_0
+}; // namespace V1_0
namespace V1_1 {
- struct IServiceManager;
-}; // namespace V1_0
-}; // namespace manager
-}; // namespace hidl
+struct IServiceManager;
+}; // namespace V1_1
+namespace V1_2 {
+struct IServiceManager;
+}; // namespace V1_2
+}; // namespace manager
+}; // namespace hidl
namespace hardware {
@@ -64,6 +67,7 @@
// of an interface, the best way to do this is by calling IFoo::getService()
sp<::android::hidl::manager::V1_0::IServiceManager> defaultServiceManager();
sp<::android::hidl::manager::V1_1::IServiceManager> defaultServiceManager1_1();
+sp<::android::hidl::manager::V1_2::IServiceManager> defaultServiceManager1_2();
sp<::android::hidl::manager::V1_0::IServiceManager> getPassthroughServiceManager();
sp<::android::hidl::manager::V1_1::IServiceManager> getPassthroughServiceManager1_1();
diff --git a/transport/manager/1.2/Android.bp b/transport/manager/1.2/Android.bp
new file mode 100644
index 0000000..a50426a
--- /dev/null
+++ b/transport/manager/1.2/Android.bp
@@ -0,0 +1,20 @@
+// This file is autogenerated by hidl-gen -Landroidbp.
+
+hidl_interface {
+ name: "android.hidl.manager@1.2",
+ root: "android.hidl",
+ core_interface: true,
+ vndk: {
+ enabled: true,
+ },
+ srcs: [
+ "IServiceManager.hal",
+ ],
+ interfaces: [
+ "android.hidl.base@1.0",
+ "android.hidl.manager@1.0",
+ "android.hidl.manager@1.1",
+ ],
+ gen_java: true,
+}
+
diff --git a/transport/manager/1.2/IServiceManager.hal b/transport/manager/1.2/IServiceManager.hal
new file mode 100644
index 0000000..503cceb
--- /dev/null
+++ b/transport/manager/1.2/IServiceManager.hal
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hidl.manager@1.2;
+
+import @1.1::IServiceManager;
+
+interface IServiceManager extends @1.1::IServiceManager {
+ // TODO(b/66921961): additional functionality for the next release:
+ // - Better notifications (onRegistration will contain the interface)
+ // - Remove service (for b/64678982, lazy HALs)
+ // - Callbacks to support lazy hal shutdown when there are no clients (b/79983843)
+ // - Method to list interfaces in the manifest (for b/76108617, since if they are
+ // lazy, they will no longer show up in listByInterface)
+ // - Broadcast to all HALs for systrace w/o root (b/78136428)
+ // - Register w/o it having to call interface chain (b/36424585)
+};
\ No newline at end of file
diff --git a/update-makefiles.sh b/update-makefiles.sh
index fd0a23c..1a0b892 100755
--- a/update-makefiles.sh
+++ b/update-makefiles.sh
@@ -5,6 +5,7 @@
android.hidl.base@1.0
android.hidl.manager@1.0
android.hidl.manager@1.1
+ android.hidl.manager@1.2
android.hidl.memory@1.0
android.hidl.token@1.0
)
diff --git a/vintfdata/manifest.xml b/vintfdata/manifest.xml
index 3fc2067..582b5eb 100644
--- a/vintfdata/manifest.xml
+++ b/vintfdata/manifest.xml
@@ -2,7 +2,7 @@
<hal>
<name>android.hidl.manager</name>
<transport>hwbinder</transport>
- <version>1.1</version>
+ <version>1.2</version>
<interface>
<name>IServiceManager</name>
<instance>default</instance>