diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index 37da3a22e9b2e6340837e24f64e2999ff8d9286b..ccc5a67b4400754cdf8e58915e027f801ee203a0 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -51,6 +51,7 @@ static const bool DEFAULT_PRELOAD_VALUE = true; #endif static const std::string PRELOAD_JSON_CONFIG("/appspawn_preload.json"); +static std::vector g_preloadLibs; typedef struct TagParseJsonContext { std::set modules; } ParseJsonContext; @@ -306,6 +307,7 @@ APPSPAWN_STATIC int DoDlopenLibs(const cJSON *root, ParseJsonContext *context) if (lib == nullptr) { APPSPAWN_LOGE("FAILED to dlopen %{public}s %{public}s", libName, dlerror()); } + g_preloadLibs.push_back(lib); } return 0; } @@ -320,9 +322,22 @@ APPSPAWN_STATIC int DlopenAppSpawn(AppSpawnMgr *content) return 0; } +APPSPAWN_STATIC int ClearLibsHandle(AppSpawnMgr *content) +{ + for (void *lib : g_preloadLibs) { + if (lib != nullptr) { + dlclose(lib); + } + } + g_preloadLibs.clear(); + APPSPAWN_LOGI("clear preload libs finish"); + return 0; +} + MODULE_CONSTRUCTOR(void) { APPSPAWN_LOGV("Load ace module ..."); AddPreloadHook(HOOK_PRIO_HIGHEST, PreLoadAppSpawn); AddPreloadHook(HOOK_PRIO_HIGHEST, DlopenAppSpawn); + AddServerStageHook(STAGE_SERVER_EXIT, HOOK_PRIO_HIGHEST, ClearLibsHandle); }