Merge "libhidl: remove hridya@ from OWNERS file"
diff --git a/Android.bp b/Android.bp
index 33ba0e9..80f663a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -95,7 +95,7 @@
"//apex_available:platform",
"com.android.neuralnetworks",
"test_com.android.neuralnetworks",
- "com.android.bluetooth.updatable",
+ "com.android.bluetooth",
"com.android.media",
"com.android.media.swcodec",
"com.android.tethering",
@@ -110,23 +110,6 @@
min_sdk_version: "29",
}
-// Only libhwbinder_benchmark needs to have pgo enabled. When all places
-// support having PGO selectively enabled, all places can use libhwbinder.
-//
-// http://b/77320844
-cc_library {
- name: "libhidlbase_pgo",
- defaults: [
- "libhidlbase-combined-impl",
- "hwbinder_benchmark_pgo",
- ],
- whole_static_libs: [
- "libhwbinder_pgo-impl-internal",
- ],
-
- visibility: ["//system/libhwbinder:__subpackages__"],
-}
-
// WARNING: deprecated
// This library is no longer required, and dependencies should be taken on libhidlbase instead.
// This is automatically removed by bpfix. Once there are no makefiles, fixes can be automatically applied, and this can be removed.
diff --git a/adapter/Android.bp b/adapter/Android.bp
deleted file mode 100644
index 83609ff..0000000
--- a/adapter/Android.bp
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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.
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "system_libhidl_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["system_libhidl_license"],
-}
-
-cc_library {
- name: "libhidladapter",
- defaults: ["libhidl-defaults"],
- vendor_available: true,
- product_available: true,
- // TODO(b/153609531): remove when no longer needed.
- native_bridge_supported: true,
- srcs: [
- "HidlBinderAdapter.cpp"
- ],
- export_include_dirs: ["include"],
- shared_libs: [
- "libbase",
- "libhidlbase",
- "liblog",
- "libutils",
- ],
- export_shared_lib_headers: [
- "libhidlbase",
- "libutils",
- ],
-}
diff --git a/adapter/HidlBinderAdapter.cpp b/adapter/HidlBinderAdapter.cpp
deleted file mode 100644
index ed6dad1..0000000
--- a/adapter/HidlBinderAdapter.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <hidladapter/HidlBinderAdapter.h>
-
-#include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <android/hidl/base/1.0/IBase.h>
-#include <android/hidl/manager/1.0/IServiceManager.h>
-#include <hidl/HidlTransportSupport.h>
-
-#include <unistd.h>
-#include <iostream>
-#include <map>
-#include <string>
-
-namespace android {
-namespace hardware {
-namespace details {
-
-using android::base::SetProperty;
-using android::base::WaitForProperty;
-
-const static std::string kDeactivateProp = "test.hidl.adapters.deactivated";
-
-int usage(const std::string& me) {
- std::cerr << "usage: " << me
- << " [-p|P] [-n instance-name] interface-name instance-name number-of-threads."
- << std::endl;
- std::cerr << " -p: stop based on property " << kDeactivateProp << "and reset it."
- << std::endl;
- std::cerr << " -P: stop based on interface specific property " << kDeactivateProp
- << ".<fq-name>.<instance-name>" << std::endl;
- std::cerr
- << " -n instance-name: register as a different instance name (does not de-register)"
- << std::endl;
- return EINVAL;
-}
-
-enum class StopMethod {
- NONE,
- ALL,
- SPECIFIC,
-};
-
-struct Args {
- StopMethod stopMethod = StopMethod::NONE;
- std::string interface; // e.x. IFoo
- std::string instanceName; // e.x. default
- int threadNumber;
- std::string registerInstanceName; // e.x. default
-};
-
-bool processArguments(int argc, char** argv, Args* args) {
- int c;
- while ((c = getopt(argc, argv, "pPn:")) != -1) {
- switch (c) {
- case 'p': {
- args->stopMethod = StopMethod::ALL;
- break;
- }
- case 'P': {
- args->stopMethod = StopMethod::SPECIFIC;
- break;
- }
- case 'n': {
- args->registerInstanceName = optarg;
- break;
- }
- default: { return false; }
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc != 3) {
- std::cerr << "ERROR: requires exactly three positional arguments for "
- "interface, instance name, and number of threads, but "
- << argc << " provided." << std::endl;
- return false;
- }
-
- args->interface = argv[0];
- args->instanceName = argv[1];
- args->threadNumber = std::stoi(argv[2]);
-
- if (args->threadNumber <= 0) {
- std::cerr << "ERROR: invalid thread number " << args->threadNumber
- << " must be a positive integer." << std::endl;
- return false;
- }
-
- if (args->registerInstanceName.empty()) {
- args->registerInstanceName = args->instanceName;
- }
-
- return true;
-}
-
-// only applies for -p argument
-void waitForAdaptersDeactivated(const std::string& property) {
- using std::literals::chrono_literals::operator""s;
-
- while (!WaitForProperty(property, "true", 30s)) {
- // Log this so that when using this option on testing devices, there is
- // a clear indication if adapters are not properly stopped
- LOG(WARNING) << "Adapter use in progress. Waiting for stop based on 'true' " << property;
- }
-
- SetProperty(property, "false");
-}
-
-int adapterMain(const std::string& package, int argc, char** argv,
- const AdaptersFactory& adapters) {
- using android::hardware::configureRpcThreadpool;
- using android::hidl::base::V1_0::IBase;
- using android::hidl::manager::V1_0::IServiceManager;
-
- const std::string& me = argc > 0 ? argv[0] : "(error)";
-
- Args args;
- if (!processArguments(argc, argv, &args)) {
- return usage(me);
- }
-
- std::string interfaceName = package + "::" + args.interface;
-
- auto it = adapters.find(interfaceName);
- if (it == adapters.end()) {
- std::cerr << "ERROR: could not resolve " << interfaceName << "." << std::endl;
- return 1;
- }
-
- std::cout << "Trying to adapt down " << interfaceName << "/" << args.instanceName << " to "
- << args.registerInstanceName << std::endl;
-
- configureRpcThreadpool(args.threadNumber, false /* callerWillJoin */);
-
- sp<IServiceManager> manager = IServiceManager::getService();
- if (manager == nullptr) {
- std::cerr << "ERROR: could not retrieve service manager." << std::endl;
- return 1;
- }
-
- sp<IBase> implementation = manager->get(interfaceName, args.instanceName).withDefault(nullptr);
- if (implementation == nullptr) {
- std::cerr << "ERROR: could not retrieve desired implementation" << std::endl;
- return 1;
- }
-
- sp<IBase> adapter = it->second(implementation);
- if (adapter == nullptr) {
- std::cerr << "ERROR: could not create adapter." << std::endl;
- return 1;
- }
-
- bool replaced = manager->add(args.registerInstanceName, adapter).withDefault(false);
- if (!replaced) {
- std::cerr << "ERROR: could not register the service with the service manager." << std::endl;
- return 1;
- }
-
- switch (args.stopMethod) {
- case StopMethod::NONE: {
- std::cout << "Press any key to disassociate adapter." << std::endl;
- getchar();
- break;
- };
- case StopMethod::SPECIFIC: {
- const std::string property =
- kDeactivateProp + "." + interfaceName + "." + args.registerInstanceName;
- std::cout << "Set " << property << " to true to deactivate." << std::endl;
- waitForAdaptersDeactivated(property);
- break;
- };
- case StopMethod::ALL: {
- std::cout << "Set " << kDeactivateProp << " to true to deactivate." << std::endl;
- waitForAdaptersDeactivated(kDeactivateProp);
- break;
- };
- }
-
- // automatically unregistered on process exit if it is a new instance name
- if (args.registerInstanceName == args.instanceName) {
- bool restored = manager->add(args.instanceName, implementation).withDefault(false);
- if (!restored) {
- std::cerr << "ERROR: could not re-register interface with the service manager."
- << std::endl;
- return 1;
- }
- }
-
- std::cout << "Success." << std::endl;
-
- return 0;
-}
-
-// If an interface is adapted to 1.0, it can then not be adapted to 1.1 in the same process.
-// This poses a problem in the following scenario:
-// auto interface = new V1_1::implementation::IFoo;
-// hidlObject1_0->foo(interface) // adaptation set at 1.0
-// hidlObject1_1->bar(interface) // adaptation still is 1.0
-// This could be solved by keeping a map of IBase,fqName -> IBase, but then you end up
-// with multiple names for the same interface.
-sp<IBase> adaptWithDefault(const sp<IBase>& something,
- const std::function<sp<IBase>()>& makeDefault) {
- static std::map<sp<IBase>, sp<IBase>> sAdapterMap;
-
- if (something == nullptr) {
- return something;
- }
-
- auto it = sAdapterMap.find(something);
- if (it == sAdapterMap.end()) {
- it = sAdapterMap.insert(it, {something, makeDefault()});
- }
-
- return it->second;
-}
-
-} // namespace details
-} // namespace hardware
-} // namespace android
diff --git a/adapter/include/hidladapter/HidlBinderAdapter.h b/adapter/include/hidladapter/HidlBinderAdapter.h
deleted file mode 100644
index 46df554..0000000
--- a/adapter/include/hidladapter/HidlBinderAdapter.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <android/hidl/base/1.0/IBase.h>
-#include <hidl/HidlSupport.h>
-
-#include <map>
-
-namespace android {
-namespace hardware {
-
-namespace details {
-
-using IBase = ::android::hidl::base::V1_0::IBase;
-
-// AdapterFactory(impl) -> adapter
-using AdapterFactory = std::function<sp<IBase>(sp<IBase>)>;
-// AdaptersFactory(package@interface)(impl) -> adapter
-using AdaptersFactory = std::map<std::string, AdapterFactory>;
-
-int adapterMain(const std::string& package, int argc, char** argv, const AdaptersFactory& adapters);
-
-sp<IBase> adaptWithDefault(const sp<IBase>& something,
- const std::function<sp<IBase>()>& makeDefault);
-
-} // namespace details
-
-template <typename... Adapters>
-int adapterMain(const std::string& package, int argc, char** argv) {
- return details::adapterMain(
- package, argc, argv,
- {{Adapters::Pure::descriptor, [](sp<::android::hidl::base::V1_0::IBase> base) {
- return details::adaptWithDefault(
- base, [&] { return new Adapters(Adapters::Pure::castFrom(base)); });
- }}...});
-}
-
-} // namespace hardware
-} // namespace android
\ No newline at end of file
diff --git a/base/HidlInternal.cpp b/base/HidlInternal.cpp
index e5c8f70..a94f235 100644
--- a/base/HidlInternal.cpp
+++ b/base/HidlInternal.cpp
@@ -25,26 +25,6 @@
#include <android-base/properties.h>
#include <android-base/stringprintf.h>
-#ifdef LIBHIDL_TARGET_DEBUGGABLE
-#include <dirent.h>
-#include <dlfcn.h>
-#include <link.h>
-#include <utils/misc.h>
-#include <regex>
-
-extern "C" __attribute__((weak)) void __sanitizer_cov_dump();
-
-const char kGcovPrefixEnvVar[] = "GCOV_PREFIX";
-const char kGcovPrefixOverrideEnvVar[] = "GCOV_PREFIX_OVERRIDE";
-const char kGcovPrefixPath[] = "/data/misc/trace/";
-const char kSysPropHalCoverage[] = "hal.coverage.enable";
-#if defined(__LP64__)
-const char kSysPropInstrumentationPath[] = "hal.instrumentation.lib.path.64";
-#else
-const char kSysPropInstrumentationPath[] = "hal.instrumentation.lib.path.32";
-#endif
-#endif // LIBHIDL_TARGET_DEBUGGABLE
-
namespace android {
namespace hardware {
namespace details {
@@ -70,52 +50,7 @@
HidlInstrumentor::HidlInstrumentor(const std::string& package, const std::string& interface)
: mEnableInstrumentation(false),
mInstrumentationLibPackage(package),
- mInterfaceName(interface) {
-#ifdef LIBHIDL_TARGET_DEBUGGABLE
- configureInstrumentation(false);
- if (__sanitizer_cov_dump != nullptr) {
- ::android::add_sysprop_change_callback(
- []() {
- bool enableCoverage = base::GetBoolProperty(kSysPropHalCoverage, false);
- if (enableCoverage) {
- __sanitizer_cov_dump();
- }
- },
- 0);
- }
- if (base::GetBoolProperty("ro.vts.coverage", false)) {
- const char* prefixOverride = getenv(kGcovPrefixOverrideEnvVar);
- if (prefixOverride == nullptr || strcmp(prefixOverride, "true") != 0) {
- const std::string gcovPath = kGcovPrefixPath + std::to_string(getpid());
- setenv(kGcovPrefixEnvVar, gcovPath.c_str(), true /* overwrite */);
- }
- ::android::add_sysprop_change_callback(
- []() {
- const bool enableCoverage = base::GetBoolProperty(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
-}
+ mInterfaceName(interface) {}
HidlInstrumentor::~HidlInstrumentor() {}
@@ -137,93 +72,13 @@
void HidlInstrumentor::registerInstrumentationCallbacks(
std::vector<InstrumentationCallback> *instrumentationCallbacks) {
-#ifdef LIBHIDL_TARGET_DEBUGGABLE
- std::vector<std::string> instrumentationLibPaths;
- const std::string instrumentationLibPath = base::GetProperty(kSysPropInstrumentationPath, "");
- if (instrumentationLibPath.size() > 0) {
- instrumentationLibPaths.push_back(instrumentationLibPath);
- } else {
- static std::string halLibPathVndkSp = getVndkSpHwPath();
-#ifndef __ANDROID_VNDK__
- instrumentationLibPaths.push_back(HAL_LIBRARY_PATH_SYSTEM);
-#endif
- instrumentationLibPaths.push_back(halLibPathVndkSp);
- instrumentationLibPaths.push_back(HAL_LIBRARY_PATH_VENDOR);
- instrumentationLibPaths.push_back(HAL_LIBRARY_PATH_ODM);
- }
-
- for (const auto& path : instrumentationLibPaths) {
- DIR *dir = opendir(path.c_str());
- if (dir == nullptr) {
- LOG(WARNING) << path << " does not exist. ";
- return;
- }
-
- struct dirent *file;
- while ((file = readdir(dir)) != nullptr) {
- if (!isInstrumentationLib(file))
- continue;
-
- void *handle = dlopen((path + file->d_name).c_str(), RTLD_NOW);
- char *error;
- if (handle == nullptr) {
- LOG(WARNING) << "couldn't load file: " << file->d_name
- << " error: " << dlerror();
- continue;
- }
-
- dlerror(); /* Clear any existing error */
-
- using cbFun = void (*)(
- const InstrumentationEvent,
- const char *,
- const char *,
- const char *,
- const char *,
- std::vector<void *> *);
- std::string package = mInstrumentationLibPackage;
- for (size_t i = 0; i < package.size(); i++) {
- if (package[i] == '.') {
- package[i] = '_';
- continue;
- }
-
- if (package[i] == '@') {
- package[i] = '_';
- package.insert(i + 1, "V");
- continue;
- }
- }
- auto cb = (cbFun)dlsym(handle, ("HIDL_INSTRUMENTATION_FUNCTION_"
- + package + "_" + mInterfaceName).c_str());
- if ((error = dlerror()) != nullptr) {
- LOG(WARNING)
- << "couldn't find symbol: HIDL_INSTRUMENTATION_FUNCTION_"
- << package << "_" << mInterfaceName << ", error: " << error;
- continue;
- }
- instrumentationCallbacks->push_back(cb);
- LOG(INFO) << "Register instrumentation callback from "
- << file->d_name;
- }
- closedir(dir);
- }
-#else
- // No-op for user builds.
+ // No-op, historical
(void) instrumentationCallbacks;
return;
-#endif
}
bool HidlInstrumentor::isInstrumentationLib(const dirent *file) {
-#ifdef LIBHIDL_TARGET_DEBUGGABLE
- if (file->d_type != DT_REG) return false;
- std::cmatch cm;
- std::regex e("^" + mInstrumentationLibPackage + "(.*).profiler.so$");
- if (std::regex_match(file->d_name, cm, e)) return true;
-#else
(void) file;
-#endif
return false;
}
diff --git a/base/include/hidl/Status.h b/base/include/hidl/Status.h
index 74901bb..a204af5 100644
--- a/base/include/hidl/Status.h
+++ b/base/include/hidl/Status.h
@@ -235,9 +235,7 @@
return mVal;
}
- T withDefault(T t) {
- return isOk() ? mVal : t;
- }
+ T withDefault(T t) const { return isOk() ? mVal : t; }
};
template<typename T> class Return<sp<T>> : public details::return_status {
@@ -264,9 +262,7 @@
return mVal;
}
- sp<T> withDefault(sp<T> t) {
- return isOk() ? mVal : t;
- }
+ sp<T> withDefault(sp<T> t) const { return isOk() ? mVal : t; }
};
diff --git a/test_main.cpp b/test_main.cpp
index 5c6c78e..8681375 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -550,7 +550,7 @@
hidl_string one = "1";
hidl_string two = "2";
- Return<hidl_string> ret = Return<hidl_string>(Status::fromStatusT(DEAD_OBJECT));
+ const Return<hidl_string> ret = Return<hidl_string>(Status::fromStatusT(DEAD_OBJECT));
EXPECT_EQ(one, Return<hidl_string>(one).withDefault(two));
EXPECT_EQ(two, ret.withDefault(two));
diff --git a/transport/HidlBinderSupport.cpp b/transport/HidlBinderSupport.cpp
index b48b460..8b36f1f 100644
--- a/transport/HidlBinderSupport.cpp
+++ b/transport/HidlBinderSupport.cpp
@@ -254,12 +254,8 @@
if (sBnObj == nullptr) {
auto func = details::getBnConstructorMap().get(descriptor, nullptr);
- if (!func) {
- // TODO(b/69122224): remove this static variable when prebuilts updated
- func = details::gBnConstructorMap->get(descriptor, nullptr);
- }
- LOG_ALWAYS_FATAL_IF(func == nullptr, "%s gBnConstructorMap returned null for %s", __func__,
- descriptor.c_str());
+ LOG_ALWAYS_FATAL_IF(func == nullptr, "%s getBnConstructorMap returned null for %s",
+ __func__, descriptor.c_str());
sBnObj = sp<IBinder>(func(static_cast<void*>(ifacePtr)));
LOG_ALWAYS_FATAL_IF(sBnObj == nullptr, "%s Bn constructor function returned null for %s",
diff --git a/transport/HidlPassthroughSupport.cpp b/transport/HidlPassthroughSupport.cpp
index 6f30b7b..e059b4d 100644
--- a/transport/HidlPassthroughSupport.cpp
+++ b/transport/HidlPassthroughSupport.cpp
@@ -29,10 +29,6 @@
static sp<IBase> tryWrap(const std::string& descriptor, sp<IBase> iface) {
auto func = getBsConstructorMap().get(descriptor, nullptr);
- if (!func) {
- // TODO(b/69122224): remove this when prebuilts don't reference it
- func = gBsConstructorMap->get(descriptor, nullptr);
- }
if (func) {
return func(static_cast<void*>(iface.get()));
}
diff --git a/transport/InternalStatic.h b/transport/InternalStatic.h
index 666b2b6..a0d1c2d 100644
--- a/transport/InternalStatic.h
+++ b/transport/InternalStatic.h
@@ -28,13 +28,6 @@
namespace details {
// TODO(b/69122224): remove this once no prebuilts reference it
-// deprecated; use getBnConstructorMap instead.
-extern DoNotDestruct<BnConstructorMap> gBnConstructorMap;
-// TODO(b/69122224): remove this once no prebuilts reference it
-// deprecated; use getBsConstructorMap instead.
-extern DoNotDestruct<BsConstructorMap> gBsConstructorMap;
-
-// TODO(b/69122224): remove this once no prebuilts reference it
extern DoNotDestruct<ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio>>
gServicePrioMap;
// TODO(b/69122224): remove this once no prebuilts reference it
diff --git a/transport/Static.cpp b/transport/Static.cpp
index 240d196..fe7c0f0 100644
--- a/transport/Static.cpp
+++ b/transport/Static.cpp
@@ -27,9 +27,6 @@
namespace hardware {
namespace details {
-// Deprecated; kept for ABI compatibility. Use getBnConstructorMap.
-DoNotDestruct<BnConstructorMap> gBnConstructorMap{};
-
DoNotDestruct<ConcurrentMap<const ::android::hidl::base::V1_0::IBase*,
wp<::android::hardware::BHwBinder>>>
gBnMap{};
@@ -38,11 +35,6 @@
DoNotDestruct<ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio>> gServicePrioMap{};
DoNotDestruct<ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, bool>> gServiceSidMap{};
-// Deprecated; kept for ABI compatibility. Use getBsConstructorMap.
-DoNotDestruct<BsConstructorMap> gBsConstructorMap{};
-
-// For static executables, it is not guaranteed that gBnConstructorMap are initialized before
-// used in HAL definition libraries.
BnConstructorMap& getBnConstructorMap() {
static BnConstructorMap& map = *new BnConstructorMap();
return map;
diff --git a/vintfdata/manifest.xml b/vintfdata/manifest.xml
index 8fd69b9..9d7bfcb 100644
--- a/vintfdata/manifest.xml
+++ b/vintfdata/manifest.xml
@@ -26,7 +26,7 @@
<instance>default</instance>
</interface>
</hal>
- <hal>
+ <hal max-level="6">
<name>android.frameworks.displayservice</name>
<transport>hwbinder</transport>
<version>1.0</version>