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:
parent
591171a659
commit
3847ffcc0e
2 changed files with 51 additions and 1 deletions
30
boot/1.0/default/Android.mk
Normal file
30
boot/1.0/default/Android.mk
Normal 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
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue