From d2bc690e1e3f1e808d2a315514093e07096b8fb6 Mon Sep 17 00:00:00 2001 From: Sandee Date: Tue, 21 Jan 2025 16:59:22 +0800 Subject: [PATCH] Support 2.0 Runtime in AppSpawn Issue: https://gitee.com/openharmony/startup_appspawn/issues/IBIXEM Signed-off-by: sandee --- BUILD.gn | 13 ++++ appspawn.gni | 1 + bundle.json | 1 + common/appspawn_server.h | 7 ++ interfaces/innerkits/client/appspawn_client.c | 6 +- interfaces/innerkits/client/appspawn_client.h | 1 + interfaces/innerkits/include/appspawn.h | 1 + modules/ace_adapter/ace_adapter.cpp | 42 ++++++++++ modules/asan/asan_detector.c | 4 +- modules/module_engine/include/appspawn_msg.h | 1 + modules/modulemgr/appspawn_modulemgr.h | 3 +- standard/BUILD.gn | 78 +++++++++++++++++++ standard/appspawn_main.c | 39 ++++++---- standard/appspawn_service.c | 6 +- staticspawn.cfg | 30 +++++++ 15 files changed, 212 insertions(+), 21 deletions(-) create mode 100644 staticspawn.cfg diff --git a/BUILD.gn b/BUILD.gn index 90f10d88..6e71f818 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -56,6 +56,13 @@ if (!defined(ohos_lite)) { subsystem_name = "${subsystem_name}" part_name = "${part_name}" } + + ohos_prebuilt_etc("staticspawn.rc") { + source = "staticspawn.cfg" + relative_install_dir = "init" + subsystem_name = "${subsystem_name}" + part_name = "${part_name}" + } } group("appspawn_all") { @@ -86,6 +93,12 @@ group("appspawn_all") { "standard:cjappspawn", ] } + if (appspawn_support_static) { # for support static appspawn + deps += [ + ":staticspawn.rc", + "standard:staticspawn", + ] + } if (appspawn_support_native) { # for support nativespawn deps += [ ":nativespawn.rc", diff --git a/appspawn.gni b/appspawn.gni index ae2da360..f09185c8 100644 --- a/appspawn.gni +++ b/appspawn.gni @@ -23,6 +23,7 @@ module_output_path = "${part_name}/appspawn_l2" declare_args() { appspawn_support_nweb = true appspawn_support_cj = true + appspawn_support_static = true appspawn_support_native = true appspawn_report_event = true appspawn_test_cmd = false diff --git a/bundle.json b/bundle.json index bf616295..668b2965 100644 --- a/bundle.json +++ b/bundle.json @@ -21,6 +21,7 @@ "features": [ "appspawn_support_nweb", "appspawn_support_cj", + "appspawn_support_static", "appspawn_support_native", "appspawn_use_encaps", "appspawn_mount_tmpshm", diff --git a/common/appspawn_server.h b/common/appspawn_server.h index 7ccc93b1..1181d283 100644 --- a/common/appspawn_server.h +++ b/common/appspawn_server.h @@ -32,6 +32,7 @@ typedef enum { MODE_FOR_NWEB_COLD_RUN, MODE_FOR_NATIVE_SPAWN, MODE_FOR_CJAPP_SPAWN, + MODE_FOR_STATIC_SPAWN, MODE_INVALID } RunMode; @@ -51,6 +52,12 @@ typedef enum { CJPROCESS_INVALID } CJRunProcess; +typedef enum { + STATIC_PROCESS_FOR_APP_SPAWN, + STATIC_PROCESS_FOR_APP_COLD_RUN, + STATIC_PROCESS_INVALID +} StaticRunProcess; + typedef struct AppSpawnClient { uint32_t id; uint32_t flags; // Save negotiated flags diff --git a/interfaces/innerkits/client/appspawn_client.c b/interfaces/innerkits/client/appspawn_client.c index 00707f50..80874170 100644 --- a/interfaces/innerkits/client/appspawn_client.c +++ b/interfaces/innerkits/client/appspawn_client.c @@ -103,6 +103,8 @@ APPSPAWN_STATIC int CreateClientSocket(uint32_t type, uint32_t timeout) case CLIENT_FOR_NATIVESPAWN: socketName = NATIVESPAWN_SOCKET_NAME; break; + case CLIENT_FOR_STATICSPAWN: + socketName = STATICSPAWN_SOCKET_NAME; default: socketName = NWEBSPAWN_SOCKET_NAME; break; @@ -300,7 +302,9 @@ int AppSpawnClientInit(const char *serviceName, AppSpawnClientHandle *handle) APPSPAWN_CHECK(handle != NULL, return APPSPAWN_ARG_INVALID, "Invalid handle for %{public}s", serviceName); APPSPAWN_LOGV("AppSpawnClientInit serviceName %{public}s", serviceName); AppSpawnClientType type = CLIENT_FOR_APPSPAWN; - if (strcmp(serviceName, CJAPPSPAWN_SERVER_NAME) == 0) { + if (strcmp(serviceName, STATICSPAWN_SERVER_NAME) == 0) { + type = CLIENT_FOR_STATICSPAWN + } else if (strcmp(serviceName, CJAPPSPAWN_SERVER_NAME) == 0) { type = CLIENT_FOR_CJAPPSPAWN; } else if (strcmp(serviceName, NWEBSPAWN_SERVER_NAME) == 0 || strstr(serviceName, NWEBSPAWN_SOCKET_NAME) != NULL) { type = CLIENT_FOR_NWEBSPAWN; diff --git a/interfaces/innerkits/client/appspawn_client.h b/interfaces/innerkits/client/appspawn_client.h index 784065bb..0abb95b6 100644 --- a/interfaces/innerkits/client/appspawn_client.h +++ b/interfaces/innerkits/client/appspawn_client.h @@ -49,6 +49,7 @@ typedef enum { CLIENT_FOR_NWEBSPAWN, CLIENT_FOR_CJAPPSPAWN, CLIENT_FOR_NATIVESPAWN, + CLIENT_FOR_STATICSPAWN, CLIENT_MAX } AppSpawnClientType; diff --git a/interfaces/innerkits/include/appspawn.h b/interfaces/innerkits/include/appspawn.h index c75504bc..d0b5473b 100644 --- a/interfaces/innerkits/include/appspawn.h +++ b/interfaces/innerkits/include/appspawn.h @@ -50,6 +50,7 @@ typedef void *AppSpawnClientHandle; #define CJAPPSPAWN_SERVER_NAME "cjappspawn" #define NWEBSPAWN_RESTART "nwebRestart" #define NATIVESPAWN_SERVER_NAME "nativespawn" +#define STATICSPAWN_SERVER_NAME "staticspawn" #pragma pack(4) #define APP_MAX_GIDS 64 diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index 8aaa6468..45d9b5e2 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -104,6 +104,16 @@ static void PreloadModule(void) OHOS::AbilityRuntime::Runtime::SavePreloaded(std::move(runtime)); } +static void PreloadStaticModule(void) +{ + // Create 2.0 Runtime + + // load system module + + // save preloaded + +} + static void LoadExtendLib(void) { const char *acelibdir = OHOS::Ace::AceForwardCompatibility::GetAceLibName(); @@ -122,6 +132,34 @@ static void LoadExtendLib(void) APPSPAWN_LOGI("LoadExtendLib: Start preload JS VM"); SetTraceDisabled(true); PreloadModule(); + PreloadStaticModule(); + SetTraceDisabled(false); + + OHOS::Ace::AceForwardCompatibility::ReclaimFileCache(getpid()); + Resource::ResourceManager *systemResMgr = Resource::GetSystemResourceManagerNoSandBox(); + APPSPAWN_CHECK(systemResMgr != nullptr, return, "Fail to get system resource manager"); + APPSPAWN_LOGI("LoadExtendLib: End preload JS VM"); +} + +APPSPAWN_STATIC void LoadExtendStaticLib(void) +{ + // Load Arkts 2.0 static vm + const char *acelibdir = OHOS::Ace::AceForwardCompatibility::GetAceLibName(); + APPSPAWN_LOGI("LoadExtendLib: Start calling dlopen acelibdir."); + void *aceAbilityLib = dlopen(acelibdir, RTLD_NOW | RTLD_LOCAL); + APPSPAWN_CHECK(aceAbilityLib != nullptr, return, "Fail to dlopen %{public}s, [%{public}s]", acelibdir, dlerror()); + APPSPAWN_LOGI("LoadExtendLib: Success to dlopen %{public}s", acelibdir); + + OHOS::AppExecFwk::MainThread::PreloadExtensionPlugin(); + bool preload = OHOS::system::GetBoolParameter("persist.appspawn.preload", DEFAULT_PRELOAD_VALUE); + if (!preload) { + APPSPAWN_LOGI("LoadExtendLib: Do not preload JS VM"); + return; + } + + APPSPAWN_LOGI("LoadExtendLib: Start preload JS VM"); + SetTraceDisabled(true); + PreloadStaticModule(); SetTraceDisabled(false); OHOS::Ace::AceForwardCompatibility::ReclaimFileCache(getpid()); @@ -263,6 +301,10 @@ APPSPAWN_STATIC int PreLoadAppSpawn(AppSpawnMgr *content) LoadExtendCJLib(); return 0; } + if (strcmp(content->content.longProcName, STATICSPAWN_SERVER_NAME) == 0) { + LoadExtendStaticLib(); + return 0; + } LoadExtendLib(); return 0; } diff --git a/modules/asan/asan_detector.c b/modules/asan/asan_detector.c index 15e4c836..1cc6b253 100644 --- a/modules/asan/asan_detector.c +++ b/modules/asan/asan_detector.c @@ -125,7 +125,9 @@ static int AsanSpawnGetSpawningFlag(AppSpawnMgr *content, AppSpawningCtx *proper if (property->forkCtx.coldRunPath) { free(property->forkCtx.coldRunPath); } -#ifndef CJAPP_SPAWN +#ifndef STATIC_SPAWN + property->forkCtx.coldRunPath = strdup("/system/asan/bin/staticspawn"); +#elif CJAPP_SPAWN property->forkCtx.coldRunPath = strdup("/system/asan/bin/appspawn"); #elif NATIVE_SPAWN property->forkCtx.coldRunPath = strdup("/system/asan/bin/nativespawn"); diff --git a/modules/module_engine/include/appspawn_msg.h b/modules/module_engine/include/appspawn_msg.h index 3c632529..20142ab4 100644 --- a/modules/module_engine/include/appspawn_msg.h +++ b/modules/module_engine/include/appspawn_msg.h @@ -31,6 +31,7 @@ extern "C" { #define CJAPPSPAWN_SOCKET_NAME "CJAppSpawn" #define KEEPALIVE_NAME "keepalive" #define NATIVESPAWN_SOCKET_NAME "NativeSpawn" +#define STATICSPAWN_SOCKET_NAME "StaticSpawn" #define APPSPAWN_ALIGN(len) (((len) + 0x03) & (~0x03)) #define APPSPAWN_TLV_NAME_LEN 32 diff --git a/modules/modulemgr/appspawn_modulemgr.h b/modules/modulemgr/appspawn_modulemgr.h index 53d0efb5..58f526c4 100644 --- a/modules/modulemgr/appspawn_modulemgr.h +++ b/modules/modulemgr/appspawn_modulemgr.h @@ -41,7 +41,8 @@ typedef enum { MODULE_NWEBSPAWN, MODULE_COMMON, MODULE_NATIVESPAWN, - MODULE_MAX + MODULE_MAX, + MODULE_STATICSPAWN, } AppSpawnModuleType; typedef struct { diff --git a/standard/BUILD.gn b/standard/BUILD.gn index ec2ee283..941ee6ba 100644 --- a/standard/BUILD.gn +++ b/standard/BUILD.gn @@ -227,6 +227,77 @@ ohos_executable("cjappspawn") { part_name = "${part_name}" } +# to support staticspawn +ohos_executable("staticspawn") { + sources = [ + "${appspawn_path}/common/appspawn_server.c", + "${appspawn_path}/common/appspawn_trace.cpp", + "${appspawn_path}/modules/modulemgr/appspawn_modulemgr.c", + "${appspawn_path}/standard/appspawn_appmgr.c", + "${appspawn_path}/standard/appspawn_kickdog.c", + "${appspawn_path}/standard/appspawn_main.c", + "${appspawn_path}/standard/appspawn_msgmgr.c", + "${appspawn_path}/standard/appspawn_service.c", + "${appspawn_path}/standard/nwebspawn_launcher.c", + ] + + defines = [ "STATIC_SPAWN" ] + configs = [ + ":appspawn_server_config", + "${appspawn_path}:appspawn_config", + ] + deps = [ + "${appspawn_path}/modules/module_engine:libappspawn_stub_versionscript", + "${appspawn_path}/util:libappspawn_util", + ] + if (asan_detector || is_asan) { + defines += [ "ASAN_DETECTOR" ] + } + + external_deps = [ + "cJSON:cjson", + "c_utils:utils", + "config_policy:configpolicy_util", + "hilog:libhilog", + "hitrace:hitrace_meter", + "init:libbegetutil", + ] + if (appspawn_report_event) { + defines += [ "APPSPAWN_HISYSEVENT" ] + external_deps += [ "hisysevent:libhisysevent" ] + sources += [ "${appspawn_path}/modules/sysevent/appspawn_hisysevent.cpp" ] + } + if (build_selinux) { + defines += [ "WITH_SELINUX" ] + external_deps += [ + "selinux:libselinux", + "selinux_adapter:libhap_restorecon", + ] + } + cflags = [] + + if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) { + defines += [ "APPSPAWN_SANDBOX_NEW" ] + } + + #ldflags = [ "-Wl,--dynamic-linker,/system/bin/linker64z" ] + if (!defined(global_parts_info) || + defined(global_parts_info.security_code_signature)) { + defines += [ "CODE_SIGNATURE_ENABLE" ] + external_deps += [ "code_signature:libcode_sign_attr_utils" ] + } + + version_script = get_label_info( + "${appspawn_path}/modules/module_engine:libappspawn_stub_versionscript", + "target_gen_dir") + "/" + get_label_info( + "${appspawn_path}/modules/module_engine:libappspawn_stub_versionscript", + "name") + stub_version_script_suffix + + install_enable = true + subsystem_name = "${subsystem_name}" + part_name = "${part_name}" +} + # to support nativespawn ohos_executable("nativespawn") { sources = [ @@ -305,6 +376,13 @@ ohos_prebuilt_etc("cjappspawn.rc") { part_name = "${part_name}" } +ohos_prebuilt_etc("staticspawn.rc") { + source = "staticspawn.cfg" + relative_install_dir = "init" + subsystem_name = "${subsystem_name}" + part_name = "${part_name}" +} + ohos_prebuilt_etc("nativespawn.rc") { source = "nativespawn.cfg" relative_install_dir = "init" diff --git a/standard/appspawn_main.c b/standard/appspawn_main.c index 2f87220c..07ec76dd 100644 --- a/standard/appspawn_main.c +++ b/standard/appspawn_main.c @@ -26,22 +26,27 @@ #define APPSPAWN_PRELOAD "libappspawn_helper.z.so" -#ifndef CJAPP_SPAWN -static AppSpawnStartArgTemplate g_appSpawnStartArgTemplate[PROCESS_INVALID] = { - {APPSPAWN_SERVER_NAME, {MODE_FOR_APP_SPAWN, MODULE_APPSPAWN, APPSPAWN_SOCKET_NAME, APPSPAWN_SERVER_NAME, 1}}, - {NWEBSPAWN_SERVER_NAME, {MODE_FOR_NWEB_SPAWN, MODULE_NWEBSPAWN, NWEBSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 1}}, - {"app_cold", {MODE_FOR_APP_COLD_RUN, MODULE_APPSPAWN, APPSPAWN_SOCKET_NAME, APPSPAWN_SERVER_NAME, 0}}, - {"nweb_cold", {MODE_FOR_NWEB_COLD_RUN, MODULE_NWEBSPAWN, APPSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 0}}, - {NATIVESPAWN_SERVER_NAME, {MODE_FOR_NATIVE_SPAWN, MODULE_NATIVESPAWN, NATIVESPAWN_SOCKET_NAME, - NATIVESPAWN_SERVER_NAME, 1}}, - {NWEBSPAWN_RESTART, {MODE_FOR_NWEB_SPAWN, MODULE_NWEBSPAWN, NWEBSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 1}}, -}; +#ifdef STATIC_SPAWN + static AppSpawnStartArgTemplate g_appSpawnStartArgTemplate[STATIC_PROCESS_INVALID] = { + {STATICSPAWN_SERVER_NAME, {MODE_FOR_STATIC_SPAWN, MODULE_STATICSPAWN, STATICSPAWN_SOCKET_NAME, STATICSPAWN_SERVER_NAME, 1}}, + {"static_cold", {MODE_FOR_APP_COLD_RUN, MODULE_STATICSPAWN, STATICSPAWN_SOCKET_NAME, STATICSPAWN_SERVER_NAME, 0}}, + }; +#elif CJAPP_SPAWN + static AppSpawnStartArgTemplate g_appCJSpawnStartArgTemplate[CJPROCESS_INVALID] = { + {CJAPPSPAWN_SERVER_NAME, {MODE_FOR_CJAPP_SPAWN, MODULE_APPSPAWN, CJAPPSPAWN_SOCKET_NAME, CJAPPSPAWN_SERVER_NAME, + 1}}, + {"app_cold", {MODE_FOR_APP_COLD_RUN, MODULE_APPSPAWN, CJAPPSPAWN_SOCKET_NAME, CJAPPSPAWN_SERVER_NAME, 0}}, + }; #else -static AppSpawnStartArgTemplate g_appCJSpawnStartArgTemplate[CJPROCESS_INVALID] = { - {CJAPPSPAWN_SERVER_NAME, {MODE_FOR_CJAPP_SPAWN, MODULE_APPSPAWN, CJAPPSPAWN_SOCKET_NAME, CJAPPSPAWN_SERVER_NAME, - 1}}, - {"app_cold", {MODE_FOR_APP_COLD_RUN, MODULE_APPSPAWN, CJAPPSPAWN_SOCKET_NAME, CJAPPSPAWN_SERVER_NAME, 0}}, -}; + static AppSpawnStartArgTemplate g_appSpawnStartArgTemplate[PROCESS_INVALID] = { + {APPSPAWN_SERVER_NAME, {MODE_FOR_APP_SPAWN, MODULE_APPSPAWN, APPSPAWN_SOCKET_NAME, APPSPAWN_SERVER_NAME, 1}}, + {NWEBSPAWN_SERVER_NAME, {MODE_FOR_NWEB_SPAWN, MODULE_NWEBSPAWN, NWEBSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 1}}, + {"app_cold", {MODE_FOR_APP_COLD_RUN, MODULE_APPSPAWN, APPSPAWN_SOCKET_NAME, APPSPAWN_SERVER_NAME, 0}}, + {"nweb_cold", {MODE_FOR_NWEB_COLD_RUN, MODULE_NWEBSPAWN, APPSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 0}}, + {NATIVESPAWN_SERVER_NAME, {MODE_FOR_NATIVE_SPAWN, MODULE_NATIVESPAWN, NATIVESPAWN_SOCKET_NAME, + NATIVESPAWN_SERVER_NAME, 1}}, + {NWEBSPAWN_RESTART, {MODE_FOR_NWEB_SPAWN, MODULE_NWEBSPAWN, NWEBSPAWN_SOCKET_NAME, NWEBSPAWN_SERVER_NAME, 1}}, + }; #endif static void CheckPreload(char *const argv[]) @@ -108,7 +113,9 @@ int main(int argc, char *const argv[]) AppSpawnStartArg *arg; AppSpawnStartArgTemplate *argTemp = NULL; -#ifdef CJAPP_SPAWN +#ifdef STATIC_SPAWN + argTemp = &g_appCJSpawnStartArgTemplate[STATIC_PROCESS_FOR_APP_SPAWN]; +#elif CJAPP_SPAWN argTemp = &g_appCJSpawnStartArgTemplate[CJPROCESS_FOR_APP_SPAWN]; if (argc > MODE_VALUE_INDEX) { argTemp = GetAppSpawnStartArg(argv[MODE_VALUE_INDEX], g_appCJSpawnStartArgTemplate, diff --git a/standard/appspawn_service.c b/standard/appspawn_service.c index 69584370..d75d3862 100644 --- a/standard/appspawn_service.c +++ b/standard/appspawn_service.c @@ -168,7 +168,7 @@ APPSPAWN_STATIC void ProcessSignal(const struct signalfd_siginfo *siginfo) "ProcessSignal with wrong status:%{public}d", status); HandleDiedPid(pid, siginfo->ssi_uid, status); } -#if (defined(CJAPP_SPAWN) || defined(NATIVE_SPAWN)) +#if (defined(CJAPP_SPAWN) || defined(NATIVE_SPAWN) || defined(STATIC_SPAWN)) if (OH_ListGetCnt(&GetAppSpawnMgr()->appQueue) == 0) { LE_StopLoop(LE_GetDefaultLoop()); } @@ -1049,7 +1049,9 @@ void AppSpawnDestroyContent(AppSpawnContent *content) APPSPAWN_STATIC int AppSpawnColdStartApp(struct AppSpawnContent *content, AppSpawnClient *client) { AppSpawningCtx *property = (AppSpawningCtx *)client; -#ifdef CJAPP_SPAWN +#ifdef STATIC_SPAWN + char *path = property->forkCtx.coldRunPath != NULL ? property->forkCtx.coldRunPath : "/system/bin/staticspawn"; +#elif CJAPP_SPAWN char *path = property->forkCtx.coldRunPath != NULL ? property->forkCtx.coldRunPath : "/system/bin/cjappspawn"; #elif NATIVE_SPAWN char *path = property->forkCtx.coldRunPath != NULL ? property->forkCtx.coldRunPath : "/system/bin/nativespawn"; diff --git a/staticspawn.cfg b/staticspawn.cfg new file mode 100644 index 00000000..251d4caf --- /dev/null +++ b/staticspawn.cfg @@ -0,0 +1,30 @@ +{ + "services" : [{ + "name" : "staticspawn", + "path" : ["/system/bin/staticspawn", + "-mode appspawn", + "--process-name com.ohos.appspawn.startup --start-flags daemon --type standard ", + "--sandbox-switch on --bundle-name com.ohos.appspawn.startup --app-operate-type operate ", + "--render-command command --app-launch-type singleton --app-visible true"], + "uid" : "root", + "gid" : ["root"], + "setuid" : true, + "importance" : -20, + "socket" : [{ + "name" : "StaticSpawn", + "family" : "AF_LOCAL", + "type" : "SOCK_STREAM", + "protocol" : "default", + "permissions" : "0660", + "uid" : "root", + "gid" : "appspawn", + "option" : [ + ] + }], + "start-mode" : "boot", + "sandbox" : 0, + "ondemand" : true, + "secon" : "u:r:staticspawn:s0" + } + ] +} \ No newline at end of file -- Gitee