Merge commit 'b678a5324877a24163655fb256ae0c835c5fd1f6' into HEAD
Change-Id: I6ad0d4acf226ab76264b09b6b3626037d2b41068
diff --git a/Android.bp b/Android.bp
index e97c28c..f9b1e96 100644
--- a/Android.bp
+++ b/Android.bp
@@ -35,6 +35,7 @@
srcs: ["test_main.cpp"],
shared_libs: [
+ "android.hardware.tests.inheritance@1.0",
"libbase",
"libhidlbase",
"libhidltransport",
@@ -45,6 +46,10 @@
],
static_libs: ["libgtest", "libgmock"],
+ required: [
+ "android.hardware.tests.inheritance@1.0-impl",
+ ],
+
cflags: [
"-O0",
"-g",
diff --git a/base/Android.bp b/base/Android.bp
index 4505b5e..22f5ee1 100644
--- a/base/Android.bp
+++ b/base/Android.bp
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-cc_library_shared {
+cc_library {
name: "libhidlbase",
vendor_available: true,
vndk: {
diff --git a/base/HidlInternal.cpp b/base/HidlInternal.cpp
index b41c0b9..64b4f26 100644
--- a/base/HidlInternal.cpp
+++ b/base/HidlInternal.cpp
@@ -24,10 +24,14 @@
#ifdef LIBHIDL_TARGET_DEBUGGABLE
#include <dirent.h>
#include <dlfcn.h>
-#include <regex>
+#include <link.h>
#include <utils/misc.h>
+#include <regex>
extern "C" __attribute__((weak)) void __sanitizer_cov_dump();
+const char* kSysPropHalCoverage = "hal.coverage.enable";
+const char* kGcovPrefixEnvVar = "GCOV_PREFIX";
+const char* kGcovPrefixPath = "/data/misc/trace/";
#endif
namespace android {
@@ -49,13 +53,41 @@
if (__sanitizer_cov_dump != nullptr) {
::android::add_sysprop_change_callback(
[]() {
- bool enableCoverage = property_get_bool("hal.coverage.enable", false);
+ bool enableCoverage = property_get_bool(kSysPropHalCoverage, false);
if (enableCoverage) {
__sanitizer_cov_dump();
}
},
0);
}
+ if (property_get_bool("ro.vts.coverage", false)) {
+ const std::string gcovPath = kGcovPrefixPath + std::to_string(getpid());
+ setenv(kGcovPrefixEnvVar, gcovPath.c_str(), true /* overwrite */);
+ ::android::add_sysprop_change_callback(
+ []() {
+ const bool enableCoverage = property_get_bool(kSysPropHalCoverage, false);
+ if (enableCoverage) {
+ dl_iterate_phdr(
+ [](struct dl_phdr_info* info, size_t /* size */, void* /* data */) {
+ if (strlen(info->dlpi_name) == 0) return 0;
+
+ void* handle = dlopen(info->dlpi_name, RTLD_LAZY);
+ if (handle == nullptr) {
+ LOG(INFO) << "coverage dlopen failed: " << dlerror();
+ return 0;
+ }
+ void (*flush)() = (void (*)())dlsym(handle, "__gcov_flush");
+ if (flush == nullptr) {
+ return 0;
+ }
+ flush();
+ return 0;
+ },
+ nullptr /* data */);
+ }
+ },
+ 0 /* priority */);
+ }
#endif
}
diff --git a/base/HidlSupport.cpp b/base/HidlSupport.cpp
index 4de7f7c..8f3c057 100644
--- a/base/HidlSupport.cpp
+++ b/base/HidlSupport.cpp
@@ -217,7 +217,7 @@
void hidl_string::copyFrom(const char *data, size_t size) {
// assume my resources are freed.
- if (size > UINT32_MAX) {
+ if (size >= UINT32_MAX) {
LOG(FATAL) << "string size can't exceed 2^32 bytes: " << size;
}
char *buf = (char *)malloc(size + 1);
@@ -273,6 +273,44 @@
return mSize == 0;
}
+sp<HidlMemory> HidlMemory::getInstance(const hidl_memory& mem) {
+ sp<HidlMemory> instance = new HidlMemory();
+ instance->hidl_memory::operator=(mem);
+ return instance;
+}
+
+sp<HidlMemory> HidlMemory::getInstance(hidl_memory&& mem) {
+ sp<HidlMemory> instance = new HidlMemory();
+ instance->hidl_memory::operator=(std::move(mem));
+ return instance;
+}
+
+sp<HidlMemory> HidlMemory::getInstance(const hidl_string& name, int fd, uint64_t size) {
+ native_handle_t* handle = native_handle_create(1, 0);
+ if (!handle) {
+ close(fd);
+ LOG(ERROR) << "native_handle_create fails";
+ return new HidlMemory();
+ }
+ handle->data[0] = fd;
+
+ hidl_handle hidlHandle;
+ hidlHandle.setTo(handle, true /* shouldOwn */);
+
+ sp<HidlMemory> instance = new HidlMemory(name, std::move(hidlHandle), size);
+ return instance;
+}
+
+HidlMemory::HidlMemory() : hidl_memory() {}
+
+HidlMemory::HidlMemory(const hidl_string& name, hidl_handle&& handle, size_t size)
+ : hidl_memory(name, std::move(handle), size) {}
+
+// it's required to have at least one out-of-line method to avoid weak vtable
+HidlMemory::~HidlMemory() {
+ hidl_memory::~hidl_memory();
+}
+
} // namespace hardware
} // namespace android
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index ab16709..486fd0a 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -208,6 +208,13 @@
}
/**
+ * Creates a hidl_memory object whose handle has the same lifetime
+ * as the handle moved into it.
+ */
+ hidl_memory(const hidl_string& name, hidl_handle&& handle, size_t size)
+ : mHandle(std::move(handle)), mSize(size), mName(name) {}
+
+ /**
* Creates a hidl_memory object, but doesn't take ownership of
* the passed in native_handle_t; callers are responsible for
* making sure the handle remains valid while this object is
@@ -268,6 +275,9 @@
return mSize;
}
+ // @return true if it's valid
+ inline bool valid() const { return handle() != nullptr; }
+
// offsetof(hidl_memory, mHandle) exposed since mHandle is private.
static const size_t kOffsetOfHandle;
// offsetof(hidl_memory, mName) exposed since mHandle is private.
@@ -279,6 +289,29 @@
hidl_string mName __attribute__ ((aligned(8)));
};
+// HidlMemory is a wrapper class to support sp<> for hidl_memory. It also
+// provides factory methods to create an instance from hidl_memory or
+// from a opened file descriptor. The number of factory methods can be increase
+// to support other type of hidl_memory without break the ABI.
+class HidlMemory : public virtual hidl_memory, public virtual ::android::RefBase {
+public:
+ static sp<HidlMemory> getInstance(const hidl_memory& mem);
+
+ static sp<HidlMemory> getInstance(hidl_memory&& mem);
+
+ static sp<HidlMemory> getInstance(const hidl_string& name, hidl_handle&& handle, uint64_t size);
+ // @param fd, shall be opened and points to the resource.
+ // @note this method takes the ownership of the fd and will close it in
+ // destructor
+ // @return nullptr in failure with the fd closed
+ static sp<HidlMemory> getInstance(const hidl_string& name, int fd, uint64_t size);
+
+ virtual ~HidlMemory();
+
+protected:
+ HidlMemory();
+ HidlMemory(const hidl_string& name, hidl_handle&& handle, size_t size);
+};
////////////////////////////////////////////////////////////////////////////////
template<typename T>
diff --git a/libhidlmemory/include/hidlmemory/mapping.h b/libhidlmemory/include/hidlmemory/mapping.h
index e15eb80..352cbaf 100644
--- a/libhidlmemory/include/hidlmemory/mapping.h
+++ b/libhidlmemory/include/hidlmemory/mapping.h
@@ -13,6 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#ifndef ANDROID_HARDWARE_MAPPING_H
+#define ANDROID_HARDWARE_MAPPING_H
#include <android/hidl/memory/1.0/IMemory.h>
#include <hidl/HidlSupport.h>
@@ -30,3 +32,4 @@
} // namespace hardware
} // namespace android
+#endif
diff --git a/test_main.cpp b/test_main.cpp
index 2811612..0de46ec 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -17,12 +17,15 @@
#define LOG_TAG "LibHidlTest"
#include <android-base/logging.h>
-#include <condition_variable>
+#include <android/hardware/tests/inheritance/1.0/IParent.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <hidl/HidlSupport.h>
+#include <hidl/ServiceManagement.h>
#include <hidl/Status.h>
#include <hidl/TaskRunner.h>
+#include <condition_variable>
+#include <fstream>
#include <vector>
#define EXPECT_ARRAYEQ(__a1__, __a2__, __size__) EXPECT_TRUE(isArrayEqual(__a1__, __a2__, __size__))
@@ -46,6 +49,17 @@
return true;
}
+bool isLibraryOpen(const std::string& lib) {
+ std::ifstream ifs("/proc/self/maps");
+ for (std::string line; std::getline(ifs, line);) {
+ if (line.size() >= lib.size() && line.substr(line.size() - lib.size()) == lib) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
class LibHidlTest : public ::testing::Test {
public:
virtual void SetUp() override {
@@ -441,7 +455,17 @@
EXPECT_THAT(toString(Status::fromExceptionCode(Status::EX_NULL_POINTER)),
HasSubstr("EX_NULL_POINTER"));
+}
+TEST_F(LibHidlTest, PreloadTest) {
+ using ::android::hardware::preloadPassthroughService;
+ using ::android::hardware::tests::inheritance::V1_0::IParent;
+
+ static const std::string kLib = "android.hardware.tests.inheritance@1.0-impl.so";
+
+ EXPECT_FALSE(isLibraryOpen(kLib));
+ preloadPassthroughService<IParent>();
+ EXPECT_TRUE(isLibraryOpen(kLib));
}
int main(int argc, char **argv) {
diff --git a/transport/Android.bp b/transport/Android.bp
index 23f6904..f4ca01c 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -15,6 +15,7 @@
subdirs = [
"allocator/1.0",
"allocator/1.0/default",
+ "allocator/1.0/utils",
"base/1.0",
"manager/1.0",
"manager/1.1",
@@ -24,7 +25,12 @@
"token/1.0/utils",
]
-cc_library_shared {
+hidl_package_root {
+ name: "android.hidl",
+ path: "system/libhidl/transport",
+}
+
+cc_library {
name: "libhidltransport",
vendor_available: true,
vndk: {
diff --git a/transport/Android.mk b/transport/Android.mk
index 0c6c3b4..8012835 100644
--- a/transport/Android.mk
+++ b/transport/Android.mk
@@ -5,6 +5,9 @@
################################################################################
LOCAL_PATH:= $(call my-dir)
+# TODO(b/68433855): re-enable building this in the PDK
+ifneq ($(TARGET_BUILD_PDK),true)
+
include $(CLEAR_VARS)
LOCAL_MODULE := android.hidl.base-V1.0-java-static
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
@@ -53,3 +56,5 @@
$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
include $(BUILD_STATIC_JAVA_LIBRARY)
+
+endif # TARGET_BUILD_PDK not true
diff --git a/transport/HidlPassthroughSupport.cpp b/transport/HidlPassthroughSupport.cpp
index e101e27..b79d21c 100644
--- a/transport/HidlPassthroughSupport.cpp
+++ b/transport/HidlPassthroughSupport.cpp
@@ -35,9 +35,12 @@
// interfaceDescriptor fails
return nullptr;
}
- auto func = gBsConstructorMap.get(myDescriptor, nullptr);
+ auto func = getBsConstructorMap().get(myDescriptor, nullptr);
if (!func) {
- return nullptr;
+ func = gBsConstructorMap.get(myDescriptor, nullptr);
+ if (!func) {
+ return nullptr;
+ }
}
sp<IBase> base = func(static_cast<void*>(iface.get()));
@@ -51,4 +54,4 @@
} // namespace details
} // namespace hardware
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
index 0d2f1bf..9bb8148 100644
--- a/transport/HidlTransportSupport.cpp
+++ b/transport/HidlTransportSupport.cpp
@@ -14,10 +14,7 @@
* 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 {
@@ -56,116 +53,5 @@
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 c6c43a7..04f7290 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -467,6 +467,40 @@
}
struct Waiter : IServiceNotification {
+ Waiter(const std::string& interface, const std::string& instanceName,
+ const sp<IServiceManager1_1>& sm) : mInterfaceName(interface),
+ mInstanceName(instanceName), mSm(sm) {
+ }
+
+ void onFirstRef() override {
+ Return<bool> ret = mSm->registerForNotifications(mInterfaceName, mInstanceName, this);
+
+ if (!ret.isOk()) {
+ LOG(ERROR) << "Transport error, " << ret.description()
+ << ", during notification registration for " << mInterfaceName << "/"
+ << mInstanceName << ".";
+ return;
+ }
+
+ if (!ret) {
+ LOG(ERROR) << "Could not register for notifications for " << mInterfaceName << "/"
+ << mInstanceName << ".";
+ return;
+ }
+
+ mRegisteredForNotifications = true;
+ }
+
+ ~Waiter() {
+ if (mRegisteredForNotifications) {
+ if (!mSm->unregisterForNotifications(mInterfaceName, mInstanceName, this).
+ withDefault(false)) {
+ LOG(ERROR) << "Could not unregister service notification for "
+ << mInterfaceName << "/" << mInstanceName << ".";
+ }
+ }
+ }
+
Return<void> onRegistration(const hidl_string& /* fqName */,
const hidl_string& /* name */,
bool /* preexisting */) override {
@@ -481,9 +515,16 @@
return Void();
}
- void wait(const std::string &interface, const std::string &instanceName) {
+ void wait() {
using std::literals::chrono_literals::operator""s;
+ if (!mRegisteredForNotifications) {
+ // As an alternative, just sleep for a second and return
+ LOG(WARNING) << "Waiting one second for " << mInterfaceName << "/" << mInstanceName;
+ sleep(1);
+ return;
+ }
+
std::unique_lock<std::mutex> lock(mMutex);
while(true) {
mCondition.wait_for(lock, 1s, [this]{
@@ -494,49 +535,147 @@
break;
}
- LOG(WARNING) << "Waited one second for "
- << interface << "/" << instanceName
+ LOG(WARNING) << "Waited one second for " << mInterfaceName << "/" << mInstanceName
<< ". Waiting another...";
}
}
+ // Be careful when using this; after calling reset(), you must always try to retrieve
+ // the corresponding service before blocking on the waiter; otherwise, you might run
+ // into a race-condition where the service has just (re-)registered, you clear the state
+ // here, and subsequently calling waiter->wait() will block forever.
+ void reset() {
+ std::unique_lock<std::mutex> lock(mMutex);
+ mRegistered = false;
+ }
private:
+ const std::string mInterfaceName;
+ const std::string mInstanceName;
+ const sp<IServiceManager1_1>& mSm;
std::mutex mMutex;
std::condition_variable mCondition;
bool mRegistered = false;
+ bool mRegisteredForNotifications = false;
};
void waitForHwService(
const std::string &interface, const std::string &instanceName) {
- const sp<IServiceManager1_1> manager = defaultServiceManager1_1();
+ sp<Waiter> waiter = new Waiter(interface, instanceName, defaultServiceManager1_1());
+ waiter->wait();
+}
- if (manager == nullptr) {
- LOG(ERROR) << "Could not get default service manager.";
- return;
+// Prints relevant error/warning messages for error return values from
+// details::canCastInterface(), both transaction errors (!castReturn.isOk())
+// as well as actual cast failures (castReturn.isOk() && castReturn = false).
+// Returns 'true' if the error is non-fatal and it's useful to retry
+bool handleCastError(const Return<bool>& castReturn, const std::string& descriptor,
+ const std::string& instance) {
+ if (castReturn.isOk()) {
+ if (castReturn) {
+ details::logAlwaysFatal("Successful cast value passed into handleCastError.");
+ }
+ // This should never happen, and there's not really a point in retrying.
+ ALOGE("getService: received incompatible service (bug in hwservicemanager?) for "
+ "%s/%s.", descriptor.c_str(), instance.c_str());
+ return false;
+ }
+ if (castReturn.isDeadObject()) {
+ ALOGW("getService: found dead hwbinder service for %s/%s.", descriptor.c_str(),
+ instance.c_str());
+ return true;
+ }
+ // This can happen due to:
+ // 1) No SELinux permissions
+ // 2) Other transaction failure (no buffer space, kernel error)
+ // The first isn't recoverable, but the second is.
+ // Since we can't yet differentiate between the two, and clients depend
+ // on us not blocking in case 1), treat this as a fatal error for now.
+ ALOGW("getService: unable to call into hwbinder service for %s/%s.",
+ descriptor.c_str(), instance.c_str());
+ return false;
+}
+
+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<IServiceManager1_1> sm = defaultServiceManager1_1();
+ if (sm == nullptr) {
+ ALOGE("getService: defaultServiceManager() is null");
+ return nullptr;
}
- sp<Waiter> waiter = new Waiter();
- Return<bool> ret = manager->registerForNotifications(interface, instanceName, waiter);
+ Return<Transport> transportRet = sm->getTransport(descriptor, instance);
- if (!ret.isOk()) {
- LOG(ERROR) << "Transport error, " << ret.description()
- << ", during notification registration for "
- << interface << "/" << instanceName << ".";
- return;
+ 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
+
+ sp<Waiter> waiter = new Waiter(descriptor, instance, sm);
+ while (!getStub && (vintfHwbinder || vintfLegacy)) {
+ waiter->reset(); // don't reorder this -- see comments on reset()
+ 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) {
+ Return<bool> canCastRet =
+ details::canCastInterface(base.get(), descriptor.c_str(), true /* emitError */);
+
+ if (canCastRet.isOk() && canCastRet) {
+ return base; // still needs to be wrapped by Bp class.
+ }
+
+ if (!handleCastError(canCastRet, descriptor, instance)) break;
+ }
+
+ // In case of legacy or we were not asked to retry, don't.
+ if (vintfLegacy || !retry) break;
+
+ ALOGI("getService: Trying again for %s/%s...", descriptor.c_str(), instance.c_str());
+ waiter->wait();
}
- if (!ret) {
- LOG(ERROR) << "Could not register for notifications for "
- << interface << "/" << instanceName << ".";
- return;
+ 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;
+ }
}
- waiter->wait(interface, instanceName);
-
- if (!manager->unregisterForNotifications(interface, instanceName, waiter).withDefault(false)) {
- LOG(ERROR) << "Could not unregister service notification for "
- << interface << "/" << instanceName << ".";
- }
+ return nullptr;
}
}; // namespace details
diff --git a/transport/Static.cpp b/transport/Static.cpp
index 784b835..cbe6add 100644
--- a/transport/Static.cpp
+++ b/transport/Static.cpp
@@ -29,16 +29,28 @@
Mutex gDefaultServiceManagerLock;
sp<android::hidl::manager::V1_0::IServiceManager> gDefaultServiceManager;
-ConcurrentMap<std::string, std::function<sp<IBinder>(void *)>>
- gBnConstructorMap{};
+// Deprecated; kept for ABI compatibility. Use getBnConstructorMap.
+BnConstructorMap gBnConstructorMap{};
ConcurrentMap<const ::android::hidl::base::V1_0::IBase*, wp<::android::hardware::BHwBinder>>
gBnMap{};
ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap{};
-ConcurrentMap<std::string, std::function<sp<::android::hidl::base::V1_0::IBase>(void *)>>
- gBsConstructorMap;
+// Deprecated; kept for ABI compatibility. Use getBsConstructorMap.
+BsConstructorMap gBsConstructorMap{};
+
+// For static executables, it is not guaranteed that gBnConstructorMap are initialized before
+// used in HAL definition libraries.
+BnConstructorMap& getBnConstructorMap() {
+ static BnConstructorMap map{};
+ return map;
+}
+
+BsConstructorMap& getBsConstructorMap() {
+ static BsConstructorMap map{};
+ return map;
+}
} // namespace details
} // namespace hardware
diff --git a/transport/allocator/1.0/Android.bp b/transport/allocator/1.0/Android.bp
index f02d1d1..a3d885a 100644
--- a/transport/allocator/1.0/Android.bp
+++ b/transport/allocator/1.0/Android.bp
@@ -1,141 +1,17 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
+// This file is autogenerated by hidl-gen -Landroidbp.
-filegroup {
- name: "android.hidl.allocator@1.0_hal",
- srcs: [
- "IAllocator.hal",
- ],
-}
-
-genrule {
- name: "android.hidl.allocator@1.0_genc++",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hidl:system/libhidl/transport android.hidl.allocator@1.0",
- srcs: [
- ":android.hidl.allocator@1.0_hal",
- ],
- out: [
- "android/hidl/allocator/1.0/AllocatorAll.cpp",
- ],
-}
-
-genrule {
- name: "android.hidl.allocator@1.0_genc++_headers",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hidl:system/libhidl/transport android.hidl.allocator@1.0",
- srcs: [
- ":android.hidl.allocator@1.0_hal",
- ],
- out: [
- "android/hidl/allocator/1.0/IAllocator.h",
- "android/hidl/allocator/1.0/IHwAllocator.h",
- "android/hidl/allocator/1.0/BnHwAllocator.h",
- "android/hidl/allocator/1.0/BpHwAllocator.h",
- "android/hidl/allocator/1.0/BsAllocator.h",
- ],
-}
-
-cc_library {
+hidl_interface {
name: "android.hidl.allocator@1.0",
- defaults: ["hidl-module-defaults"],
- generated_sources: ["android.hidl.allocator@1.0_genc++"],
- generated_headers: ["android.hidl.allocator@1.0_genc++_headers"],
- export_generated_headers: ["android.hidl.allocator@1.0_genc++_headers"],
- vendor_available: true,
+ root: "android.hidl",
vndk: {
enabled: true,
},
- shared_libs: [
- "libhidlbase",
- "libhidltransport",
- "libhwbinder",
- "liblog",
- "libutils",
- "libcutils",
- ],
- export_shared_lib_headers: [
- "libhidlbase",
- "libhidltransport",
- "libhwbinder",
- "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",
+ "IAllocator.hal",
],
- out: [
- "android/hidl/allocator/1.0/AAllocator.cpp",
+ interfaces: [
+ "android.hidl.base@1.0",
],
+ gen_java: false,
}
-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/utils/Android.bp b/transport/allocator/1.0/utils/Android.bp
new file mode 100644
index 0000000..b1a3f41
--- /dev/null
+++ b/transport/allocator/1.0/utils/Android.bp
@@ -0,0 +1,39 @@
+// 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 {
+ name: "libhidlallocatorutils",
+ vendor_available: true,
+ vndk: {
+ enabled: true,
+ },
+ defaults: ["libhidl-defaults"],
+ shared_libs: [
+ "libbinder",
+ "libcutils",
+ "libhidlbase",
+ "libhidltransport",
+ "android.hidl.memory@1.0"
+ ],
+ export_include_dirs: ["include"],
+
+ export_shared_lib_headers: [
+ "libbinder",
+ "libhidlbase"
+ ],
+
+ srcs: [
+ "FrameworkUtils.cpp"
+ ],
+}
diff --git a/transport/allocator/1.0/utils/FrameworkUtils.cpp b/transport/allocator/1.0/utils/FrameworkUtils.cpp
new file mode 100644
index 0000000..fec83ac
--- /dev/null
+++ b/transport/allocator/1.0/utils/FrameworkUtils.cpp
@@ -0,0 +1,39 @@
+/*
+ * 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 <unistd.h>
+
+#include <hidlmemory/FrameworkUtils.h>
+
+namespace android {
+
+namespace hardware {
+
+sp<HidlMemory> fromHeap(const sp<IMemoryHeap>& heap) {
+ int fd = dup(heap->getHeapID());
+
+ if (fd < 0) {
+ return HidlMemory::getInstance(hidl_memory());
+ }
+
+ // Only being used because this library is paired with the IAllocator
+ // ashmem. Other places should not make assumptions about the contents
+ // of this memory.
+ return HidlMemory::getInstance("ashmem", fd, heap->getSize());
+}
+
+} // namespace hardware
+} // namespace android
diff --git a/transport/allocator/1.0/utils/include/hidlmemory/FrameworkUtils.h b/transport/allocator/1.0/utils/include/hidlmemory/FrameworkUtils.h
new file mode 100644
index 0000000..0a62575
--- /dev/null
+++ b/transport/allocator/1.0/utils/include/hidlmemory/FrameworkUtils.h
@@ -0,0 +1,34 @@
+/*
+ * 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 <binder/IMemory.h>
+#include <hidl/HidlSupport.h>
+
+namespace android {
+
+namespace hardware {
+
+/**
+ * Returns a new IMemory instance corresponding to a framework IMemoryHeap object.
+ * This encapsulates the idea that IMemoryHeap and the ashmem instance of hidl
+ * IMemory are backed by the same object.
+ *
+ * Return is never nullptr. May be an invalid hidl_memory object.
+ */
+sp<HidlMemory> fromHeap(const sp<IMemoryHeap>& heap);
+
+} // namespace hardware
+} // namespace android
diff --git a/transport/base/1.0/Android.bp b/transport/base/1.0/Android.bp
index 73ee5cf..bd2ae49 100644
--- a/transport/base/1.0/Android.bp
+++ b/transport/base/1.0/Android.bp
@@ -1,137 +1,19 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
+// This file is autogenerated by hidl-gen -Landroidbp.
-filegroup {
- name: "android.hidl.base@1.0_hal",
+hidl_interface {
+ name: "android.hidl.base@1.0",
+ root: "android.hidl",
+ core_interface: true,
+ vndk: {
+ enabled: true,
+ },
srcs: [
"types.hal",
"IBase.hal",
],
+ types: [
+ "DebugInfo",
+ ],
+ gen_java: true,
}
-genrule {
- name: "android.hidl.base@1.0_genc++",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hidl:system/libhidl/transport android.hidl.base@1.0",
- srcs: [
- ":android.hidl.base@1.0_hal",
- ],
- out: [
- "android/hidl/base/1.0/types.cpp",
- "android/hidl/base/1.0/BaseAll.cpp",
- ],
-}
-
-genrule {
- name: "android.hidl.base@1.0_genc++_headers",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hidl:system/libhidl/transport android.hidl.base@1.0",
- srcs: [
- ":android.hidl.base@1.0_hal",
- ],
- out: [
- "android/hidl/base/1.0/types.h",
- "android/hidl/base/1.0/hwtypes.h",
- "android/hidl/base/1.0/IBase.h",
- "android/hidl/base/1.0/IHwBase.h",
- "android/hidl/base/1.0/BnHwBase.h",
- "android/hidl/base/1.0/BpHwBase.h",
- "android/hidl/base/1.0/BsBase.h",
- ],
-}
-
-// 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/include/hidl/HidlBinderSupport.h b/transport/include/hidl/HidlBinderSupport.h
index fc834b9..09111f4 100644
--- a/transport/include/hidl/HidlBinderSupport.h
+++ b/transport/include/hidl/HidlBinderSupport.h
@@ -330,9 +330,12 @@
sp<IBinder> sBnObj = wBnObj.promote();
if (sBnObj == nullptr) {
- auto func = details::gBnConstructorMap.get(myDescriptor, nullptr);
+ auto func = details::getBnConstructorMap().get(myDescriptor, nullptr);
if (!func) {
- return nullptr;
+ func = details::gBnConstructorMap.get(myDescriptor, nullptr);
+ if (!func) {
+ return nullptr;
+ }
}
sBnObj = sp<IBinder>(func(static_cast<void*>(ifacePtr)));
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index 4c9a881..730727c 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -22,6 +22,7 @@
#include <hidl/HidlPassthroughSupport.h>
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportUtils.h>
+#include <hidl/ServiceManagement.h>
namespace android {
namespace hardware {
@@ -111,16 +112,6 @@
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>>
diff --git a/transport/include/hidl/ServiceManagement.h b/transport/include/hidl/ServiceManagement.h
index d53cd7e..4df156b 100644
--- a/transport/include/hidl/ServiceManagement.h
+++ b/transport/include/hidl/ServiceManagement.h
@@ -18,6 +18,8 @@
#define ANDROID_HARDWARE_ISERVICE_MANAGER_H
#include <string>
+
+#include <android/hidl/base/1.0/IBase.h>
#include <utils/StrongPointer.h>
namespace android {
@@ -45,6 +47,16 @@
void waitForHwService(const std::string &interface, const std::string &instanceName);
void preloadPassthroughService(const std::string &descriptor);
+
+// 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);
};
// These functions are for internal use by hidl. If you want to get ahold
diff --git a/transport/include/hidl/Static.h b/transport/include/hidl/Static.h
index 63b06fe..0522e44 100644
--- a/transport/include/hidl/Static.h
+++ b/transport/include/hidl/Static.h
@@ -40,18 +40,22 @@
extern ConcurrentMap<const ::android::hidl::base::V1_0::IBase*, wp<::android::hardware::BHwBinder>>
gBnMap;
+using BnConstructorMap = ConcurrentMap<std::string, std::function<sp<IBinder>(void*)>>;
// For HidlBinderSupport and autogenerated code
// value function receives reinterpret_cast<void *>(static_cast<IFoo *>(foo)),
// returns sp<IBinder>
-extern ConcurrentMap<std::string,
- std::function<sp<IBinder>(void *)>> gBnConstructorMap;
+// deprecated; use getBnConstructorMap instead.
+extern BnConstructorMap gBnConstructorMap;
+BnConstructorMap& getBnConstructorMap();
+using BsConstructorMap = ConcurrentMap<std::string,
+ std::function<sp<::android::hidl::base::V1_0::IBase>(void*)>>;
// For HidlPassthroughSupport and autogenerated code
// value function receives reinterpret_cast<void *>(static_cast<IFoo *>(foo)),
// returns sp<IBase>
-extern ConcurrentMap<std::string,
- std::function<sp<::android::hidl::base::V1_0::IBase>(void *)>> gBsConstructorMap;
-
+// deprecated; use getBsConstructorMap instead.
+extern BsConstructorMap gBsConstructorMap;
+BsConstructorMap& getBsConstructorMap();
} // namespace details
} // namespace hardware
} // namespace android
diff --git a/transport/manager/1.0/Android.bp b/transport/manager/1.0/Android.bp
index a0898d7..e4a120b 100644
--- a/transport/manager/1.0/Android.bp
+++ b/transport/manager/1.0/Android.bp
@@ -1,145 +1,19 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
+// This file is autogenerated by hidl-gen -Landroidbp.
-filegroup {
- name: "android.hidl.manager@1.0_hal",
+hidl_interface {
+ name: "android.hidl.manager@1.0",
+ root: "android.hidl",
+ core_interface: true,
+ vndk: {
+ enabled: true,
+ },
srcs: [
"IServiceManager.hal",
"IServiceNotification.hal",
],
+ interfaces: [
+ "android.hidl.base@1.0",
+ ],
+ gen_java: true,
}
-genrule {
- name: "android.hidl.manager@1.0_genc++",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hidl:system/libhidl/transport android.hidl.manager@1.0",
- srcs: [
- ":android.hidl.manager@1.0_hal",
- ],
- out: [
- "android/hidl/manager/1.0/ServiceManagerAll.cpp",
- "android/hidl/manager/1.0/ServiceNotificationAll.cpp",
- ],
-}
-
-genrule {
- name: "android.hidl.manager@1.0_genc++_headers",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hidl:system/libhidl/transport android.hidl.manager@1.0",
- srcs: [
- ":android.hidl.manager@1.0_hal",
- ],
- out: [
- "android/hidl/manager/1.0/IServiceManager.h",
- "android/hidl/manager/1.0/IHwServiceManager.h",
- "android/hidl/manager/1.0/BnHwServiceManager.h",
- "android/hidl/manager/1.0/BpHwServiceManager.h",
- "android/hidl/manager/1.0/BsServiceManager.h",
- "android/hidl/manager/1.0/IServiceNotification.h",
- "android/hidl/manager/1.0/IHwServiceNotification.h",
- "android/hidl/manager/1.0/BnHwServiceNotification.h",
- "android/hidl/manager/1.0/BpHwServiceNotification.h",
- "android/hidl/manager/1.0/BsServiceNotification.h",
- ],
-}
-
-// 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.1/Android.bp b/transport/manager/1.1/Android.bp
index 7a4094e..cde68a7 100644
--- a/transport/manager/1.1/Android.bp
+++ b/transport/manager/1.1/Android.bp
@@ -1,138 +1,19 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
+// This file is autogenerated by hidl-gen -Landroidbp.
-filegroup {
- name: "android.hidl.manager@1.1_hal",
+hidl_interface {
+ name: "android.hidl.manager@1.1",
+ root: "android.hidl",
+ core_interface: true,
+ vndk: {
+ enabled: true,
+ },
srcs: [
"IServiceManager.hal",
],
+ interfaces: [
+ "android.hidl.base@1.0",
+ "android.hidl.manager@1.0",
+ ],
+ gen_java: true,
}
-genrule {
- name: "android.hidl.manager@1.1_genc++",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hidl:system/libhidl/transport android.hidl.manager@1.1",
- srcs: [
- ":android.hidl.manager@1.1_hal",
- ],
- out: [
- "android/hidl/manager/1.1/ServiceManagerAll.cpp",
- ],
-}
-
-genrule {
- name: "android.hidl.manager@1.1_genc++_headers",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hidl:system/libhidl/transport android.hidl.manager@1.1",
- srcs: [
- ":android.hidl.manager@1.1_hal",
- ],
- out: [
- "android/hidl/manager/1.1/IServiceManager.h",
- "android/hidl/manager/1.1/IHwServiceManager.h",
- "android/hidl/manager/1.1/BnHwServiceManager.h",
- "android/hidl/manager/1.1/BpHwServiceManager.h",
- "android/hidl/manager/1.1/BsServiceManager.h",
- ],
-}
-
-// 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/memory/1.0/Android.bp b/transport/memory/1.0/Android.bp
index cf24616..eaa3037 100644
--- a/transport/memory/1.0/Android.bp
+++ b/transport/memory/1.0/Android.bp
@@ -1,151 +1,19 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
+// This file is autogenerated by hidl-gen -Landroidbp.
-filegroup {
- name: "android.hidl.memory@1.0_hal",
- srcs: [
- "IMapper.hal",
- "IMemory.hal",
- ],
-}
-
-genrule {
- name: "android.hidl.memory@1.0_genc++",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hidl:system/libhidl/transport android.hidl.memory@1.0",
- srcs: [
- ":android.hidl.memory@1.0_hal",
- ],
- out: [
- "android/hidl/memory/1.0/MapperAll.cpp",
- "android/hidl/memory/1.0/MemoryAll.cpp",
- ],
-}
-
-genrule {
- name: "android.hidl.memory@1.0_genc++_headers",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hidl:system/libhidl/transport android.hidl.memory@1.0",
- srcs: [
- ":android.hidl.memory@1.0_hal",
- ],
- out: [
- "android/hidl/memory/1.0/IMapper.h",
- "android/hidl/memory/1.0/IHwMapper.h",
- "android/hidl/memory/1.0/BnHwMapper.h",
- "android/hidl/memory/1.0/BpHwMapper.h",
- "android/hidl/memory/1.0/BsMapper.h",
- "android/hidl/memory/1.0/IMemory.h",
- "android/hidl/memory/1.0/IHwMemory.h",
- "android/hidl/memory/1.0/BnHwMemory.h",
- "android/hidl/memory/1.0/BpHwMemory.h",
- "android/hidl/memory/1.0/BsMemory.h",
- ],
-}
-
-cc_library {
+hidl_interface {
name: "android.hidl.memory@1.0",
- defaults: ["hidl-module-defaults"],
- generated_sources: ["android.hidl.memory@1.0_genc++"],
- generated_headers: ["android.hidl.memory@1.0_genc++_headers"],
- export_generated_headers: ["android.hidl.memory@1.0_genc++_headers"],
- vendor_available: true,
+ root: "android.hidl",
vndk: {
enabled: true,
support_system_process: true,
},
- shared_libs: [
- "libhidlbase",
- "libhidltransport",
- "libhwbinder",
- "liblog",
- "libutils",
- "libcutils",
- ],
- export_shared_lib_headers: [
- "libhidlbase",
- "libhidltransport",
- "libhwbinder",
- "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",
+ "IMapper.hal",
+ "IMemory.hal",
],
- out: [
- "android/hidl/memory/1.0/AMapper.cpp",
- "android/hidl/memory/1.0/AMemory.cpp",
+ interfaces: [
+ "android.hidl.base@1.0",
],
+ gen_java: false,
}
-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/token/1.0/Android.bp b/transport/token/1.0/Android.bp
index 1bc6d97..c0988cb 100644
--- a/transport/token/1.0/Android.bp
+++ b/transport/token/1.0/Android.bp
@@ -1,162 +1,17 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
+// This file is autogenerated by hidl-gen -Landroidbp.
-filegroup {
- name: "android.hidl.token@1.0_hal",
- srcs: [
- "ITokenManager.hal",
- ],
-}
-
-genrule {
- name: "android.hidl.token@1.0_genc++",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hidl:system/libhidl/transport android.hidl.token@1.0",
- srcs: [
- ":android.hidl.token@1.0_hal",
- ],
- out: [
- "android/hidl/token/1.0/TokenManagerAll.cpp",
- ],
-}
-
-genrule {
- name: "android.hidl.token@1.0_genc++_headers",
- tools: ["hidl-gen"],
- cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hidl:system/libhidl/transport android.hidl.token@1.0",
- srcs: [
- ":android.hidl.token@1.0_hal",
- ],
- out: [
- "android/hidl/token/1.0/ITokenManager.h",
- "android/hidl/token/1.0/IHwTokenManager.h",
- "android/hidl/token/1.0/BnHwTokenManager.h",
- "android/hidl/token/1.0/BpHwTokenManager.h",
- "android/hidl/token/1.0/BsTokenManager.h",
- ],
-}
-
-cc_library {
+hidl_interface {
name: "android.hidl.token@1.0",
- defaults: ["hidl-module-defaults"],
- generated_sources: ["android.hidl.token@1.0_genc++"],
- generated_headers: ["android.hidl.token@1.0_genc++_headers"],
- export_generated_headers: ["android.hidl.token@1.0_genc++_headers"],
- vendor_available: true,
+ root: "android.hidl",
vndk: {
enabled: true,
},
- shared_libs: [
- "libhidlbase",
- "libhidltransport",
- "libhwbinder",
- "liblog",
- "libutils",
- "libcutils",
- ],
- export_shared_lib_headers: [
- "libhidlbase",
- "libhidltransport",
- "libhwbinder",
- "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",
+ "ITokenManager.hal",
],
- out: [
- "android/hidl/token/V1_0/ITokenManager.java",
+ interfaces: [
+ "android.hidl.base@1.0",
],
+ gen_java: true,
}
-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++"],
-}