getRawServiceInternal works in recovery.
Test: manual
Bug: 80132328
Change-Id: I79987fed9bd0ea4d49cd4f518cc59f3682067e71
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 5f75098..fb474c1 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -63,6 +63,12 @@
static const char* kHwServicemanagerReadyProperty = "hwservicemanager.ready";
+#if defined(__ANDROID_RECOVERY__)
+static constexpr bool kIsRecovery = true;
+#else
+static constexpr bool kIsRecovery = false;
+#endif
+
void waitForHwServiceManager() {
using std::literals::chrono_literals::operator""s;
@@ -205,6 +211,11 @@
}
static void registerReference(const hidl_string &interfaceName, const hidl_string &instanceName) {
+ if (kIsRecovery) {
+ // No hwservicemanager in recovery.
+ return;
+ }
+
sp<IServiceManager1_0> binderizedManager = defaultServiceManager();
if (binderizedManager == nullptr) {
LOG(WARNING) << "Could not registerReference for "
@@ -320,7 +331,7 @@
for (const std::string &lib : libs) {
const std::string fullPath = path + lib;
- if (path == HAL_LIBRARY_PATH_SYSTEM) {
+ if (kIsRecovery || path == HAL_LIBRARY_PATH_SYSTEM) {
handle = dlopen(fullPath.c_str(), dlMode);
} else {
#if !defined(__ANDROID_RECOVERY__)
@@ -649,20 +660,30 @@
using ::android::hidl::manager::V1_0::IServiceManager;
sp<Waiter> waiter;
- const sp<IServiceManager1_1> sm = defaultServiceManager1_1();
- if (sm == nullptr) {
- ALOGE("getService: defaultServiceManager() is null");
- return nullptr;
+ sp<IServiceManager1_1> sm;
+ Transport transport = Transport::EMPTY;
+ if (kIsRecovery) {
+ // TODO(b/80132328): Should check manifest in recovery as well.
+ transport = Transport::PASSTHROUGH;
+ // No hwbinder HALs in recovery.
+ getStub = true;
+ } else {
+ sm = defaultServiceManager1_1();
+ 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 = transportRet;
}
- 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);