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++"],
-}