diff --git a/appspawn_systemLib.json b/appspawn_systemLib.json new file mode 100644 index 0000000000000000000000000000000000000000..05e42a8fc65464b41c935d5ca88342d83ed542c8 --- /dev/null +++ b/appspawn_systemLib.json @@ -0,0 +1,4 @@ +{ + "systemLib" : [ + ] +} diff --git a/etc/BUILD.gn b/etc/BUILD.gn index 512c2133f26c6ee7362c6528a0c20c5a9f84249b..501ff37f0562d4410fb676b38610daa99ad1186a 100644 --- a/etc/BUILD.gn +++ b/etc/BUILD.gn @@ -66,11 +66,18 @@ ohos_prebuilt_etc("appspawn_preload.json") { module_install_dir = "etc/appspawn" } +ohos_prebuilt_etc("appspawn_systemLib.json") { + source = "../appspawn_systemLib.json" + part_name = "${part_name}" + module_install_dir = "etc/appspawn" +} + group("etc_files") { deps = [ ":appdata-sandbox-isolated.json", ":appdata-sandbox.json", ":appspawn_preload.json", + ":appspawn_systemLib.json", ] if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) { deps += [ ":appdata-sandbox-nweb.json" ] diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index 082863780ec4fda00b05ae3714de31d4ae1608fb..559814e966958c89a82fe8eb02c79dd54d7c815d 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -43,6 +43,7 @@ using namespace OHOS::AppSpawn; using namespace OHOS::Global; +#define SYSTEMLIB_JSON "/appspawn_systemLib.json" #ifdef ASAN_DETECTOR static const bool DEFAULT_PRELOAD_VALUE = false; #else @@ -266,8 +267,42 @@ static int PreLoadAppSpawn(AppSpawnMgr *content) return 0; } +APPSPAWN_STATIC int DoDlopenLibs(const cJSON *root, ParseJsonContext *context) +{ + cJSON *systemLibs = cJSON_GetObjectItemCaseSensitive(root, "systemLib"); + if (systemLibs == nullptr) { + return 0; + } + + uint32_t libsCount = (uint32_t)cJSON_GetArraySize(systemLibs); + for (uint32_t i = 0; i < libsCount; ++i) { + const char *libName = cJSON_GetStringValue(cJSON_GetArrayItem(systemLibs, i)); + char reaLibPath[PATH_MAX] = {0}; + if (libName == nullptr || realpath(libName, reaLibPath) == nullptr) { + continue; + } + APPSPAWN_LOGV("reaLibPath %{public}s", reaLibPath); + void *lib = dlopen(reaLibPath, RTLD_LAZY); + if (lib == nullptr) { + APPSPAWN_LOGE("FAILED to dlopen %{public}s %{public}s", libName, dlerror()); + } + } + return 0; +} + +APPSPAWN_STATIC int DlopenAppSpawn(AppSpawnMgr *content) +{ + if (!IsAppSpawnMode(content)) { + return 0; + } + + (void)ParseJsonConfig("etc/appspawn", SYSTEMLIB_JSON, DoDlopenLibs, nullptr); + return 0; +} + MODULE_CONSTRUCTOR(void) { APPSPAWN_LOGV("Load ace module ..."); AddPreloadHook(HOOK_PRIO_HIGHEST, PreLoadAppSpawn); + AddPreloadHook(HOOK_PRIO_HIGHEST, DlopenAppSpawn); }