diff --git a/BUILD.gn b/BUILD.gn index b94f68c8a90923bd13a37158d77526b399b6c86a..fc79436fa4ea541a00b375b9e8ecbbc18bd0e834 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -58,6 +58,13 @@ if (!defined(ohos_lite)) { subsystem_name = "${subsystem_name}" part_name = "${part_name}" } + + ohos_prebuilt_etc("nwebspawn.rc") { + source = "nwebspawn.cfg" + relative_install_dir = "init" + subsystem_name = "${subsystem_name}" + part_name = "${part_name}" + } } group("appspawn_all") { @@ -94,6 +101,12 @@ group("appspawn_all") { "standard:nativespawn", ] } + if (appspawn_support_nweb) { # for support nwebspawn + deps += [ + ":nwebspawn.rc", + "standard:nwebspawn", + ] + } } else { deps += [ "lite:appspawn_lite" ] } diff --git a/appspawn.cfg b/appspawn.cfg index f81a733910fef63bbea0134b8da616d073de7449..989ab65f4fcbd0dc054b5d67a1081965fa15d955 100644 --- a/appspawn.cfg +++ b/appspawn.cfg @@ -47,17 +47,6 @@ "gid" : "appspawn", "option" : [ ] - }, - { - "name" : "NWebSpawn", - "family" : "AF_LOCAL", - "type" : "SOCK_STREAM", - "protocol" : "default", - "permissions" : "0666", - "uid" : "nwebspawn", - "gid" : "nwebspawn", - "option" : [ - ] }], "sandbox" : 0, "start-mode" : "boot", diff --git a/nwebspawn.cfg b/nwebspawn.cfg new file mode 100644 index 0000000000000000000000000000000000000000..7b41723fe3647ff34b049b82bdbaa0af5cfa437a --- /dev/null +++ b/nwebspawn.cfg @@ -0,0 +1,29 @@ +{ + "services" : [{ + "name" : "nwebspawn", + "path" : ["/system/bin/nwebspawn", + "-mode nwebspawn", + "--process-name com.ohos.nwebspawn.startup --start-flags daemon --type standard ", + "--sandbox-switch on --bundle-name com.ohos.nwebspawn.startup --app-operate-type operate ", + "--render-command command --app-launch-type singleton --app-visible true"], + "uid" : "nwebspawn", + "gid" : ["nwebspawn"], + "setuid" : true, + "caps" : ["CAP_SYS_ADMIN", "CAP_SETGID", "CAP_SETUID", "CAP_KILL"], + "socket" : [{ + "name" : "NWebSpawn", + "family" : "AF_LOCAL", + "type" : "SOCK_STREAM", + "protocol" : "default", + "permissions" : "0666", + "uid" : "nwebspawn", + "gid" : "nwebspawn", + "option" : [ + ] + }], + "start-mode" : "boot", + "sandbox" : 0, + "secon" : "u:r:nwebspawn:s0" + } + ] +} \ No newline at end of file diff --git a/standard/BUILD.gn b/standard/BUILD.gn index e9c5b1ec1b4539e41171553b636a035b4956f822..779676dc5a73a6876ea528c2268bc181d750252c 100644 --- a/standard/BUILD.gn +++ b/standard/BUILD.gn @@ -307,3 +307,89 @@ ohos_prebuilt_etc("nativespawn.rc") { subsystem_name = "${subsystem_name}" part_name = "${part_name}" } + +# to support nwebspawn +ohos_executable("nwebspawn") { + sources = [ + "${appspawn_path}/common/appspawn_server.c", + "${appspawn_path}/common/appspawn_trace.cpp", + "${appspawn_path}/modules/common/appspawn_dfx_dump.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 = ["NWEB_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" ] + } + if (is_debug || build_variant == "root") { + defines += [ "DEBUG_BEGETCTL_BOOT" ] + } + if (appspawn_support_prefork) { + defines += [ "APPSPAWN_SUPPORT_PREFORK" ] + } + + external_deps = [ + "cJSON:cjson", + "c_utils:utils", + "config_policy:configpolicy_util", + "ffrt:libffrt", + "hilog:libhilog", + "hitrace:hitrace_meter", + "init:libbegetutil", + ] + if (enable_appspawn_dump_catcher) { + external_deps += [ "faultloggerd:libdfx_dumpcatcher" ] + } + + if (appspawn_report_event) { + defines += [ "APPSPAWN_HISYSEVENT" ] + external_deps += [ "hisysevent:libhisysevent" ] + sources += [ + "${appspawn_path}/modules/sysevent/appspawn_hisysevent.cpp", + "${appspawn_path}/modules/sysevent/hisysevent_adapter.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}" +} diff --git a/standard/appspawn_main.c b/standard/appspawn_main.c index 2f87220cb899694524c54c98c51d2666473ff8b5..df5fe79f011b8e226c2ca7380164794f9226c2c4 100644 --- a/standard/appspawn_main.c +++ b/standard/appspawn_main.c @@ -77,7 +77,7 @@ static void CheckPreload(char *const argv[]) #ifndef NATIVE_SPAWN static AppSpawnStartArgTemplate *GetAppSpawnStartArg(const char *serverName, AppSpawnStartArgTemplate *argTemplate, - int count) + AppSpawnStartArgTemplate *argTemp, int count) { for (int i = 0; i < count; i++) { if (strcmp(serverName, argTemplate[i].serverName) == 0) { @@ -85,7 +85,7 @@ static AppSpawnStartArgTemplate *GetAppSpawnStartArg(const char *serverName, App } } - return argTemplate; + return argTemp; } #endif @@ -112,15 +112,21 @@ int main(int argc, char *const argv[]) argTemp = &g_appCJSpawnStartArgTemplate[CJPROCESS_FOR_APP_SPAWN]; if (argc > MODE_VALUE_INDEX) { argTemp = GetAppSpawnStartArg(argv[MODE_VALUE_INDEX], g_appCJSpawnStartArgTemplate, - ARRAY_LENGTH(g_appCJSpawnStartArgTemplate)); + argTemp, ARRAY_LENGTH(g_appCJSpawnStartArgTemplate)); } #elif NATIVE_SPAWN argTemp = &g_appSpawnStartArgTemplate[PROCESS_FOR_NATIVE_SPAWN]; +#elif NWEB_SPAWN + argTemp = &g_appSpawnStartArgTemplate[PROCESS_FOR_NWEB_SPAWN]; + if (argc > MODE_VALUE_INDEX) { + argTemp = GetAppSpawnStartArg(argv[MODE_VALUE_INDEX], g_appSpawnStartArgTemplate, + argTemp, ARRAY_LENGTH(g_appSpawnStartArgTemplate)); + } #else argTemp = &g_appSpawnStartArgTemplate[PROCESS_FOR_APP_SPAWN]; if (argc > MODE_VALUE_INDEX) { argTemp = GetAppSpawnStartArg(argv[MODE_VALUE_INDEX], g_appSpawnStartArgTemplate, - ARRAY_LENGTH(g_appSpawnStartArgTemplate)); + argTemp, ARRAY_LENGTH(g_appSpawnStartArgTemplate)); } #endif arg = &argTemp->arg; diff --git a/standard/appspawn_service.c b/standard/appspawn_service.c index 001ddcbf27acccac44048752d7159d004e3ed1b2..ca6da5a12a6e18f2301ad867eedf4fa7edc0ed3d 100644 --- a/standard/appspawn_service.c +++ b/standard/appspawn_service.c @@ -195,14 +195,6 @@ static void HandleDiedPid(pid_t pid, uid_t uid, int status) ProcessMgrHookExecute(STAGE_SERVER_APP_DIED, GetAppSpawnContent(), appInfo); ProcessMgrHookExecute(STAGE_SERVER_APP_UMOUNT, GetAppSpawnContent(), appInfo); - // if current process of death is nwebspawn, restart appspawn - if (strcmp(appInfo->name, NWEBSPAWN_SERVER_NAME) == 0) { - OH_ListRemove(&appInfo->node); - free(appInfo); - APPSPAWN_LOGW("Current process of death is nwebspawn, pid = %{public}d, restart appspawn", pid); - StopAppSpawn(); - return; - } // move app info to died queue in NWEBSPAWN, or delete appinfo TerminateSpawnedProcess(appInfo); } @@ -1203,6 +1195,8 @@ APPSPAWN_STATIC int AppSpawnColdStartApp(struct AppSpawnContent *content, AppSpa 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"; +#elif NWEB_SPAWN + char *path = property->forkCtx.coldRunPath != NULL ? property->forkCtx.coldRunPath : "/system/bin/nwebspawn"; #else char *path = property->forkCtx.coldRunPath != NULL ? property->forkCtx.coldRunPath : "/system/bin/appspawn"; #endif @@ -1395,20 +1389,7 @@ AppSpawnContent *StartSpawnService(const AppSpawnStartArg *startArg, uint32_t ar AppSpawnStartArg *arg = (AppSpawnStartArg *)startArg; APPSPAWN_LOGV("Start appspawn argvSize %{public}d mode %{public}d service %{public}s", argvSize, arg->mode, arg->serviceName); - if (arg->mode == MODE_FOR_APP_SPAWN) { -#ifndef APPSPAWN_TEST - pid = NWebSpawnLaunch(); - if (pid == 0) { - arg->socketName = NWEBSPAWN_SOCKET_NAME; - arg->serviceName = NWEBSPAWN_SERVER_NAME; - arg->moduleType = MODULE_NWEBSPAWN; - arg->mode = MODE_FOR_NWEB_SPAWN; - arg->initArg = 1; - } -#endif - } else if (arg->mode == MODE_FOR_NWEB_SPAWN && getuid() == 0) { - NWebSpawnInit(); - } + if (arg->initArg) { int ret = memset_s(argv[0], argvSize, 0, (size_t)argvSize); APPSPAWN_CHECK(ret == EOK, return NULL, "Failed to memset argv[0]"); @@ -1434,7 +1415,6 @@ AppSpawnContent *StartSpawnService(const AppSpawnStartArg *startArg, uint32_t ar #endif AddAppSpawnHook(STAGE_CHILD_PRE_RUN, HOOK_PRIO_LOWEST, AppSpawnClearEnv); if (arg->mode == MODE_FOR_APP_SPAWN) { - AddSpawnedProcess(pid, NWEBSPAWN_SERVER_NAME, 0, false); SetParameter("bootevent.appspawn.started", "true"); } return content; @@ -1597,7 +1577,7 @@ static void ProcessSpawnRestartMsg(AppSpawnConnection *connection, AppSpawnMsgNo } } - char *path = "/system/bin/appspawn"; + char *path = "/system/bin/nwebspawn"; char *mode = NWEBSPAWN_RESTART; const char *const formatCmds[] = {path, "-mode", mode, NULL}; ret = execv(path, (char **)formatCmds);