Revert "Fix netutils-wrappers missing <transport/>"
am: ffe90d7852
Change-Id: I66b8da674e525d7e6e38f0a911595ea649bcb6d6
diff --git a/Android.bp b/Android.bp
index ae04548..e97c28c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -13,18 +13,24 @@
// limitations under the License.
subdirs = [
+ "adapter",
"base", // libhidlbase
"libhidlmemory", // libhidlmemory
+ "minijail",
"transport", // libhidltransport
]
-libhidl_flags = [
- "-Wall",
- "-Werror",
-]
+cc_defaults {
+ name: "libhidl-defaults",
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+}
cc_test {
name: "libhidl_test",
+ defaults: ["libhidl-defaults"],
gtest: false,
srcs: ["test_main.cpp"],
@@ -42,5 +48,5 @@
cflags: [
"-O0",
"-g",
- ] + libhidl_flags,
+ ],
}
diff --git a/adapter/Android.bp b/adapter/Android.bp
new file mode 100644
index 0000000..a814e10
--- /dev/null
+++ b/adapter/Android.bp
@@ -0,0 +1,35 @@
+// 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.
+
+cc_library_shared {
+ name: "libhidladapter",
+ defaults: ["libhidl-defaults"],
+ vendor_available: true,
+ srcs: [
+ "HidlBinderAdapter.cpp"
+ ],
+ export_include_dirs: ["include"],
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ ],
+}
+
diff --git a/adapter/HidlBinderAdapter.cpp b/adapter/HidlBinderAdapter.cpp
new file mode 100644
index 0000000..4efe9fb
--- /dev/null
+++ b/adapter/HidlBinderAdapter.cpp
@@ -0,0 +1,126 @@
+/*
+ * 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 <hidladapter/HidlBinderAdapter.h>
+
+#include <android/hidl/base/1.0/IBase.h>
+#include <android/hidl/manager/1.0/IServiceManager.h>
+#include <hidl/HidlTransportSupport.h>
+
+#include <iostream>
+#include <map>
+#include <string>
+
+namespace android {
+namespace hardware {
+namespace details {
+
+int adapterMain(const std::string& package, int argc, char** argv,
+ const AdaptersFactory& adapters) {
+ using android::hardware::configureRpcThreadpool;
+ using android::hidl::base::V1_0::IBase;
+ using android::hidl::manager::V1_0::IServiceManager;
+
+ if (argc != 4) {
+ std::cerr << "usage: " << argv[0] << " interface-name instance-name number-of-threads."
+ << std::endl;
+ return 1;
+ }
+
+ std::string interfaceName = package + "::" + argv[1];
+ std::string instanceName = argv[2];
+ int threadNumber = std::stoi(argv[3]);
+
+ if (threadNumber <= 0) {
+ std::cerr << "ERROR: invalid thread number " << threadNumber
+ << " must be a positive integer.";
+ }
+
+ auto it = adapters.find(interfaceName);
+ if (it == adapters.end()) {
+ std::cerr << "ERROR: could not resolve " << interfaceName << "." << std::endl;
+ return 1;
+ }
+
+ std::cout << "Trying to adapt down " << interfaceName << "/" << instanceName << std::endl;
+
+ configureRpcThreadpool(threadNumber, false /* callerWillJoin */);
+
+ sp<IServiceManager> manager = IServiceManager::getService();
+ if (manager == nullptr) {
+ std::cerr << "ERROR: could not retrieve service manager." << std::endl;
+ return 1;
+ }
+
+ sp<IBase> implementation = manager->get(interfaceName, instanceName).withDefault(nullptr);
+ if (implementation == nullptr) {
+ std::cerr << "ERROR: could not retrieve desired implementation" << std::endl;
+ return 1;
+ }
+
+ sp<IBase> adapter = it->second(implementation);
+ if (adapter == nullptr) {
+ std::cerr << "ERROR: could not create adapter." << std::endl;
+ return 1;
+ }
+
+ bool replaced = manager->add(instanceName, adapter).withDefault(false);
+ if (!replaced) {
+ std::cerr << "ERROR: could not register the service with the service manager." << std::endl;
+ return 1;
+ }
+
+ std::cout << "Press any key to disassociate adapter." << std::endl;
+ getchar();
+
+ bool restored = manager->add(instanceName, implementation).withDefault(false);
+ if (!restored) {
+ std::cerr << "ERROR: could not re-register interface with the service manager."
+ << std::endl;
+ return 1;
+ }
+
+ std::cout << "Success." << std::endl;
+
+ return 0;
+}
+
+// If an interface is adapted to 1.0, it can then not be adapted to 1.1 in the same process.
+// This poses a problem in the following scenario:
+// auto interface = new V1_1::implementation::IFoo;
+// hidlObject1_0->foo(interface) // adaptation set at 1.0
+// hidlObject1_1->bar(interface) // adaptation still is 1.0
+// This could be solved by keeping a map of IBase,fqName -> IBase, but then you end up
+// with multiple names for the same interface.
+sp<IBase> adaptWithDefault(const sp<IBase>& something,
+ const std::function<sp<IBase>()>& makeDefault) {
+ static std::map<sp<IBase>, sp<IBase>> sAdapterMap;
+
+ if (something == nullptr) {
+ return something;
+ }
+
+ auto it = sAdapterMap.find(something);
+ if (it == sAdapterMap.end()) {
+ it = sAdapterMap.insert(it, {something, makeDefault()});
+ }
+
+ return it->second;
+}
+
+} // namespace details
+} // namespace hardware
+} // namespace android
diff --git a/adapter/include/hidladapter/HidlBinderAdapter.h b/adapter/include/hidladapter/HidlBinderAdapter.h
new file mode 100644
index 0000000..46df554
--- /dev/null
+++ b/adapter/include/hidladapter/HidlBinderAdapter.h
@@ -0,0 +1,52 @@
+/*
+ * 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/hidl/base/1.0/IBase.h>
+#include <hidl/HidlSupport.h>
+
+#include <map>
+
+namespace android {
+namespace hardware {
+
+namespace details {
+
+using IBase = ::android::hidl::base::V1_0::IBase;
+
+// AdapterFactory(impl) -> adapter
+using AdapterFactory = std::function<sp<IBase>(sp<IBase>)>;
+// AdaptersFactory(package@interface)(impl) -> adapter
+using AdaptersFactory = std::map<std::string, AdapterFactory>;
+
+int adapterMain(const std::string& package, int argc, char** argv, const AdaptersFactory& adapters);
+
+sp<IBase> adaptWithDefault(const sp<IBase>& something,
+ const std::function<sp<IBase>()>& makeDefault);
+
+} // namespace details
+
+template <typename... Adapters>
+int adapterMain(const std::string& package, int argc, char** argv) {
+ return details::adapterMain(
+ package, argc, argv,
+ {{Adapters::Pure::descriptor, [](sp<::android::hidl::base::V1_0::IBase> base) {
+ return details::adaptWithDefault(
+ base, [&] { return new Adapters(Adapters::Pure::castFrom(base)); });
+ }}...});
+}
+
+} // namespace hardware
+} // namespace android
\ No newline at end of file
diff --git a/base/Android.bp b/base/Android.bp
index 5a38ed8..4505b5e 100644
--- a/base/Android.bp
+++ b/base/Android.bp
@@ -19,7 +19,7 @@
enabled: true,
support_system_process: true,
},
- cflags: libhidl_flags,
+ defaults: ["libhidl-defaults"],
shared_libs: [
"libbase",
"libcutils",
@@ -33,7 +33,6 @@
local_include_dirs: ["include"],
export_include_dirs: ["include"],
- clang: true,
sanitize: {
misc_undefined: ["integer"],
},
diff --git a/base/HidlInternal.cpp b/base/HidlInternal.cpp
index c534a4c..b41c0b9 100644
--- a/base/HidlInternal.cpp
+++ b/base/HidlInternal.cpp
@@ -25,13 +25,16 @@
#include <dirent.h>
#include <dlfcn.h>
#include <regex>
+#include <utils/misc.h>
+
+extern "C" __attribute__((weak)) void __sanitizer_cov_dump();
#endif
namespace android {
namespace hardware {
namespace details {
-void logAlwaysFatal(const char *message) {
+void logAlwaysFatal(const char* message) {
LOG(FATAL) << message;
}
@@ -42,9 +45,21 @@
mInstrumentationLibPackage(package),
mInterfaceName(interface) {
configureInstrumentation(false);
+#ifdef LIBHIDL_TARGET_DEBUGGABLE
+ if (__sanitizer_cov_dump != nullptr) {
+ ::android::add_sysprop_change_callback(
+ []() {
+ bool enableCoverage = property_get_bool("hal.coverage.enable", false);
+ if (enableCoverage) {
+ __sanitizer_cov_dump();
+ }
+ },
+ 0);
+ }
+#endif
}
-HidlInstrumentor:: ~HidlInstrumentor() {}
+HidlInstrumentor::~HidlInstrumentor() {}
void HidlInstrumentor::configureInstrumentation(bool log) {
bool enableInstrumentation = property_get_bool(
@@ -82,7 +97,7 @@
instrumentationLibPaths.push_back(HAL_LIBRARY_PATH_ODM);
}
- for (auto path : instrumentationLibPaths) {
+ for (const auto& path : instrumentationLibPaths) {
DIR *dir = opendir(path.c_str());
if (dir == 0) {
LOG(WARNING) << path << " does not exist. ";
@@ -90,7 +105,7 @@
}
struct dirent *file;
- while ((file = readdir(dir)) != NULL) {
+ while ((file = readdir(dir)) != nullptr) {
if (!isInstrumentationLib(file))
continue;
@@ -126,7 +141,7 @@
}
auto cb = (cbFun)dlsym(handle, ("HIDL_INSTRUMENTATION_FUNCTION_"
+ package + "_" + mInterfaceName).c_str());
- if ((error = dlerror()) != NULL) {
+ if ((error = dlerror()) != nullptr) {
LOG(WARNING)
<< "couldn't find symbol: HIDL_INSTRUMENTATION_FUNCTION_"
<< package << "_" << mInterfaceName << ", error: " << error;
diff --git a/base/Status.cpp b/base/Status.cpp
index 3b31ee6..1ba91c3 100644
--- a/base/Status.cpp
+++ b/base/Status.cpp
@@ -53,7 +53,7 @@
}
std::string str = std::to_string(s);
char *err = strerror(-s);
- if (err != NULL) {
+ if (err != nullptr) {
str.append(1, ' ').append(err);
}
return str;
diff --git a/base/include/hidl/SynchronizedQueue.h b/base/SynchronizedQueue.h
similarity index 88%
rename from base/include/hidl/SynchronizedQueue.h
rename to base/SynchronizedQueue.h
index efb04e0..356c72c 100644
--- a/base/include/hidl/SynchronizedQueue.h
+++ b/base/SynchronizedQueue.h
@@ -45,11 +45,23 @@
*/
size_t size();
+ std::unique_lock<std::mutex> lock() {
+ return std::unique_lock<std::mutex>(mMutex);
+ }
+
+ bool isInitializedLocked() {
+ return mInitialized;
+ }
+ void setInitializedLocked(bool isInitialized) {
+ mInitialized = isInitialized;
+ }
+
private:
std::condition_variable mCondition;
std::mutex mMutex;
std::queue<T> mQueue;
const size_t mQueueLimit;
+ bool mInitialized = false;
};
template <typename T>
diff --git a/base/TaskRunner.cpp b/base/TaskRunner.cpp
index 782b40b..bd42240 100644
--- a/base/TaskRunner.cpp
+++ b/base/TaskRunner.cpp
@@ -15,6 +15,10 @@
*/
#include <hidl/TaskRunner.h>
+
+#include <utils/AndroidThreads.h>
+#include "SynchronizedQueue.h"
+
#include <thread>
namespace android {
@@ -26,15 +30,6 @@
void TaskRunner::start(size_t limit) {
mQueue = std::make_shared<SynchronizedQueue<Task>>(limit);
-
- // Allow the thread to continue running in background;
- // TaskRunner do not care about the std::thread object.
- std::thread{[q = mQueue] {
- Task nextTask;
- while (!!(nextTask = q->wait_pop())) {
- nextTask();
- }
- }}.detach();
}
TaskRunner::~TaskRunner() {
@@ -44,7 +39,30 @@
}
bool TaskRunner::push(const Task &t) {
- return (mQueue != nullptr) && (!!t) && this->mQueue->push(t);
+ if (mQueue == nullptr || !t) {
+ return false;
+ }
+
+ {
+ std::unique_lock<std::mutex> lock = mQueue->lock();
+
+ if (!mQueue->isInitializedLocked()) {
+ // Allow the thread to continue running in background;
+ // TaskRunner do not care about the std::thread object.
+ std::thread{[q = mQueue] {
+ androidSetThreadName("HIDL TaskRunner");
+
+ Task nextTask;
+ while (!!(nextTask = q->wait_pop())) {
+ nextTask();
+ }
+ }}.detach();
+
+ mQueue->setInitializedLocked(true);
+ }
+ }
+
+ return this->mQueue->push(t);
}
} // namespace details
diff --git a/base/include/hidl/HidlInternal.h b/base/include/hidl/HidlInternal.h
index 7a24cd5..7a8019d 100644
--- a/base/include/hidl/HidlInternal.h
+++ b/base/include/hidl/HidlInternal.h
@@ -28,6 +28,18 @@
namespace hardware {
namespace details {
+// tag for pure interfaces (e.x. IFoo)
+struct i_tag {};
+
+// tag for server interfaces (e.x. BnHwFoo)
+struct bnhw_tag {};
+
+// tag for proxy interfaces (e.x. BpHwFoo)
+struct bphw_tag {};
+
+// tag for passthrough interfaces (e.x. BsFoo)
+struct bs_tag {};
+
//Templated classes can use the below method
//to avoid creating dependencies on liblog.
void logAlwaysFatal(const char *message);
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index f25cdc4..ab16709 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -172,15 +172,16 @@
void moveFrom(hidl_string &&);
};
+// Use NOLINT to suppress missing parentheses warnings around OP.
#define HIDL_STRING_OPERATOR(OP) \
inline bool operator OP(const hidl_string &hs1, const hidl_string &hs2) { \
- return strcmp(hs1.c_str(), hs2.c_str()) OP 0; \
+ return strcmp(hs1.c_str(), hs2.c_str()) OP 0; /* NOLINT */ \
} \
inline bool operator OP(const hidl_string &hs, const char *s) { \
- return strcmp(hs.c_str(), s) OP 0; \
+ return strcmp(hs.c_str(), s) OP 0; /* NOLINT */ \
} \
inline bool operator OP(const char *s, const hidl_string &hs) { \
- return strcmp(hs.c_str(), s) OP 0; \
+ return strcmp(hs.c_str(), s) OP 0; /* NOLINT */ \
}
HIDL_STRING_OPERATOR(==)
@@ -283,12 +284,15 @@
template<typename T>
struct hidl_vec {
hidl_vec()
- : mBuffer(NULL),
+ : mBuffer(nullptr),
mSize(0),
mOwnsBuffer(true) {
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() {
*this = other;
}
@@ -341,7 +345,7 @@
if (mOwnsBuffer) {
delete[] mBuffer;
}
- mBuffer = NULL;
+ mBuffer = nullptr;
}
// Reference an existing array, optionally taking ownership. It is the
@@ -445,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.");
@@ -530,7 +535,7 @@
mBuffer[i] = data[i];
}
} else {
- mBuffer = NULL;
+ mBuffer = nullptr;
}
}
};
diff --git a/base/include/hidl/Status.h b/base/include/hidl/Status.h
index f812ebb..1a2ef6d 100644
--- a/base/include/hidl/Status.h
+++ b/base/include/hidl/Status.h
@@ -143,7 +143,7 @@
void assertOk() const;
public:
return_status() {}
- return_status(Status s) : mStatus(s) {}
+ return_status(const Status& s) : mStatus(s) {}
return_status(const return_status &) = delete;
return_status &operator=(const return_status &) = delete;
@@ -155,6 +155,11 @@
~return_status();
+ bool isOkUnchecked() const {
+ // someone else will have to check
+ return mStatus.isOk();
+ }
+
bool isOk() const {
mCheckedStatus = true;
return mStatus.isOk();
@@ -240,7 +245,7 @@
template<> class Return<void> : public details::return_status {
public:
Return() : details::return_status() {}
- Return(Status s) : details::return_status(s) {}
+ Return(const Status& s) : details::return_status(s) {}
// move-able.
// precondition: "this" has checked status
diff --git a/base/include/hidl/TaskRunner.h b/base/include/hidl/TaskRunner.h
index 28ea01c..6a79ebf 100644
--- a/base/include/hidl/TaskRunner.h
+++ b/base/include/hidl/TaskRunner.h
@@ -16,7 +16,6 @@
#ifndef ANDROID_HIDL_TASK_RUNNER_H
#define ANDROID_HIDL_TASK_RUNNER_H
-#include "SynchronizedQueue.h"
#include <memory>
#include <thread>
@@ -24,13 +23,17 @@
namespace hardware {
namespace details {
+using Task = std::function<void(void)>;
+
+template <typename T>
+struct SynchronizedQueue;
+
/*
* A background infinite loop that runs the Tasks push()'ed.
* Equivalent to a simple single-threaded Looper.
*/
class TaskRunner {
public:
- using Task = std::function<void(void)>;
/* Create an empty task runner. Nothing will be done until start() is called. */
TaskRunner();
@@ -44,7 +47,9 @@
/*
* Sets the queue limit. Fails the push operation once the limit is reached.
- * Then kicks off the loop.
+ * This function is named start for legacy reasons and to maintain ABI
+ * stability, but the underlying thread running tasks isn't started until
+ * the first task is pushed.
*/
void start(size_t limit);
diff --git a/libhidlmemory/Android.bp b/libhidlmemory/Android.bp
index 59ce7a8..e854ab5 100644
--- a/libhidlmemory/Android.bp
+++ b/libhidlmemory/Android.bp
@@ -19,7 +19,7 @@
enabled: true,
support_system_process: true,
},
- cflags: libhidl_flags,
+ defaults: ["libhidl-defaults"],
shared_libs: [
"libbase",
"liblog",
diff --git a/libhidlmemory/include/hidlmemory/mapping.h b/libhidlmemory/include/hidlmemory/mapping.h
index 5e1dab3..e15eb80 100644
--- a/libhidlmemory/include/hidlmemory/mapping.h
+++ b/libhidlmemory/include/hidlmemory/mapping.h
@@ -22,6 +22,9 @@
/**
* Returns the IMemory instance corresponding to a hidl_memory object.
* If the shared memory cannot be fetched, this returns nullptr.
+ *
+ * Note, this method call is relatively expensive and does not cache conversions.
+ * It should only be done when initializing a buffer and not on every buffer read.
*/
sp<android::hidl::memory::V1_0::IMemory> mapMemory(const hidl_memory &memory);
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 1f2f845..2811612 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "LibHidlTest"
#include <android-base/logging.h>
+#include <condition_variable>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <hidl/HidlSupport.h>
@@ -75,9 +76,9 @@
EXPECT_STREQ(s6.c_str(), "s6");
hidl_string s7 = std::string("s7"); // copy = from std::string
EXPECT_STREQ(s7.c_str(), "s7");
- hidl_string s8(s7); // copy constructor
+ hidl_string s8(s7); // copy constructor // NOLINT, test the copy constructor
EXPECT_STREQ(s8.c_str(), "s7");
- hidl_string s9 = s8; // copy =
+ hidl_string s9 = s8; // copy = // NOLINT, test the copy operator
EXPECT_STREQ(s9.c_str(), "s7");
char myCString[20] = "myCString";
s.setToExternal(&myCString[0], strlen(myCString));
@@ -153,14 +154,14 @@
using android::hardware::hidl_memory;
hidl_memory mem1 = hidl_memory(); // default constructor
- hidl_memory mem2 = mem1; // copy constructor (nullptr)
+ hidl_memory mem2 = mem1; // copy constructor (nullptr), NOLINT
EXPECT_EQ(nullptr, mem2.handle());
native_handle_t* testHandle = native_handle_create(0 /* numInts */, 0 /* numFds */);
hidl_memory mem3 = hidl_memory("foo", testHandle, 42 /* size */); // owns testHandle
- hidl_memory mem4 = mem3; // copy constructor (regular handle)
+ hidl_memory mem4 = mem3; // copy constructor (regular handle), NOLINT
EXPECT_EQ(mem3.name(), mem4.name());
EXPECT_EQ(mem3.size(), mem4.size());
@@ -168,7 +169,7 @@
EXPECT_NE(mem3.handle(), mem4.handle()); // check handle cloned
hidl_memory mem5 = hidl_memory("foo", nullptr, 0); // hidl memory works with nullptr handle
- hidl_memory mem6 = mem5;
+ hidl_memory mem6 = mem5; // NOLINT, test copying
EXPECT_EQ(nullptr, mem5.handle());
EXPECT_EQ(nullptr, mem6.handle());
}
@@ -179,6 +180,9 @@
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); // cannot say anything about its contents
+
hidl_vec<int32_t> hv1 = v; // copy =
EXPECT_ARRAYEQ(hv1, array, 3);
EXPECT_ARRAYEQ(hv1, v, 3);
@@ -296,16 +300,23 @@
TEST_F(LibHidlTest, TaskRunnerTest) {
using android::hardware::details::TaskRunner;
+ using namespace std::chrono_literals;
+
+ std::condition_variable cv;
+ std::mutex m;
+
TaskRunner tr;
tr.start(1 /* limit */);
bool flag = false;
tr.push([&] {
- usleep(1000);
flag = true;
+ cv.notify_all();
});
- usleep(500);
- EXPECT_FALSE(flag);
- usleep(1000);
+
+ std::unique_lock<std::mutex> lock(m);
+
+ // 1s so this doesn't deadlock. This isn't a performance test.
+ EXPECT_TRUE(cv.wait_for(lock, 1s, [&]{return flag;}));
EXPECT_TRUE(flag);
}
diff --git a/transport/Android.bp b/transport/Android.bp
index cf499ef..23f6904 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -31,8 +31,10 @@
enabled: true,
support_system_process: true,
},
- defaults: ["hidl-module-defaults"],
- cflags: libhidl_flags,
+ defaults: [
+ "libhidl-defaults",
+ "hidl-module-defaults",
+ ],
shared_libs: [
"libbase",
"liblog",
@@ -68,6 +70,7 @@
srcs: [
"HidlBinderSupport.cpp",
+ "HidlPassthroughSupport.cpp",
"HidlTransportSupport.cpp",
"HidlTransportUtils.cpp",
"ServiceManagement.cpp",
@@ -78,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/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 72ac53a..c6c43a7 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -90,7 +90,7 @@
}
ifs >> cmdline;
- size_t idx = cmdline.rfind("/");
+ size_t idx = cmdline.rfind('/');
if (idx != std::string::npos) {
cmdline = cmdline.substr(idx + 1);
}
@@ -139,7 +139,7 @@
sp<IServiceManager1_1> defaultServiceManager1_1() {
{
AutoMutex _l(details::gDefaultServiceManagerLock);
- if (details::gDefaultServiceManager != NULL) {
+ if (details::gDefaultServiceManager != nullptr) {
return details::gDefaultServiceManager;
}
@@ -151,11 +151,11 @@
waitForHwServiceManager();
- while (details::gDefaultServiceManager == NULL) {
+ while (details::gDefaultServiceManager == nullptr) {
details::gDefaultServiceManager =
fromBinder<IServiceManager1_1, BpHwServiceManager, BnHwServiceManager>(
- ProcessState::self()->getContextObject(NULL));
- if (details::gDefaultServiceManager == NULL) {
+ ProcessState::self()->getContextObject(nullptr));
+ if (details::gDefaultServiceManager == nullptr) {
LOG(ERROR) << "Waited for hwservicemanager, but got nullptr.";
sleep(1);
}
@@ -225,7 +225,7 @@
if (!dir) return;
dirent* dp;
while ((dp = readdir(dir.get())) != nullptr) {
- pid_t pid = strtoll(dp->d_name, NULL, 0);
+ pid_t pid = strtoll(dp->d_name, nullptr, 0);
if (pid == 0) continue;
std::string mapsPath = proc + dp->d_name + "/maps";
std::ifstream ifs{mapsPath};
@@ -254,9 +254,10 @@
}
struct PassthroughServiceManager : IServiceManager1_1 {
- static void openLibs(const std::string& fqName,
- std::function<bool /* continue */(void* /* handle */,
- const std::string& /* lib */, const std::string& /* sym */)> eachLib) {
+ static void openLibs(
+ const std::string& fqName,
+ const std::function<bool /* continue */ (void* /* handle */, const std::string& /* lib */,
+ const std::string& /* sym */)>& eachLib) {
//fqName looks like android.hardware.foo@1.0::IFoo
size_t idx = fqName.find("::");
@@ -272,35 +273,47 @@
const std::string prefix = packageAndVersion + "-impl";
const std::string sym = "HIDL_FETCH_" + ifaceName;
- const int dlMode = RTLD_LAZY;
- void *handle = nullptr;
+ constexpr int dlMode = RTLD_LAZY;
+ void* handle = nullptr;
dlerror(); // clear
std::vector<std::string> paths = {HAL_LIBRARY_PATH_ODM, HAL_LIBRARY_PATH_VENDOR,
HAL_LIBRARY_PATH_VNDK_SP, HAL_LIBRARY_PATH_SYSTEM};
+
#ifdef LIBHIDL_TARGET_DEBUGGABLE
const char* env = std::getenv("TREBLE_TESTING_OVERRIDE");
const bool trebleTestingOverride = env && !strcmp(env, "true");
if (trebleTestingOverride) {
+ // Load HAL implementations that are statically linked
+ handle = dlopen(nullptr, dlMode);
+ if (handle == nullptr) {
+ const char* error = dlerror();
+ LOG(ERROR) << "Failed to dlopen self: "
+ << (error == nullptr ? "unknown error" : error);
+ } else if (!eachLib(handle, "SELF", sym)) {
+ return;
+ }
+
const char* vtsRootPath = std::getenv("VTS_ROOT_PATH");
if (vtsRootPath && strlen(vtsRootPath) > 0) {
const std::string halLibraryPathVtsOverride =
std::string(vtsRootPath) + HAL_LIBRARY_PATH_SYSTEM;
- paths.push_back(halLibraryPathVtsOverride);
+ paths.insert(paths.begin(), halLibraryPathVtsOverride);
}
}
#endif
+
for (const std::string& path : paths) {
std::vector<std::string> libs = search(path, prefix, ".so");
for (const std::string &lib : libs) {
const std::string fullPath = path + lib;
- if (path != HAL_LIBRARY_PATH_SYSTEM) {
- handle = android_load_sphal_library(fullPath.c_str(), dlMode);
- } else {
+ if (path == HAL_LIBRARY_PATH_SYSTEM) {
handle = dlopen(fullPath.c_str(), dlMode);
+ } else {
+ handle = android_load_sphal_library(fullPath.c_str(), dlMode);
}
if (handle == nullptr) {
diff --git a/transport/allocator/1.0/Android.bp b/transport/allocator/1.0/Android.bp
index c64a039..f02d1d1 100644
--- a/transport/allocator/1.0/Android.bp
+++ b/transport/allocator/1.0/Android.bp
@@ -60,3 +60,82 @@
"libutils",
],
}
+
+// 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"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-sources -randroid.hidl:system/libhidl/transport android.hidl.allocator@1.0",
+ srcs: [
+ ":android.hidl.allocator@1.0_hal",
+ ],
+ out: [
+ "android/hidl/allocator/1.0/AAllocator.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hidl.allocator@1.0-adapter-helper_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-headers -randroid.hidl:system/libhidl/transport android.hidl.allocator@1.0",
+ srcs: [
+ ":android.hidl.allocator@1.0_hal",
+ ],
+ out: [
+ "android/hidl/allocator/1.0/AAllocator.h",
+ ],
+}
+
+cc_library {
+ name: "android.hidl.allocator@1.0-adapter-helper",
+ defaults: ["hidl-module-defaults"],
+ generated_sources: ["android.hidl.allocator@1.0-adapter-helper_genc++"],
+ generated_headers: ["android.hidl.allocator@1.0-adapter-helper_genc++_headers"],
+ export_generated_headers: ["android.hidl.allocator@1.0-adapter-helper_genc++_headers"],
+ vendor_available: true,
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "libhidladapter",
+ "android.hidl.allocator@1.0",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhidladapter",
+ "android.hidl.allocator@1.0",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+}
+
+genrule {
+ name: "android.hidl.allocator@1.0-adapter_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-main -randroid.hidl:system/libhidl/transport android.hidl.allocator@1.0",
+ out: ["main.cpp"]
+}
+
+cc_test {
+ name: "android.hidl.allocator@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
+ shared_libs: [
+ "libhidladapter",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "android.hidl.allocator@1.0",
+ "android.hidl.allocator@1.0-adapter-helper",
+ ],
+ generated_sources: ["android.hidl.allocator@1.0-adapter_genc++"],
+}
diff --git a/transport/allocator/1.0/default/Android.bp b/transport/allocator/1.0/default/Android.bp
index 7d5fd8b..fc352c3 100644
--- a/transport/allocator/1.0/default/Android.bp
+++ b/transport/allocator/1.0/default/Android.bp
@@ -15,7 +15,7 @@
cc_binary {
name: "android.hidl.allocator@1.0-service",
relative_install_path: "hw",
- cflags: libhidl_flags,
+ defaults: ["libhidl-defaults"],
srcs: [
"AshmemAllocator.cpp",
"service.cpp"
diff --git a/transport/base/1.0/Android.bp b/transport/base/1.0/Android.bp
index 8382824..73ee5cf 100644
--- a/transport/base/1.0/Android.bp
+++ b/transport/base/1.0/Android.bp
@@ -40,3 +40,98 @@
}
// 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",
+ srcs: [
+ ":android.hidl.base@1.0_hal",
+ ],
+ out: [
+ "android/hidl/base/1.0/ABase.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hidl.base@1.0-adapter-helper_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-headers -randroid.hidl:system/libhidl/transport android.hidl.base@1.0",
+ srcs: [
+ ":android.hidl.base@1.0_hal",
+ ],
+ out: [
+ "android/hidl/base/1.0/ABase.h",
+ ],
+}
+
+cc_library {
+ name: "android.hidl.base@1.0-adapter-helper",
+ defaults: ["hidl-module-defaults"],
+ generated_sources: ["android.hidl.base@1.0-adapter-helper_genc++"],
+ generated_headers: ["android.hidl.base@1.0-adapter-helper_genc++_headers"],
+ export_generated_headers: ["android.hidl.base@1.0-adapter-helper_genc++_headers"],
+ vendor_available: true,
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "libhidladapter",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhidladapter",
+ ],
+}
+
+genrule {
+ name: "android.hidl.base@1.0-adapter_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-main -randroid.hidl:system/libhidl/transport android.hidl.base@1.0",
+ out: ["main.cpp"]
+}
+
+cc_test {
+ name: "android.hidl.base@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
+ shared_libs: [
+ "libhidladapter",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+ generated_sources: ["android.hidl.base@1.0-adapter_genc++"],
+}
diff --git a/transport/base/1.0/Android.mk b/transport/base/1.0/Android.mk
deleted file mode 100644
index 2031a92..0000000
--- a/transport/base/1.0/Android.mk
+++ /dev/null
@@ -1,106 +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)
-
-#
-# 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)
-
-#
-# 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/HidlBinderSupport.h b/transport/include/hidl/HidlBinderSupport.h
index 47ff581..fc834b9 100644
--- a/transport/include/hidl/HidlBinderSupport.h
+++ b/transport/include/hidl/HidlBinderSupport.h
@@ -306,7 +306,8 @@
// Otherwise, the smallest possible BnChild is found where IChild is a subclass of IType
// and iface is of class IChild. BnChild will be used to wrapped the given iface.
// Return nullptr if iface is null or any failure.
-template <typename IType>
+template <typename IType,
+ typename = std::enable_if_t<std::is_same<details::i_tag, typename IType::_hidl_tag>::value>>
sp<IBinder> toBinder(sp<IType> iface) {
IType *ifacePtr = iface.get();
if (ifacePtr == nullptr) {
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 d116598..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>
@@ -62,7 +63,10 @@
bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service,
int policy, int priority);
-template <typename ILeft, typename IRight>
+template <typename ILeft,
+ typename IRight,
+ typename = std::enable_if_t<std::is_same<details::i_tag, typename ILeft::_hidl_tag>::value>,
+ typename = std::enable_if_t<std::is_same<details::i_tag, typename IRight::_hidl_tag>::value>>
bool interfacesEqual(sp<ILeft> left, sp<IRight> right) {
if (left == nullptr || right == nullptr || !left->isRemote() || !right->isRemote()) {
return left == right;
@@ -103,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/include/hidl/LegacySupport.h b/transport/include/hidl/LegacySupport.h
index 2f0c3f3..f03d34d 100644
--- a/transport/include/hidl/LegacySupport.h
+++ b/transport/include/hidl/LegacySupport.h
@@ -74,7 +74,7 @@
}
joinRpcThreadpool();
- return 0;
+ return UNKNOWN_ERROR;
}
template<class Interface>
__attribute__((warn_unused_result))
diff --git a/transport/manager/1.0/Android.bp b/transport/manager/1.0/Android.bp
index 8bdbfa5..a0898d7 100644
--- a/transport/manager/1.0/Android.bp
+++ b/transport/manager/1.0/Android.bp
@@ -43,3 +43,103 @@
}
// 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",
+ srcs: [
+ ":android.hidl.manager@1.0_hal",
+ ],
+ out: [
+ "android/hidl/manager/1.0/AServiceManager.cpp",
+ "android/hidl/manager/1.0/AServiceNotification.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hidl.manager@1.0-adapter-helper_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-headers -randroid.hidl:system/libhidl/transport android.hidl.manager@1.0",
+ srcs: [
+ ":android.hidl.manager@1.0_hal",
+ ],
+ out: [
+ "android/hidl/manager/1.0/AServiceManager.h",
+ "android/hidl/manager/1.0/AServiceNotification.h",
+ ],
+}
+
+cc_library {
+ name: "android.hidl.manager@1.0-adapter-helper",
+ defaults: ["hidl-module-defaults"],
+ generated_sources: ["android.hidl.manager@1.0-adapter-helper_genc++"],
+ generated_headers: ["android.hidl.manager@1.0-adapter-helper_genc++_headers"],
+ export_generated_headers: ["android.hidl.manager@1.0-adapter-helper_genc++_headers"],
+ vendor_available: true,
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "libhidladapter",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhidladapter",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+}
+
+genrule {
+ name: "android.hidl.manager@1.0-adapter_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-main -randroid.hidl:system/libhidl/transport android.hidl.manager@1.0",
+ out: ["main.cpp"]
+}
+
+cc_test {
+ name: "android.hidl.manager@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
+ shared_libs: [
+ "libhidladapter",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "android.hidl.manager@1.0-adapter-helper",
+ ],
+ generated_sources: ["android.hidl.manager@1.0-adapter_genc++"],
+}
diff --git a/transport/manager/1.0/Android.mk b/transport/manager/1.0/Android.mk
deleted file mode 100644
index 8b20827..0000000
--- a/transport/manager/1.0/Android.mk
+++ /dev/null
@@ -1,114 +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 \
-
-
-#
-# 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 $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.manager-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_STATIC_JAVA_LIBRARIES := \
- android.hidl.base-V1.0-java-static \
-
-
-#
-# 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_STATIC_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 5a1bf00..7a4094e 100644
--- a/transport/manager/1.1/Android.bp
+++ b/transport/manager/1.1/Android.bp
@@ -36,3 +36,103 @@
}
// 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",
+ srcs: [
+ ":android.hidl.manager@1.1_hal",
+ ],
+ out: [
+ "android/hidl/manager/1.1/AServiceManager.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hidl.manager@1.1-adapter-helper_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-headers -randroid.hidl:system/libhidl/transport android.hidl.manager@1.1",
+ srcs: [
+ ":android.hidl.manager@1.1_hal",
+ ],
+ out: [
+ "android/hidl/manager/1.1/AServiceManager.h",
+ ],
+}
+
+cc_library {
+ name: "android.hidl.manager@1.1-adapter-helper",
+ defaults: ["hidl-module-defaults"],
+ generated_sources: ["android.hidl.manager@1.1-adapter-helper_genc++"],
+ generated_headers: ["android.hidl.manager@1.1-adapter-helper_genc++_headers"],
+ export_generated_headers: ["android.hidl.manager@1.1-adapter-helper_genc++_headers"],
+ vendor_available: true,
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "libhidladapter",
+ "android.hidl.base@1.0-adapter-helper",
+ "android.hidl.manager@1.0-adapter-helper",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhidladapter",
+ "android.hidl.base@1.0-adapter-helper",
+ "android.hidl.manager@1.0-adapter-helper",
+ ],
+}
+
+genrule {
+ name: "android.hidl.manager@1.1-adapter_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-main -randroid.hidl:system/libhidl/transport android.hidl.manager@1.1",
+ out: ["main.cpp"]
+}
+
+cc_test {
+ name: "android.hidl.manager@1.1-adapter",
+ defaults: ["hidl-module-defaults"],
+ shared_libs: [
+ "libhidladapter",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "android.hidl.manager@1.1-adapter-helper",
+ ],
+ generated_sources: ["android.hidl.manager@1.1-adapter_genc++"],
+}
diff --git a/transport/manager/1.1/Android.mk b/transport/manager/1.1/Android.mk
deleted file mode 100644
index 20c9504..0000000
--- a/transport/manager/1.1/Android.mk
+++ /dev/null
@@ -1,76 +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 \
-
-
-#
-# 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 $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.manager-V1.1-java-static
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-intermediates := $(call local-generated-sources-dir, COMMON)
-
-HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android.hidl.base-V1.0-java-static \
- android.hidl.manager-V1.0-java-static \
-
-
-#
-# 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_STATIC_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 b6044c2..cf24616 100644
--- a/transport/memory/1.0/Android.bp
+++ b/transport/memory/1.0/Android.bp
@@ -68,3 +68,84 @@
"libutils",
],
}
+
+// 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"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-sources -randroid.hidl:system/libhidl/transport android.hidl.memory@1.0",
+ srcs: [
+ ":android.hidl.memory@1.0_hal",
+ ],
+ out: [
+ "android/hidl/memory/1.0/AMapper.cpp",
+ "android/hidl/memory/1.0/AMemory.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hidl.memory@1.0-adapter-helper_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-headers -randroid.hidl:system/libhidl/transport android.hidl.memory@1.0",
+ srcs: [
+ ":android.hidl.memory@1.0_hal",
+ ],
+ out: [
+ "android/hidl/memory/1.0/AMapper.h",
+ "android/hidl/memory/1.0/AMemory.h",
+ ],
+}
+
+cc_library {
+ name: "android.hidl.memory@1.0-adapter-helper",
+ defaults: ["hidl-module-defaults"],
+ generated_sources: ["android.hidl.memory@1.0-adapter-helper_genc++"],
+ generated_headers: ["android.hidl.memory@1.0-adapter-helper_genc++_headers"],
+ export_generated_headers: ["android.hidl.memory@1.0-adapter-helper_genc++_headers"],
+ vendor_available: true,
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "libhidladapter",
+ "android.hidl.memory@1.0",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhidladapter",
+ "android.hidl.memory@1.0",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+}
+
+genrule {
+ name: "android.hidl.memory@1.0-adapter_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-main -randroid.hidl:system/libhidl/transport android.hidl.memory@1.0",
+ out: ["main.cpp"]
+}
+
+cc_test {
+ name: "android.hidl.memory@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
+ shared_libs: [
+ "libhidladapter",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "android.hidl.memory@1.0",
+ "android.hidl.memory@1.0-adapter-helper",
+ ],
+ generated_sources: ["android.hidl.memory@1.0-adapter_genc++"],
+}
diff --git a/transport/memory/1.0/default/Android.bp b/transport/memory/1.0/default/Android.bp
index a4f45cf..9f47244 100644
--- a/transport/memory/1.0/default/Android.bp
+++ b/transport/memory/1.0/default/Android.bp
@@ -21,7 +21,7 @@
},
compile_multilib: "both",
relative_install_path: "hw",
- cflags: libhidl_flags,
+ defaults: ["libhidl-defaults"],
srcs: [
"AshmemMapper.cpp",
"AshmemMemory.cpp",
diff --git a/transport/token/1.0/Android.bp b/transport/token/1.0/Android.bp
index 957d1f9..1bc6d97 100644
--- a/transport/token/1.0/Android.bp
+++ b/transport/token/1.0/Android.bp
@@ -60,3 +60,103 @@
"libutils",
],
}
+
+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",
+ srcs: [
+ ":android.hidl.token@1.0_hal",
+ ],
+ out: [
+ "android/hidl/token/1.0/ATokenManager.cpp",
+ ],
+}
+
+genrule {
+ name: "android.hidl.token@1.0-adapter-helper_genc++_headers",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-headers -randroid.hidl:system/libhidl/transport android.hidl.token@1.0",
+ srcs: [
+ ":android.hidl.token@1.0_hal",
+ ],
+ out: [
+ "android/hidl/token/1.0/ATokenManager.h",
+ ],
+}
+
+cc_library {
+ name: "android.hidl.token@1.0-adapter-helper",
+ defaults: ["hidl-module-defaults"],
+ generated_sources: ["android.hidl.token@1.0-adapter-helper_genc++"],
+ generated_headers: ["android.hidl.token@1.0-adapter-helper_genc++_headers"],
+ export_generated_headers: ["android.hidl.token@1.0-adapter-helper_genc++_headers"],
+ vendor_available: true,
+ shared_libs: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "liblog",
+ "libutils",
+ "libcutils",
+ "libhidladapter",
+ "android.hidl.token@1.0",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+ export_shared_lib_headers: [
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhidladapter",
+ "android.hidl.token@1.0",
+ "android.hidl.base@1.0-adapter-helper",
+ ],
+}
+
+genrule {
+ name: "android.hidl.token@1.0-adapter_genc++",
+ tools: ["hidl-gen"],
+ cmd: "$(location hidl-gen) -o $(genDir) -Lc++-adapter-main -randroid.hidl:system/libhidl/transport android.hidl.token@1.0",
+ out: ["main.cpp"]
+}
+
+cc_test {
+ name: "android.hidl.token@1.0-adapter",
+ defaults: ["hidl-module-defaults"],
+ shared_libs: [
+ "libhidladapter",
+ "libhidlbase",
+ "libhidltransport",
+ "libutils",
+ "android.hidl.token@1.0",
+ "android.hidl.token@1.0-adapter-helper",
+ ],
+ generated_sources: ["android.hidl.token@1.0-adapter_genc++"],
+}
diff --git a/transport/token/1.0/Android.mk b/transport/token/1.0/Android.mk
deleted file mode 100644
index ea86d57..0000000
--- a/transport/token/1.0/Android.mk
+++ /dev/null
@@ -1,74 +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 \
-
-
-#
-# 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 $(CLEAR_VARS)
-LOCAL_MODULE := android.hidl.token-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_STATIC_JAVA_LIBRARIES := \
- android.hidl.base-V1.0-java-static \
-
-
-#
-# 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_STATIC_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 101f3b4..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,
@@ -39,7 +40,5 @@
export_include_dirs: [
"include"
],
-
- clang: true,
}
diff --git a/transport/token/1.0/utils/include/hidl/HybridInterface.h b/transport/token/1.0/utils/include/hidl/HybridInterface.h
index 8c3e742..984555e 100644
--- a/transport/token/1.0/utils/include/hidl/HybridInterface.h
+++ b/transport/token/1.0/utils/include/hidl/HybridInterface.h
@@ -125,13 +125,13 @@
HalInterface* getBaseInterface() { return mBase.get(); }
virtual status_t linkToDeath(
const sp<IBinder::DeathRecipient>& recipient,
- void* cookie = NULL,
+ void* cookie = nullptr,
uint32_t flags = 0);
virtual status_t unlinkToDeath(
const wp<IBinder::DeathRecipient>& recipient,
- void* cookie = NULL,
+ void* cookie = nullptr,
uint32_t flags = 0,
- wp<IBinder::DeathRecipient>* outRecipient = NULL);
+ wp<IBinder::DeathRecipient>* outRecipient = nullptr);
protected:
sp<HalInterface> mBase;
@@ -215,11 +215,11 @@
const ::android::sp<::android::IBinder>& obj) \
{ \
::android::sp<I##INTERFACE> intr; \
- if (obj != NULL) { \
+ if (obj != nullptr) { \
intr = static_cast<I##INTERFACE*>( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
- if (intr == NULL) { \
+ if (intr == nullptr) { \
intr = new Hp##INTERFACE(obj); \
} \
} \
@@ -262,8 +262,8 @@
linkToDeath(
const sp<IBinder::DeathRecipient>& recipient,
void* cookie, uint32_t flags) {
- LOG_ALWAYS_FATAL_IF(recipient == NULL,
- "linkToDeath(): recipient must be non-NULL");
+ LOG_ALWAYS_FATAL_IF(recipient == nullptr,
+ "linkToDeath(): recipient must be non-nullptr");
{
std::lock_guard<std::mutex> lock(mObituariesLock);
mObituaries.push_back(new Obituary(recipient, cookie, flags, this));
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