Add statically linked boot HAL impl in recovery

The default Treble boot HAL implementation currently can only work in
recovery on devices that specifically build their libhardware
implementation as a shared library for recovery.

This CL adds the option to statically link the libhardware
implementation in recovery instead of finding it using
hw_get_module(). This new approach allows devices that define
PRODUCT_STATIC_BOOT_CONTROL_HAL to begin using the Treble HAL in
recovery without requiring device-specific changes.

A previous version of this CL broke some device builds by omitting
libbase.recovery from LOCAL_SHARED_LIBRARIES. This version fixes that
issue.

Test: adb sideload succeeds
Bug: 78598708
Change-Id: I1c2ef7fa59575ac7975129f7544f741459b8540e
Signed-off-by: Connor O'Brien <connoro@google.com>
This commit is contained in:
Connor O'Brien 2018-09-28 12:53:02 -07:00
parent 591171a659
commit 3847ffcc0e
2 changed files with 51 additions and 1 deletions

View file

@ -0,0 +1,30 @@
# TODO(connoro): Remove this file once we eliminate existing usage of
# PRODUCT_STATIC_BOOT_CONTROL_HAL
LOCAL_PATH := $(call my-dir)
ifneq ($(strip $(PRODUCT_STATIC_BOOT_CONTROL_HAL)),)
include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.boot@1.0-impl-wrapper.recovery
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MULTILIB := first
ifeq ($(TARGET_IS_64_BIT),true)
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/hw
else
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib/hw
endif
LOCAL_SRC_FILES := BootControl.cpp
LOCAL_CFLAGS := -DBOOT_CONTROL_RECOVERY
LOCAL_SHARED_LIBRARIES := \
libbase.recovery \
liblog.recovery \
libhidlbase.recovery \
libhidltransport.recovery \
libhardware.recovery \
libutils.recovery \
android.hardware.boot@1.0.recovery
LOCAL_STATIC_LIBRARIES := $(PRODUCT_STATIC_BOOT_CONTROL_HAL)
include $(BUILD_SHARED_LIBRARY)
endif

View file

@ -21,6 +21,10 @@
#include <hardware/boot_control.h>
#include "BootControl.h"
#ifdef BOOT_CONTROL_RECOVERY
extern const hw_module_t HAL_MODULE_INFO_SYM;
#endif
namespace android {
namespace hardware {
namespace boot {
@ -92,7 +96,23 @@ Return<void> BootControl::getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) {
return Void();
}
#ifdef BOOT_CONTROL_RECOVERY
IBootControl* HIDL_FETCH_IBootControl(const char * /* hal */) {
boot_control_module_t* module;
// For devices that don't build a standalone libhardware bootctrl impl for recovery,
// we simulate the hw_get_module() by accessing it from the current process directly.
const hw_module_t* hw_module = &HAL_MODULE_INFO_SYM;
if (!hw_module ||
strcmp(BOOT_CONTROL_HARDWARE_MODULE_ID, hw_module->id) != 0) {
ALOGE("Error loading boot_control HAL implementation: %d.", -EINVAL);
return nullptr;
}
module = reinterpret_cast<boot_control_module_t*>(const_cast<hw_module_t*>(hw_module));
module->init(module);
return new BootControl(module);
}
#else
IBootControl* HIDL_FETCH_IBootControl(const char* /* hal */) {
int ret = 0;
boot_control_module_t* module = NULL;
@ -106,7 +126,7 @@ IBootControl* HIDL_FETCH_IBootControl(const char* /* hal */) {
module->init(module);
return new BootControl(module);
}
#endif
} // namespace implementation
} // namespace V1_0
} // namespace boot