Merge "libhidlmemory: clarify mapMemory function."
diff --git a/Android.bp b/Android.bp
index 962984c..e97c28c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,6 +16,7 @@
"adapter",
"base", // libhidlbase
"libhidlmemory", // libhidlmemory
+ "minijail",
"transport", // libhidltransport
]
diff --git a/adapter/Android.bp b/adapter/Android.bp
index 9bedb7b..a814e10 100644
--- a/adapter/Android.bp
+++ b/adapter/Android.bp
@@ -14,6 +14,7 @@
cc_library_shared {
name: "libhidladapter",
+ defaults: ["libhidl-defaults"],
vendor_available: true,
srcs: [
"HidlBinderAdapter.cpp"
diff --git a/base/SynchronizedQueue.h b/base/SynchronizedQueue.h
index 0ef9e4f..356c72c 100644
--- a/base/SynchronizedQueue.h
+++ b/base/SynchronizedQueue.h
@@ -61,7 +61,7 @@
std::mutex mMutex;
std::queue<T> mQueue;
const size_t mQueueLimit;
- bool mInitialized;
+ bool mInitialized = false;
};
template <typename T>
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index c8d8db9..ab16709 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -290,6 +290,7 @@
static_assert(hidl_vec<T>::kOffsetOfBuffer == 0, "wrong offset");
}
+ // Note, does not initialize primitive types.
hidl_vec(size_t size) : hidl_vec() { resize(size); }
hidl_vec(const hidl_vec<T> &other) : hidl_vec() {
@@ -448,6 +449,7 @@
return mBuffer[index];
}
+ // Does not initialize primitive types if new size > old size.
void resize(size_t size) {
if (size > UINT32_MAX) {
details::logAlwaysFatal("hidl_vec can't hold more than 2^32 elements.");
diff --git a/minijail/Android.bp b/minijail/Android.bp
new file mode 100644
index 0000000..c01a12b
--- /dev/null
+++ b/minijail/Android.bp
@@ -0,0 +1,13 @@
+cc_library_shared {
+ name: "libhwminijail",
+ defaults: ["hidl_defaults"],
+ vendor: true,
+ export_include_dirs: ["include"],
+
+ srcs: ["HardwareMinijail.cpp"],
+
+ shared_libs: [
+ "libbase",
+ "libminijail",
+ ],
+}
diff --git a/minijail/HardwareMinijail.cpp b/minijail/HardwareMinijail.cpp
new file mode 100644
index 0000000..e6b1144
--- /dev/null
+++ b/minijail/HardwareMinijail.cpp
@@ -0,0 +1,45 @@
+//
+// Copyright (C) 2017 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.
+//
+
+#include <android-base/logging.h>
+#include <libminijail.h>
+
+#include <hwminijail/HardwareMinijail.h>
+
+namespace android {
+namespace hardware {
+
+void SetupMinijail(const std::string& seccomp_policy_path) {
+ if (access(seccomp_policy_path.c_str(), R_OK) == -1) {
+ LOG(WARNING) << "Could not find seccomp policy file at: " << seccomp_policy_path;
+ return;
+ }
+
+ struct minijail* jail = minijail_new();
+ if (jail == NULL) {
+ LOG(FATAL) << "Failed to create minijail.";
+ }
+
+ minijail_no_new_privs(jail);
+ minijail_log_seccomp_filter_failures(jail);
+ minijail_use_seccomp_filter(jail);
+ minijail_parse_seccomp_filters(jail, seccomp_policy_path.c_str());
+ minijail_enter(jail);
+ minijail_destroy(jail);
+}
+
+} // namespace hardware
+} // namespace android
diff --git a/minijail/include/hwminijail/HardwareMinijail.h b/minijail/include/hwminijail/HardwareMinijail.h
new file mode 100644
index 0000000..8fcf007
--- /dev/null
+++ b/minijail/include/hwminijail/HardwareMinijail.h
@@ -0,0 +1,30 @@
+//
+// Copyright (C) 2017 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.
+//
+
+#ifndef ANDROID_HARDWARE_CONFIGSTORE_MINIJAIL_H
+#define ANDROID_HARDWARE_CONFIGSTORE_MINIJAIL_H
+
+#include <string>
+
+namespace android {
+namespace hardware {
+
+void SetupMinijail(const std::string& seccomp_policy_path);
+
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
diff --git a/test_main.cpp b/test_main.cpp
index 89040c3..2811612 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -177,13 +177,11 @@
TEST_F(LibHidlTest, VecInitTest) {
using android::hardware::hidl_vec;
using std::vector;
- int32_t empty[3] = {0};
int32_t array[] = {5, 6, 7};
vector<int32_t> v(array, array + 3);
hidl_vec<int32_t> hv0(3); // size
- EXPECT_EQ(hv0.size(), 3ul);
- EXPECT_ARRAYEQ(hv0, empty, 3);
+ EXPECT_EQ(hv0.size(), 3ul); // cannot say anything about its contents
hidl_vec<int32_t> hv1 = v; // copy =
EXPECT_ARRAYEQ(hv1, array, 3);
diff --git a/transport/Android.bp b/transport/Android.bp
index 421c7a4..23f6904 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -70,6 +70,7 @@
srcs: [
"HidlBinderSupport.cpp",
+ "HidlPassthroughSupport.cpp",
"HidlTransportSupport.cpp",
"HidlTransportUtils.cpp",
"ServiceManagement.cpp",
@@ -80,5 +81,8 @@
debuggable: {
cflags: ["-DLIBHIDL_TARGET_DEBUGGABLE"],
},
+ treble: {
+ cflags: ["-DLIBHIDL_TARGET_TREBLE"]
+ },
},
}
diff --git a/transport/Android.mk b/transport/Android.mk
new file mode 100644
index 0000000..0c6c3b4
--- /dev/null
+++ b/transport/Android.mk
@@ -0,0 +1,55 @@
+# This is a legacy library which is depended on by some old hidl-generated
+# makefiles. Now, '-java' libraries can work as both static and non-static
+# libraries.
+
+################################################################################
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hidl.base-V1.0-java-static
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+intermediates := $(call local-generated-sources-dir, COMMON)
+
+HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVA_LIBRARIES := core-oj hwbinder
+
+#
+# Build types.hal (DebugInfo)
+#
+GEN := $(intermediates)/android/hidl/base/V1_0/DebugInfo.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/base/1.0/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+ $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+ -Ljava \
+ -randroid.hidl:system/libhidl/transport \
+ android.hidl.base@1.0::types.DebugInfo
+
+$(GEN): $(LOCAL_PATH)/base/1.0/types.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build IBase.hal
+#
+GEN := $(intermediates)/android/hidl/base/V1_0/IBase.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/base/1.0/IBase.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/base/1.0/types.hal
+$(GEN): $(LOCAL_PATH)/base/1.0/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+ $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+ -Ljava \
+ -randroid.hidl:system/libhidl/transport \
+ android.hidl.base@1.0::IBase
+
+$(GEN): $(LOCAL_PATH)/base/1.0/IBase.hal
+ $(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/transport/HidlPassthroughSupport.cpp b/transport/HidlPassthroughSupport.cpp
new file mode 100644
index 0000000..e101e27
--- /dev/null
+++ b/transport/HidlPassthroughSupport.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include <hidl/HidlPassthroughSupport.h>
+
+#include <hidl/HidlTransportUtils.h>
+#include <hidl/Static.h>
+
+using ::android::hidl::base::V1_0::IBase;
+
+namespace android {
+namespace hardware {
+namespace details {
+
+sp<IBase> wrapPassthroughInternal(sp<IBase> iface) {
+ if (iface == nullptr || iface->isRemote()) {
+ // doesn't know how to handle it.
+ return iface;
+ }
+ std::string myDescriptor = getDescriptor(iface.get());
+ if (myDescriptor.empty()) {
+ // interfaceDescriptor fails
+ return nullptr;
+ }
+ auto func = gBsConstructorMap.get(myDescriptor, nullptr);
+ if (!func) {
+ return nullptr;
+ }
+
+ sp<IBase> base = func(static_cast<void*>(iface.get()));
+
+ // To ensure this is an instance of IType, we would normally
+ // call castFrom, but gBsConstructorMap guarantees that its
+ // result is of the appropriate type (not necessaryly BsType,
+ // but definitely a child of IType).
+ return base;
+}
+
+} // namespace details
+} // namespace hardware
+} // namespace android
\ No newline at end of file
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
index ea2e32c..0d2f1bf 100644
--- a/transport/HidlTransportSupport.cpp
+++ b/transport/HidlTransportSupport.cpp
@@ -14,7 +14,10 @@
* limitations under the License.
*/
#include <hidl/HidlTransportSupport.h>
+
+#include <android/hidl/manager/1.0/IServiceManager.h>
#include <hidl/HidlBinderSupport.h>
+#include <hidl/ServiceManagement.h>
namespace android {
namespace hardware {
@@ -53,5 +56,116 @@
return true;
}
+namespace details {
+
+sp<::android::hidl::base::V1_0::IBase> getRawServiceInternal(const std::string& descriptor,
+ const std::string& instance,
+ bool retry, bool getStub) {
+ using Transport = ::android::hidl::manager::V1_0::IServiceManager::Transport;
+ using ::android::hidl::base::V1_0::IBase;
+ using ::android::hidl::manager::V1_0::IServiceManager;
+
+ const sp<IServiceManager> sm = defaultServiceManager();
+ if (sm == nullptr) {
+ ALOGE("getService: defaultServiceManager() is null");
+ return nullptr;
+ }
+
+ Return<Transport> transportRet = sm->getTransport(descriptor, instance);
+
+ if (!transportRet.isOk()) {
+ ALOGE("getService: defaultServiceManager()->getTransport returns %s",
+ transportRet.description().c_str());
+ return nullptr;
+ }
+ Transport transport = transportRet;
+ const bool vintfHwbinder = (transport == Transport::HWBINDER);
+ const bool vintfPassthru = (transport == Transport::PASSTHROUGH);
+
+#ifdef LIBHIDL_TARGET_TREBLE
+
+#ifdef LIBHIDL_TARGET_DEBUGGABLE
+ const char* env = std::getenv("TREBLE_TESTING_OVERRIDE");
+ const bool trebleTestingOverride = env && !strcmp(env, "true");
+ const bool vintfLegacy = (transport == Transport::EMPTY) && trebleTestingOverride;
+#else // LIBHIDL_TARGET_TREBLE but not LIBHIDL_TARGET_DEBUGGABLE
+ const bool trebleTestingOverride = false;
+ const bool vintfLegacy = false;
+#endif // LIBHIDL_TARGET_DEBUGGABLE
+
+#else // not LIBHIDL_TARGET_TREBLE
+ const char* env = std::getenv("TREBLE_TESTING_OVERRIDE");
+ const bool trebleTestingOverride = env && !strcmp(env, "true");
+ const bool vintfLegacy = (transport == Transport::EMPTY);
+#endif // LIBHIDL_TARGET_TREBLE
+
+ for (int tries = 0;
+ !getStub && (vintfHwbinder || (vintfLegacy && tries == 0)) && (retry || tries < 1);
+ tries++) {
+ if (tries > 1) {
+ ALOGI("getService: Will do try %d for %s/%s in 1s...", tries, descriptor.c_str(),
+ instance.c_str());
+ sleep(1); // TODO(b/67425500): remove and update waitForHwService function
+ }
+ if (vintfHwbinder && tries > 0) {
+ waitForHwService(descriptor, instance);
+ }
+ Return<sp<IBase>> ret = sm->get(descriptor, instance);
+ if (!ret.isOk()) {
+ ALOGE("getService: defaultServiceManager()->get returns %s for %s/%s.",
+ ret.description().c_str(), descriptor.c_str(), instance.c_str());
+ break;
+ }
+ sp<IBase> base = ret;
+ if (base == nullptr) {
+ if (tries > 0) {
+ ALOGW("getService: found unexpected null hwbinder interface for %s/%s.",
+ descriptor.c_str(), instance.c_str());
+ }
+ continue;
+ }
+
+ Return<bool> canCastRet =
+ details::canCastInterface(base.get(), descriptor.c_str(), true /* emitError */);
+
+ if (!canCastRet.isOk()) {
+ if (canCastRet.isDeadObject()) {
+ ALOGW("getService: found dead hwbinder service for %s/%s.", descriptor.c_str(),
+ instance.c_str());
+ continue;
+ }
+ // TODO(b/67425500): breaks getService == nullptr => hal available assumptions if the
+ // service has a transaction failure (one example of this is if the service's binder
+ // buffer is full). If this isn't here, you get an infinite loop when you don't have
+ // permission to talk to a service.
+ ALOGW("getService: unable to call into hwbinder service for %s/%s.", descriptor.c_str(),
+ instance.c_str());
+ break;
+ }
+
+ if (!canCastRet) {
+ ALOGW("getService: received incompatible service (bug in hwservicemanager?) for %s/%s.",
+ descriptor.c_str(), instance.c_str());
+ break;
+ }
+
+ return base; // still needs to be wrapped by Bp class.
+ }
+
+ if (getStub || vintfPassthru || vintfLegacy) {
+ const sp<IServiceManager> pm = getPassthroughServiceManager();
+ if (pm != nullptr) {
+ sp<IBase> base = pm->get(descriptor, instance).withDefault(nullptr);
+ if (!getStub || trebleTestingOverride) {
+ base = wrapPassthrough(base);
+ }
+ return base;
+ }
+ }
+
+ return nullptr;
}
-}
+
+} // namespace details
+} // namespace hardware
+} // namespace android
diff --git a/transport/allocator/1.0/Android.bp b/transport/allocator/1.0/Android.bp
index 219cd79..f02d1d1 100644
--- a/transport/allocator/1.0/Android.bp
+++ b/transport/allocator/1.0/Android.bp
@@ -61,6 +61,11 @@
],
}
+// This package is not java compatible. Not creating java target.
+
+// This package does not export any types. Not creating java constants export.
+
+
genrule {
name: "android.hidl.allocator@1.0-adapter-helper_genc++",
tools: ["hidl-gen"],
@@ -85,7 +90,6 @@
],
}
-
cc_library {
name: "android.hidl.allocator@1.0-adapter-helper",
defaults: ["hidl-module-defaults"],
@@ -124,6 +128,7 @@
cc_test {
name: "android.hidl.allocator@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
shared_libs: [
"libhidladapter",
"libhidlbase",
diff --git a/transport/base/1.0/Android.bp b/transport/base/1.0/Android.bp
index 5ea7eda..73ee5cf 100644
--- a/transport/base/1.0/Android.bp
+++ b/transport/base/1.0/Android.bp
@@ -42,6 +42,32 @@
// android.hidl.base@1.0 is exported from libhidltransport
genrule {
+ name: "android.hidl.base-V1.0-java_gen_java",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Ljava -randroid.hidl:system/libhidl/transport android.hidl.base@1.0",
+ srcs: [
+ ":android.hidl.base@1.0_hal",
+ ],
+ out: [
+ "android/hidl/base/V1_0/DebugInfo.java",
+ "android/hidl/base/V1_0/IBase.java",
+ ],
+}
+
+java_library {
+ name: "android.hidl.base-V1.0-java",
+ no_framework_libs: true,
+ defaults: ["hidl-java-module-defaults"],
+ srcs: [":android.hidl.base-V1.0-java_gen_java"],
+ libs: [
+ "hwbinder",
+ ]
+}
+
+// This package does not export any types. Not creating java constants export.
+
+
+genrule {
name: "android.hidl.base@1.0-adapter-helper_genc++",
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-sources -randroid.hidl:system/libhidl/transport android.hidl.base@1.0",
@@ -65,7 +91,6 @@
],
}
-
cc_library {
name: "android.hidl.base@1.0-adapter-helper",
defaults: ["hidl-module-defaults"],
@@ -100,6 +125,7 @@
cc_test {
name: "android.hidl.base@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
shared_libs: [
"libhidladapter",
"libhidlbase",
diff --git a/transport/base/1.0/Android.mk b/transport/base/1.0/Android.mk
deleted file mode 100644
index a044b9b..0000000
--- a/transport/base/1.0/Android.mk
+++ /dev/null
@@ -1,110 +0,0 @@
-# This file is autogenerated by hidl-gen. Do not edit manually.
-
-LOCAL_PATH := $(call my-dir)
-
-################################################################################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.base-V1.0-java
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-intermediates := $(call local-generated-sources-dir, COMMON)
-
-HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := core-oj hwbinder
-
-#
-# Build types.hal (DebugInfo)
-#
-GEN := $(intermediates)/android/hidl/base/V1_0/DebugInfo.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.base@1.0::types.DebugInfo
-
-$(GEN): $(LOCAL_PATH)/types.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build IBase.hal
-#
-GEN := $(intermediates)/android/hidl/base/V1_0/IBase.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBase.hal
-$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
-$(GEN): $(LOCAL_PATH)/types.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.base@1.0::IBase
-
-$(GEN): $(LOCAL_PATH)/IBase.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-include $(BUILD_JAVA_LIBRARY)
-
-
-################################################################################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.base-V1.0-java-static
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-intermediates := $(call local-generated-sources-dir, COMMON)
-
-HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := core-oj hwbinder
-
-#
-# Build types.hal (DebugInfo)
-#
-GEN := $(intermediates)/android/hidl/base/V1_0/DebugInfo.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.base@1.0::types.DebugInfo
-
-$(GEN): $(LOCAL_PATH)/types.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build IBase.hal
-#
-GEN := $(intermediates)/android/hidl/base/V1_0/IBase.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBase.hal
-$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
-$(GEN): $(LOCAL_PATH)/types.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.base@1.0::IBase
-
-$(GEN): $(LOCAL_PATH)/IBase.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/transport/include/hidl/HidlPassthroughSupport.h b/transport/include/hidl/HidlPassthroughSupport.h
index 4fb1ae4..a0f10f3 100644
--- a/transport/include/hidl/HidlPassthroughSupport.h
+++ b/transport/include/hidl/HidlPassthroughSupport.h
@@ -24,26 +24,25 @@
namespace details {
/*
- * Wrap the given interface with the smallest BsChild possible. Will return the
+ * Wrap the given interface with the lowest BsChild possible. Will return the
* argument directly if nullptr or isRemote().
+ *
+ * Note that 'static_cast<IFoo*>(wrapPassthrough(foo).get()) is guaranteed to work'
+ * assuming that foo is an instance of IFoo.
+ *
+ * TODO(b/33754152): calling this method multiple times should not re-wrap.
*/
-template<typename IType>
-sp<::android::hidl::base::V1_0::IBase> wrapPassthrough(
- sp<IType> iface) {
- if (iface.get() == nullptr || iface->isRemote()) {
- // doesn't know how to handle it.
- return iface;
- }
- std::string myDescriptor = getDescriptor(iface.get());
- if (myDescriptor.empty()) {
- // interfaceDescriptor fails
- return nullptr;
- }
- auto func = gBsConstructorMap.get(myDescriptor, nullptr);
- if (!func) {
- return nullptr;
- }
- return func(static_cast<void *>(iface.get()));
+sp<::android::hidl::base::V1_0::IBase> wrapPassthroughInternal(
+ sp<::android::hidl::base::V1_0::IBase> iface);
+
+/**
+ * Helper method which provides reasonable code to wrapPassthroughInternal
+ * which can be used to call wrapPassthrough.
+ */
+template <typename IType,
+ typename = std::enable_if_t<std::is_same<i_tag, typename IType::_hidl_tag>::value>>
+sp<IType> wrapPassthrough(sp<IType> iface) {
+ return static_cast<IType*>(wrapPassthroughInternal(iface).get());
}
} // namespace details
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index 18a4036..4c9a881 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -19,6 +19,7 @@
#include <android/hidl/base/1.0/IBase.h>
#include <hidl/HidlBinderSupport.h>
+#include <hidl/HidlPassthroughSupport.h>
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportUtils.h>
@@ -106,10 +107,40 @@
// binderized mode. Got BpChild. grab the remote and wrap it.
return sp<IChild>(new BpChild(toBinder<IParent>(parent)));
}
- // Passthrough mode. Got BnChild and BsChild.
+ // Passthrough mode. Got BnChild or BsChild.
return sp<IChild>(static_cast<IChild *>(parent.get()));
}
+// Returns a service with the following constraints:
+// - retry => service is waited for and returned if available in this process
+// - getStub => internal only. Forces to get the unwrapped (no BsFoo) if available.
+// TODO(b/65843592)
+// If the service is a remote service, this function returns BpBase. If the service is
+// a passthrough service, this function returns the appropriately wrapped Bs child object.
+sp<::android::hidl::base::V1_0::IBase> getRawServiceInternal(const std::string& descriptor,
+ const std::string& instance,
+ bool retry, bool getStub);
+
+template <typename BpType, typename IType = typename BpType::Pure,
+ typename = std::enable_if_t<std::is_same<i_tag, typename IType::_hidl_tag>::value>,
+ typename = std::enable_if_t<std::is_same<bphw_tag, typename BpType::_hidl_tag>::value>>
+sp<IType> getServiceInternal(const std::string& instance, bool retry, bool getStub) {
+ using ::android::hidl::base::V1_0::IBase;
+
+ sp<IBase> base = getRawServiceInternal(IType::descriptor, instance, retry, getStub);
+
+ if (base == nullptr) {
+ return nullptr;
+ }
+
+ if (base->isRemote()) {
+ // getRawServiceInternal guarantees we get the proper class
+ return sp<IType>(new BpType(toBinder<IBase>(base)));
+ }
+
+ return IType::castFrom(base);
+}
+
} // namespace details
} // namespace hardware
diff --git a/transport/manager/1.0/Android.bp b/transport/manager/1.0/Android.bp
index 23ea0b6..a0898d7 100644
--- a/transport/manager/1.0/Android.bp
+++ b/transport/manager/1.0/Android.bp
@@ -45,6 +45,33 @@
// android.hidl.manager@1.0 is exported from libhidltransport
genrule {
+ name: "android.hidl.manager-V1.0-java_gen_java",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Ljava -randroid.hidl:system/libhidl/transport android.hidl.manager@1.0",
+ srcs: [
+ ":android.hidl.manager@1.0_hal",
+ ],
+ out: [
+ "android/hidl/manager/V1_0/IServiceManager.java",
+ "android/hidl/manager/V1_0/IServiceNotification.java",
+ ],
+}
+
+java_library {
+ name: "android.hidl.manager-V1.0-java",
+ no_framework_libs: true,
+ defaults: ["hidl-java-module-defaults"],
+ srcs: [":android.hidl.manager-V1.0-java_gen_java"],
+ libs: [
+ "hwbinder",
+ "android.hidl.base-V1.0-java",
+ ]
+}
+
+// This package does not export any types. Not creating java constants export.
+
+
+genrule {
name: "android.hidl.manager@1.0-adapter-helper_genc++",
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-sources -randroid.hidl:system/libhidl/transport android.hidl.manager@1.0",
@@ -70,7 +97,6 @@
],
}
-
cc_library {
name: "android.hidl.manager@1.0-adapter-helper",
defaults: ["hidl-module-defaults"],
@@ -107,6 +133,7 @@
cc_test {
name: "android.hidl.manager@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
shared_libs: [
"libhidladapter",
"libhidlbase",
diff --git a/transport/manager/1.0/Android.mk b/transport/manager/1.0/Android.mk
deleted file mode 100644
index 6de28c0..0000000
--- a/transport/manager/1.0/Android.mk
+++ /dev/null
@@ -1,62 +0,0 @@
-# This file is autogenerated by hidl-gen. Do not edit manually.
-
-LOCAL_PATH := $(call my-dir)
-
-################################################################################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.manager-V1.0-java
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-intermediates := $(call local-generated-sources-dir, COMMON)
-
-HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
-
-LOCAL_JAVA_LIBRARIES := \
- android.hidl.base-V1.0-java \
-
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES += core-oj hwbinder
-
-#
-# Build IServiceManager.hal
-#
-GEN := $(intermediates)/android/hidl/manager/V1_0/IServiceManager.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IServiceManager.hal
-$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IServiceNotification.hal
-$(GEN): $(LOCAL_PATH)/IServiceNotification.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.manager@1.0::IServiceManager
-
-$(GEN): $(LOCAL_PATH)/IServiceManager.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build IServiceNotification.hal
-#
-GEN := $(intermediates)/android/hidl/manager/V1_0/IServiceNotification.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IServiceNotification.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.manager@1.0::IServiceNotification
-
-$(GEN): $(LOCAL_PATH)/IServiceNotification.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-include $(BUILD_JAVA_LIBRARY)
-
-
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/transport/manager/1.1/Android.bp b/transport/manager/1.1/Android.bp
index 01fe35a..7a4094e 100644
--- a/transport/manager/1.1/Android.bp
+++ b/transport/manager/1.1/Android.bp
@@ -38,6 +38,33 @@
// android.hidl.manager@1.1 is exported from libhidltransport
genrule {
+ name: "android.hidl.manager-V1.1-java_gen_java",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Ljava -randroid.hidl:system/libhidl/transport android.hidl.manager@1.1",
+ srcs: [
+ ":android.hidl.manager@1.1_hal",
+ ],
+ out: [
+ "android/hidl/manager/V1_1/IServiceManager.java",
+ ],
+}
+
+java_library {
+ name: "android.hidl.manager-V1.1-java",
+ no_framework_libs: true,
+ defaults: ["hidl-java-module-defaults"],
+ srcs: [":android.hidl.manager-V1.1-java_gen_java"],
+ libs: [
+ "hwbinder",
+ "android.hidl.base-V1.0-java",
+ "android.hidl.manager-V1.0-java",
+ ]
+}
+
+// This package does not export any types. Not creating java constants export.
+
+
+genrule {
name: "android.hidl.manager@1.1-adapter-helper_genc++",
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-sources -randroid.hidl:system/libhidl/transport android.hidl.manager@1.1",
@@ -61,7 +88,6 @@
],
}
-
cc_library {
name: "android.hidl.manager@1.1-adapter-helper",
defaults: ["hidl-module-defaults"],
@@ -100,6 +126,7 @@
cc_test {
name: "android.hidl.manager@1.1-adapter",
+ defaults: ["hidl-module-defaults"],
shared_libs: [
"libhidladapter",
"libhidlbase",
diff --git a/transport/manager/1.1/Android.mk b/transport/manager/1.1/Android.mk
deleted file mode 100644
index 58bfd1d..0000000
--- a/transport/manager/1.1/Android.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-# This file is autogenerated by hidl-gen. Do not edit manually.
-
-LOCAL_PATH := $(call my-dir)
-
-################################################################################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.manager-V1.1-java
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-intermediates := $(call local-generated-sources-dir, COMMON)
-
-HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
-
-LOCAL_JAVA_LIBRARIES := \
- android.hidl.base-V1.0-java \
- android.hidl.manager-V1.0-java \
-
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES += core-oj hwbinder
-
-#
-# Build IServiceManager.hal
-#
-GEN := $(intermediates)/android/hidl/manager/V1_1/IServiceManager.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IServiceManager.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.manager@1.1::IServiceManager
-
-$(GEN): $(LOCAL_PATH)/IServiceManager.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-include $(BUILD_JAVA_LIBRARY)
-
-
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/transport/memory/1.0/Android.bp b/transport/memory/1.0/Android.bp
index d68fd3a..cf24616 100644
--- a/transport/memory/1.0/Android.bp
+++ b/transport/memory/1.0/Android.bp
@@ -69,6 +69,11 @@
],
}
+// This package is not java compatible. Not creating java target.
+
+// This package does not export any types. Not creating java constants export.
+
+
genrule {
name: "android.hidl.memory@1.0-adapter-helper_genc++",
tools: ["hidl-gen"],
@@ -95,7 +100,6 @@
],
}
-
cc_library {
name: "android.hidl.memory@1.0-adapter-helper",
defaults: ["hidl-module-defaults"],
@@ -134,6 +138,7 @@
cc_test {
name: "android.hidl.memory@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
shared_libs: [
"libhidladapter",
"libhidlbase",
diff --git a/transport/token/1.0/Android.bp b/transport/token/1.0/Android.bp
index a623a57..1bc6d97 100644
--- a/transport/token/1.0/Android.bp
+++ b/transport/token/1.0/Android.bp
@@ -62,6 +62,32 @@
}
genrule {
+ name: "android.hidl.token-V1.0-java_gen_java",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Ljava -randroid.hidl:system/libhidl/transport android.hidl.token@1.0",
+ srcs: [
+ ":android.hidl.token@1.0_hal",
+ ],
+ out: [
+ "android/hidl/token/V1_0/ITokenManager.java",
+ ],
+}
+
+java_library {
+ name: "android.hidl.token-V1.0-java",
+ no_framework_libs: true,
+ defaults: ["hidl-java-module-defaults"],
+ srcs: [":android.hidl.token-V1.0-java_gen_java"],
+ libs: [
+ "hwbinder",
+ "android.hidl.base-V1.0-java",
+ ]
+}
+
+// This package does not export any types. Not creating java constants export.
+
+
+genrule {
name: "android.hidl.token@1.0-adapter-helper_genc++",
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-sources -randroid.hidl:system/libhidl/transport android.hidl.token@1.0",
@@ -85,7 +111,6 @@
],
}
-
cc_library {
name: "android.hidl.token@1.0-adapter-helper",
defaults: ["hidl-module-defaults"],
@@ -124,6 +149,7 @@
cc_test {
name: "android.hidl.token@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
shared_libs: [
"libhidladapter",
"libhidlbase",
diff --git a/transport/token/1.0/Android.mk b/transport/token/1.0/Android.mk
deleted file mode 100644
index 3251f39..0000000
--- a/transport/token/1.0/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# This file is autogenerated by hidl-gen. Do not edit manually.
-
-LOCAL_PATH := $(call my-dir)
-
-################################################################################
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.token-V1.0-java
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-intermediates := $(call local-generated-sources-dir, COMMON)
-
-HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
-
-LOCAL_JAVA_LIBRARIES := \
- android.hidl.base-V1.0-java \
-
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES += core-oj hwbinder
-
-#
-# Build ITokenManager.hal
-#
-GEN := $(intermediates)/android/hidl/token/V1_0/ITokenManager.java
-$(GEN): $(HIDL)
-$(GEN): PRIVATE_HIDL := $(HIDL)
-$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/ITokenManager.hal
-$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
-$(GEN): PRIVATE_CUSTOM_TOOL = \
- $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
- -Ljava \
- -randroid.hidl:system/libhidl/transport \
- android.hidl.token@1.0::ITokenManager
-
-$(GEN): $(LOCAL_PATH)/ITokenManager.hal
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-include $(BUILD_JAVA_LIBRARY)
-
-
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/transport/token/1.0/utils/Android.bp b/transport/token/1.0/utils/Android.bp
index b37faf5..fcb1613 100644
--- a/transport/token/1.0/utils/Android.bp
+++ b/transport/token/1.0/utils/Android.bp
@@ -14,6 +14,7 @@
cc_library {
name: "android.hidl.token@1.0-utils",
+ defaults: ["libhidl-defaults"],
vendor_available: true,
vndk: {
enabled: true,
diff --git a/update-makefiles.sh b/update-makefiles.sh
index df3d4b1..fd0a23c 100755
--- a/update-makefiles.sh
+++ b/update-makefiles.sh
@@ -11,6 +11,5 @@
for package in "${packages[@]}"; do
echo "Updating $package."
- hidl-gen -Lmakefile -r android.hidl:system/libhidl/transport $package
hidl-gen -Landroidbp -r android.hidl:system/libhidl/transport $package
done