diff --git a/libutils/Android.bp b/libutils/Android.bp index 83952ab2e..508f5536c 100644 --- a/libutils/Android.bp +++ b/libutils/Android.bp @@ -100,6 +100,7 @@ cc_library { "libcutils", "libdl", "liblog", + "libvndksupport", ], sanitize: { diff --git a/libutils/misc.cpp b/libutils/misc.cpp index ab72fe6ed..d95fd056b 100644 --- a/libutils/misc.cpp +++ b/libutils/misc.cpp @@ -23,6 +23,13 @@ #include #include +#if defined(__ANDROID__) +#include +#include +#endif + +extern "C" void do_report_sysprop_change(); + using namespace android; namespace android { @@ -61,7 +68,36 @@ void add_sysprop_change_callback(sysprop_change_callback cb, int priority) { #endif } +#if defined(__ANDROID__) +void (*get_report_sysprop_change_func())() { + void (*func)() = nullptr; + void* handle = android_load_sphal_library("libutils.so", RTLD_NOW); + if (handle != nullptr) { + func = reinterpret_cast(dlsym(handle, "do_report_sysprop_change")); + } + + return func; +} +#endif + void report_sysprop_change() { + do_report_sysprop_change(); + +#if defined(__ANDROID__) + // libutils.so is double loaded; from the default namespace and from the + // 'sphal' namespace. Redirect the sysprop change event to the other instance + // of libutils.so loaded in the 'sphal' namespace so that listeners attached + // to that instance is also notified with this event. + static auto func = get_report_sysprop_change_func(); + if (func != nullptr) { + (*func)(); + } +#endif +} + +}; // namespace android + +void do_report_sysprop_change() { #if !defined(_WIN32) pthread_mutex_lock(&gSyspropMutex); Vector listeners; @@ -76,5 +112,3 @@ void report_sysprop_change() { } #endif } - -}; // namespace android diff --git a/libvndksupport/Android.bp b/libvndksupport/Android.bp index ab9e26fe4..b62422323 100644 --- a/libvndksupport/Android.bp +++ b/libvndksupport/Android.bp @@ -1,6 +1,6 @@ subdirs = ["tests"] -cc_library_shared { +cc_library { name: "libvndksupport", srcs: ["linker.c"], local_include_dirs: ["include/vndksupport"],