diff --git a/common/appspawn_server.c b/common/appspawn_server.c index 58c6248d348cbea697ef7d28fc8a6b9fc40d2c42..cf942d3fa0b598c2c5a94f52c757d989d1b49f9e 100644 --- a/common/appspawn_server.c +++ b/common/appspawn_server.c @@ -35,10 +35,12 @@ static void NotifyResToParent(struct AppSpawnContent *content, AppSpawnClient *client, int result) { + StartAppspawnTrace("NotifyResToParent"); APPSPAWN_LOGI("NotifyResToParent: %{public}d", result); if (content->notifyResToParent != NULL) { content->notifyResToParent(content, client, result); } + FinishAppspawnTrace(); } void ProcessExit(int code) @@ -103,9 +105,7 @@ int AppSpawnChild(AppSpawnContent *content, AppSpawnClient *client) return 0); // notify success to father process and start app process - StartAppspawnTrace("NotifyResToParent"); NotifyResToParent(content, client, 0); - FinishAppspawnTrace(); StartAppspawnTrace("AppSpawnExecutePostReplyHook"); (void)AppSpawnExecutePostReplyHook(content, client); @@ -162,7 +162,7 @@ static void AppSpawnForkChildProcess(AppSpawnContent *content, AppSpawnClient *c enum fdsan_error_level errorLevel = fdsan_get_error_level(); #endif clock_gettime(CLOCK_MONOTONIC, &forkStart); - StartAppspawnTrace("AppspawnForkStart"); + StartAppspawnTrace("AppspawnFork"); *pid = fork(); if (*pid == 0) { struct timespec forkEnd = {0}; diff --git a/modules/common/BUILD.gn b/modules/common/BUILD.gn index e96d888f7ad828762a8d59d36f7fab00293c9052..709b5da36281ee63f4304201345fb11cbf07200e 100644 --- a/modules/common/BUILD.gn +++ b/modules/common/BUILD.gn @@ -16,6 +16,7 @@ import("//build/ohos.gni") ohos_shared_library("appspawn_common") { sources = [ + "${appspawn_path}/common/appspawn_trace.cpp", "appspawn_adapter.cpp", "appspawn_cgroup.c", "appspawn_common.c", @@ -77,6 +78,10 @@ ohos_shared_library("appspawn_common") { external_deps += [ "init:seccomp" ] } + if (!defined(ohos_lite)) { + external_deps += [ "hitrace:hitrace_meter" ] + } + if (!defined(global_parts_info) || defined(global_parts_info.security_security_component_manager)) { defines += [ "SECURITY_COMPONENT_ENABLE" ] diff --git a/modules/common/appspawn_common.c b/modules/common/appspawn_common.c index f3fc57b6079aa28081c171be1d2fd8a129f8130a..a9089177b25f884f2b97cab90dc370c2fe421a44 100644 --- a/modules/common/appspawn_common.c +++ b/modules/common/appspawn_common.c @@ -43,6 +43,7 @@ #include "appspawn_msg.h" #include "appspawn_manager.h" #include "appspawn_silk.h" +#include "appspawn_trace.h" #include "init_param.h" #include "parameter.h" #include "securec.h" @@ -305,7 +306,9 @@ static int SetUidGid(const AppSpawnMgr *content, const AppSpawningCtx *property) APPSPAWN_CHECK(ret == 0, return errno, "setgid(%{public}u) failed: %{public}d", dacInfo->gid, errno); + StartAppspawnTrace("SetSeccompFilter"); ret = SetSeccompFilter(content, property); + FinishAppspawnTrace(); APPSPAWN_CHECK(ret == 0, return ret, "Failed to set setSeccompFilter"); /* If the effective user ID is changed from 0 to nonzero, @@ -553,7 +556,9 @@ static int SpawnSetProperties(AppSpawnMgr *content, AppSpawningCtx *property) ret = SetCapabilities(content, property); APPSPAWN_CHECK_ONLY_EXPER(ret == 0, return ret); + StartAppspawnTrace("SetSelinuxCon"); ret = SetSelinuxCon(content, property); + FinishAppspawnTrace(); APPSPAWN_CHECK_ONLY_EXPER(ret == 0, return ret); ret = WaitForDebugger(property); @@ -561,7 +566,9 @@ static int SpawnSetProperties(AppSpawnMgr *content, AppSpawningCtx *property) APPSPAWN_ONLY_EXPER(GetAppSpawnMsgType(property) == MSG_SPAWN_NATIVE_PROCESS, return 0); #ifdef SECURITY_COMPONENT_ENABLE + StartAppspawnTrace("InitSecCompClientEnhance"); InitSecCompClientEnhance(); + FinishAppspawnTrace(); #endif return 0; } diff --git a/modules/sandbox/BUILD.gn b/modules/sandbox/BUILD.gn index 4d1226efe0635ea06f64fd022dfce046945fa94e..ac304bea8c45f3148965395a69a72106224204a1 100644 --- a/modules/sandbox/BUILD.gn +++ b/modules/sandbox/BUILD.gn @@ -71,6 +71,7 @@ if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) { ohos_shared_library("appspawn_sandbox") { sources = [ "${appspawn_innerkits_path}/permission/appspawn_mount_permission.c", + "${appspawn_path}/common/appspawn_trace.cpp", ] sources += appspawn_sandbox_src @@ -98,6 +99,9 @@ if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) { "init:libbegetutil", "json:nlohmann_json_static", ] + if (!defined(ohos_lite)) { + external_deps += [ "hitrace:hitrace_meter" ] + } if (build_selinux) { defines += [ "WITH_SELINUX" ] external_deps += [ "selinux_adapter:libhap_restorecon" ] diff --git a/modules/sandbox/normal/appspawn_sandbox_manager.cpp b/modules/sandbox/normal/appspawn_sandbox_manager.cpp index aa9224b2ef4d99e07f92103d057074915253d9c5..c74076841bcbd4c1eb7307f24c246ae25ae5f07e 100644 --- a/modules/sandbox/normal/appspawn_sandbox_manager.cpp +++ b/modules/sandbox/normal/appspawn_sandbox_manager.cpp @@ -16,6 +16,7 @@ #include "securec.h" #include "appspawn_hook.h" #include "appspawn_manager.h" +#include "appspawn_trace.h" #include "appspawn_utils.h" #include "sandbox_core.h" @@ -52,11 +53,13 @@ int32_t SetAppSandboxProperty(AppSpawnMgr *content, AppSpawningCtx *property) APPSPAWN_LOGV("SetAppSandboxProperty sandboxNsFlags 0x%{public}x", sandboxNsFlags); + StartAppspawnTrace("SetAppSandboxProperty"); if (IsNWebSpawnMode(content)) { ret = OHOS::AppSpawn::SandboxCore::SetAppSandboxPropertyNweb(property, sandboxNsFlags); } else { ret = OHOS::AppSpawn::SandboxCore::SetAppSandboxProperty(property, sandboxNsFlags); } + FinishAppspawnTrace(); // for module test do not create sandbox, use APP_FLAGS_IGNORE_SANDBOX to ignore sandbox result if (CheckAppMsgFlagsSet(property, APP_FLAGS_IGNORE_SANDBOX)) { APPSPAWN_LOGW("Do not care sandbox result %{public}d", ret); diff --git a/modules/sandbox/normal/sandbox_common.cpp b/modules/sandbox/normal/sandbox_common.cpp index 7f8c9e87c201ca02c7db31cc00dffcac60f177d2..c34e2fc14e7fd948e7c963bf0d08251a59d3078f 100644 --- a/modules/sandbox/normal/sandbox_common.cpp +++ b/modules/sandbox/normal/sandbox_common.cpp @@ -982,7 +982,7 @@ int32_t SandboxCommon::DoAppSandboxMountOnce(const AppSpawningCtx *appProperty, uint64_t diff = DiffTime(&mountStart, &mountEnd); APPSPAWN_CHECK_ONLY_LOG(diff < SandboxCommonDef::MAX_MOUNT_TIME, "mount %{public}s time %{public}" PRId64 " us", arg->srcPath, diff); #ifdef APPSPAWN_HISYSEVENT - APPSPAWN_CHECK_ONLY_EXPER(diff < FUNC_REPORT_DURATION, ReportAbnormalDuration("MOUNT", diff)); + APPSPAWN_CHECK_ONLY_EXPER(diff < FUNC_REPORT_DURATION, ReportAbnormalDuration(arg->srcPath, diff)); #endif if (ret != 0) { APPSPAWN_LOGI("errno is: %{public}d, bind mount %{public}s to %{public}s", errno, arg->srcPath, arg->destPath); diff --git a/modules/sandbox/normal/sandbox_core.cpp b/modules/sandbox/normal/sandbox_core.cpp index ebecabb8ecb3cd3d238fc771d2c884a50cc9a3e6..4173e73dc3829453557a850a107694df452fceb4 100644 --- a/modules/sandbox/normal/sandbox_core.cpp +++ b/modules/sandbox/normal/sandbox_core.cpp @@ -57,6 +57,7 @@ bool SandboxCore::NeedNetworkIsolated(AppSpawningCtx *property) int SandboxCore::EnableSandboxNamespace(AppSpawningCtx *appProperty, uint32_t sandboxNsFlags) { + StartAppspawnTrace("EnableSandboxNamespace"); #ifdef APPSPAWN_HISYSEVENT struct timespec startClock = {0}; clock_gettime(CLOCK_MONOTONIC, &startClock); @@ -74,6 +75,7 @@ int SandboxCore::EnableSandboxNamespace(AppSpawningCtx *appProperty, uint32_t sa rc = EnableNewNetNamespace(); APPSPAWN_CHECK(rc == 0, return rc, "Set %{public}s new netnamespace failed", GetBundleName(appProperty)); } + FinishAppspawnTrace(); return 0; } @@ -843,7 +845,9 @@ int32_t SandboxCore::SetSandboxProperty(AppSpawningCtx *appProperty, std::string { int32_t ret = 0; const std::string bundleName = GetBundleName(appProperty); + StartAppspawnTrace("SetCommonAppSandboxProperty"); ret = SetCommonAppSandboxProperty(appProperty, sandboxPackagePath); + FinishAppspawnTrace(); APPSPAWN_CHECK(ret == 0, return ret, "SetCommonAppSandboxProperty failed, packagename is %{public}s", bundleName.c_str()); if (SandboxCommon::HasPrivateInBundleName(bundleName)) { @@ -851,7 +855,9 @@ int32_t SandboxCore::SetSandboxProperty(AppSpawningCtx *appProperty, std::string APPSPAWN_CHECK(ret == 0, return ret, "SetPrivateAppSandboxProperty failed, packagename is %{public}s", bundleName.c_str()); } + StartAppspawnTrace("SetPermissionAppSandboxProperty"); ret = SetPermissionAppSandboxProperty(appProperty); + FinishAppspawnTrace(); APPSPAWN_CHECK(ret == 0, return ret, "SetPermissionAppSandboxProperty failed, packagename is %{public}s", bundleName.c_str()); @@ -909,7 +915,9 @@ int32_t SandboxCore::SetAppSandboxProperty(AppSpawningCtx *appProperty, uint32_t #endif #ifndef APPSPAWN_TEST + StartAppspawnTrace("ChangeCurrentDir"); rc = ChangeCurrentDir(sandboxPackagePath, bundleName, sandboxSharedStatus); + FinishAppspawnTrace(); APPSPAWN_CHECK(rc == 0, return rc, "change current dir failed"); APPSPAWN_LOGV("Change root dir success"); #endif diff --git a/standard/appspawn_service.c b/standard/appspawn_service.c index ee46ffc7be98d1ea3cfcdc8cefdf67bdfb3f6a26..49fce14418250f28518c439434987f0676078b5a 100644 --- a/standard/appspawn_service.c +++ b/standard/appspawn_service.c @@ -290,6 +290,7 @@ static void SendMessageComplete(const TaskHandle taskHandle, BufferHandle handle static int SendResponse(const AppSpawnConnection *connection, const AppSpawnMsg *msg, int result, pid_t pid) { + StartAppspawnTrace("SendResponse"); APPSPAWN_LOGV("SendResponse connectionId: %{public}u result: 0x%{public}x pid: %{public}d", connection->connectionId, result, pid); uint32_t bufferSize = sizeof(AppSpawnResponseMsg); @@ -301,7 +302,9 @@ static int SendResponse(const AppSpawnConnection *connection, const AppSpawnMsg return -1, "Failed to memcpy_s bufferSize"); buffer->result.result = result; buffer->result.pid = pid; - return LE_Send(LE_GetDefaultLoop(), connection->stream, handle, bufferSize); + ret = LE_Send(LE_GetDefaultLoop(), connection->stream, handle, bufferSize); + FinishAppspawnTrace(); + return ret; } static void WaitMsgCompleteTimeOut(const TimerHandle taskHandle, void *context) @@ -802,6 +805,7 @@ static void ProcessPreFork(AppSpawnContent *content, AppSpawningCtx *property) APPSPAWN_CHECK(pipe(content->parentToChildFd) == 0, ClearPipeFd(content->preforkFd, PIPE_FD_LENGTH); return, "prefork with prefork pipe failed %{public}d", errno); enum fdsan_error_level errorLevel = fdsan_get_error_level(); + StartAppspawnTrace("AppspawnPreFork"); content->reservedPid = fork(); APPSPAWN_LOGV("prefork fork finish %{public}d,%{public}d,%{public}d,%{public}d,%{public}d", content->reservedPid, content->preforkFd[0], content->preforkFd[1], content->parentToChildFd[0], @@ -837,9 +841,12 @@ static void ProcessPreFork(AppSpawnContent *content, AppSpawningCtx *property) // Inherit the error level of the original process (void)fdsan_set_error_level(errorLevel); ProcessExit(AppSpawnChild(content, &property->client)); - } else if (content->reservedPid < 0) { - ClearPipeFd(content->preforkFd, PIPE_FD_LENGTH); - APPSPAWN_LOGE("prefork fork child process failed %{public}d", content->reservedPid); + } else { + FinishAppspawnTrace(); + if (content->reservedPid < 0) { + ClearPipeFd(content->preforkFd, PIPE_FD_LENGTH); + APPSPAWN_LOGE("prefork fork child process failed %{public}d", content->reservedPid); + } } } @@ -1337,10 +1344,12 @@ static void AppSpawnRun(AppSpawnContent *content, int argc, char *const argv[]) APPSPAWN_STATIC int AppSpawnClearEnv(AppSpawnMgr *content, AppSpawningCtx *property) { + StartAppspawnTrace("AppSpawnClearEnv"); APPSPAWN_CHECK(content != NULL, return 0, "Invalid appspawn content"); DeleteAppSpawningCtx(property); AppSpawnDestroyContent(&content->content); APPSPAWN_LOGV("clear %{public}d end", getpid()); + FinishAppspawnTrace(); return 0; }