Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9cf9b689 authored by Tao Bao's avatar Tao Bao Committed by Gerrit Code Review
Browse files

Merge "Dynamically load device-specific recovery UI lib."

parents f2bc68cf 42c45e2b
Loading
Loading
Loading
Loading
+79 −6
Original line number Diff line number Diff line
@@ -28,7 +28,32 @@ recovery_common_cflags := \
    -Werror \
    -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)

# librecovery_ui (static library)
# librecovery_ui_ext (shared library)
# ===================================
include $(CLEAR_VARS)

LOCAL_MODULE := librecovery_ui_ext

# LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds.
LOCAL_MULTILIB := first

ifeq ($(TARGET_IS_64_BIT),true)
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib64
else
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib
endif

LOCAL_WHOLE_STATIC_LIBRARIES := \
    $(TARGET_RECOVERY_UI_LIB)

LOCAL_SHARED_LIBRARIES := \
    libbase \
    liblog \
    librecovery_ui

include $(BUILD_SHARED_LIBRARY)

# librecovery_ui (shared library)
# ===============================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
@@ -40,21 +65,56 @@ LOCAL_SRC_FILES := \

LOCAL_MODULE := librecovery_ui

LOCAL_CFLAGS := $(recovery_common_cflags)

LOCAL_MULTILIB := first

ifeq ($(TARGET_IS_64_BIT),true)
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib64
else
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib
endif

LOCAL_STATIC_LIBRARIES := \
    libminui \
    libotautil \
    libbase

LOCAL_SHARED_LIBRARIES := \
    libbase \
    libpng \
    libz \

include $(BUILD_SHARED_LIBRARY)

# librecovery_ui (static library)
# ===============================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
    device.cpp \
    screen_ui.cpp \
    ui.cpp \
    vr_ui.cpp \
    wear_ui.cpp

LOCAL_MODULE := librecovery_ui

LOCAL_CFLAGS := $(recovery_common_cflags)

LOCAL_STATIC_LIBRARIES := \
    libminui \
    libotautil \

LOCAL_SHARED_LIBRARIES := \
    libbase \
    libpng \
    libz \

include $(BUILD_STATIC_LIBRARY)

librecovery_static_libraries := \
    $(TARGET_RECOVERY_UI_LIB) \
    libbootloader_message \
    libfusesideload \
    libminadbd \
    librecovery_ui \
    libminui \
    libverifier \
    libotautil \
@@ -112,8 +172,6 @@ LOCAL_SRC_FILES := \

LOCAL_MODULE := recovery

LOCAL_FORCE_STATIC_EXECUTABLE := true

LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/bin

# Cannot link with LLD: undefined symbol: UsbNoPermissionsLongHelpText
@@ -124,8 +182,12 @@ LOCAL_CFLAGS := $(recovery_common_cflags)

LOCAL_STATIC_LIBRARIES := \
    librecovery \
    librecovery_ui_default \
    $(librecovery_static_libraries)

LOCAL_SHARED_LIBRARIES := \
    librecovery_ui \

LOCAL_HAL_STATIC_LIBRARIES := libhealthd

LOCAL_REQUIRED_MODULES := \
@@ -154,6 +216,17 @@ LOCAL_REQUIRED_MODULES += \
    recovery-refresh
endif

LOCAL_REQUIRED_MODULES += \
    librecovery_ui_ext

# TODO(b/110380063): Explicitly install the following shared libraries to recovery, until `recovery`
# module is built with Soong (with `recovery: true` flag).
LOCAL_REQUIRED_MODULES += \
    libbase.recovery \
    liblog.recovery \
    libpng.recovery \
    libz.recovery \

include $(BUILD_EXECUTABLE)

include \
+4 −0
Original line number Diff line number Diff line
@@ -119,8 +119,12 @@ class Device {
  std::unique_ptr<RecoveryUI> ui_;
};

// Disable name mangling, as this function will be loaded via dlsym(3).
extern "C" {

// The device-specific library must define this function (or the default one will be used, if there
// is no device-specific library). It returns the Device object that recovery should use.
Device* make_device();
}

#endif  // _DEVICE_H
+27 −1
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
 * limitations under the License.
 */

#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
@@ -329,7 +330,32 @@ int main(int argc, char** argv) {

  printf("locale is [%s]\n", locale.c_str());

  Device* device = make_device();
  static constexpr const char* kDefaultLibRecoveryUIExt = "librecovery_ui_ext.so";
  // Intentionally not calling dlclose(3) to avoid potential gotchas (e.g. `make_device` may have
  // handed out pointers to code or static [or thread-local] data and doesn't collect them all back
  // in on dlclose).
  void* librecovery_ui_ext = dlopen(kDefaultLibRecoveryUIExt, RTLD_NOW);

  using MakeDeviceType = decltype(&make_device);
  MakeDeviceType make_device_func = nullptr;
  if (librecovery_ui_ext == nullptr) {
    printf("Failed to dlopen %s: %s\n", kDefaultLibRecoveryUIExt, dlerror());
  } else {
    reinterpret_cast<void*&>(make_device_func) = dlsym(librecovery_ui_ext, "make_device");
    if (make_device_func == nullptr) {
      printf("Failed to dlsym make_device: %s\n", dlerror());
    }
  }

  Device* device;
  if (make_device_func == nullptr) {
    printf("Falling back to the default make_device() instead\n");
    device = make_device();
  } else {
    printf("Loading make_device from %s\n", kDefaultLibRecoveryUIExt);
    device = (*make_device_func)();
  }

  if (android::base::GetBoolProperty("ro.boot.quiescent", false)) {
    printf("Quiescent recovery mode.\n");
    device->ResetUI(new StubRecoveryUI());
+1 −1
Original line number Diff line number Diff line
@@ -155,10 +155,10 @@ libupdater_static_libraries := \

librecovery_static_libraries := \
    librecovery \
    $(TARGET_RECOVERY_UI_LIB) \
    libbootloader_message \
    libfusesideload \
    libminadbd \
    librecovery_ui_default \
    librecovery_ui \
    libminui \
    libverifier \