From 431dddf5b2cdc5ead386a8a6254ab68ef07d390b Mon Sep 17 00:00:00 2001 From: jsjzju Date: Wed, 13 Mar 2024 20:22:34 +0800 Subject: [PATCH] =?UTF-8?q?startAbility=E6=96=B0=E5=A2=9E=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E7=88=B6=E8=BF=9B=E7=A8=8B=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jsjzju Change-Id: Ib8cd4ca6b22441b0f2ddeda9cfe24b80362abf24 --- services/abilitymgr/include/ability_record.h | 2 + services/abilitymgr/src/ability_record.cpp | 13 +++++ .../appmgr/include/app_mgr_service_inner.h | 2 + services/appmgr/include/app_running_record.h | 11 ++++ services/appmgr/src/app_mgr_service_inner.cpp | 55 +++++++++++++++++++ services/appmgr/src/app_running_record.cpp | 30 ++++++++++ 6 files changed, 113 insertions(+) diff --git a/services/abilitymgr/include/ability_record.h b/services/abilitymgr/include/ability_record.h index a9a5d13032e..713589a0c80 100644 --- a/services/abilitymgr/include/ability_record.h +++ b/services/abilitymgr/include/ability_record.h @@ -1019,6 +1019,8 @@ private: bool GetUriListFromWant(Want &want, std::vector &uriVec); + bool CheckNeedAttachToParent() const; + #ifdef SUPPORT_GRAPHICS std::shared_ptr GetWantFromMission() const; void SetShowWhenLocked(const AppExecFwk::AbilityInfo &abilityInfo, sptr &info) const; diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index ed4d878a838..d86cd01898c 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -71,6 +71,7 @@ const std::string DMS_PROCESS_NAME = "distributedsched"; const std::string DMS_MISSION_ID = "dmsMissionId"; const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId"; const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId"; +const char* WANT_PARAMS_ATTACHE_TO_PARENT = "ohos.ability.params.attachToParent"; const std::u16string SYSTEM_ABILITY_TOKEN_CALLBACK = u"ohos.aafwk.ISystemAbilityTokenCallback"; const std::string SHOW_ON_LOCK_SCREEN = "ShowOnLockScreen"; const std::string DLP_INDEX = "ohos.dlp.params.index"; @@ -366,9 +367,11 @@ int AbilityRecord::LoadAbility() std::lock_guard guard(wantLock_); want_.SetParam(ABILITY_OWNER_USERID, ownerMissionUserId_); want_.SetParam("ohos.ability.launch.reason", static_cast(lifeCycleStateInfo_.launchParam.launchReason)); + want_.SetParam(WANT_PARAMS_ATTACHE_TO_PARENT, CheckNeedAttachToParent()); auto result = DelayedSingleton::GetInstance()->LoadAbility( token_, callerToken_, abilityInfo_, applicationInfo_, want_); want_.RemoveParam(ABILITY_OWNER_USERID); + want_.RemoveParam(WANT_PARAMS_ATTACHE_TO_PARENT); auto isAttachDebug = DelayedSingleton::GetInstance()->IsAttachDebug(abilityInfo_.bundleName); if (isAttachDebug) { @@ -3420,5 +3423,15 @@ bool AbilityRecord::GetRestartAppFlag() const { return isRestartApp_; } + +bool AbilityRecord::CheckNeedAttachToParent() const +{ + auto sessionInfo = GetSessionInfo(); + if (sessionInfo && sessionInfo->processOptions && + sessionInfo->processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_PARENT) { + return true; + } + return false; +} } // namespace AAFwk } // namespace OHOS diff --git a/services/appmgr/include/app_mgr_service_inner.h b/services/appmgr/include/app_mgr_service_inner.h index df04ce8829d..8ca9fa3a060 100644 --- a/services/appmgr/include/app_mgr_service_inner.h +++ b/services/appmgr/include/app_mgr_service_inner.h @@ -1155,6 +1155,8 @@ private: void KillChildProcess(const std::shared_ptr &appRecord); + void KillAttachedChildProcess(const std::shared_ptr &appRecord); + private: /** * ClearUpApplicationData, clear the application data. diff --git a/services/appmgr/include/app_running_record.h b/services/appmgr/include/app_running_record.h index f3407c607db..01535727de9 100644 --- a/services/appmgr/include/app_running_record.h +++ b/services/appmgr/include/app_running_record.h @@ -671,6 +671,14 @@ public: return isSpawned_.load(); } + std::map> GetChildAppRecordMap() const; + void AddChildAppRecord(pid_t pid, std::shared_ptr appRecord); + void RemoveChildAppRecord(pid_t pid); + void ClearChildAppRecordMap(); + + void SetParentAppRecord(std::shared_ptr appRecord); + std::shared_ptr GetParentAppRecord(); + /** * @brief Notify NativeEngine GC of status change. * @@ -827,6 +835,9 @@ private: bool isContinuousTask_ = false; // Only continuesTask processes can be set to true, please choose carefully std::atomic_bool isSpawned_ = false; + std::weak_ptr parentAppRecord_; + std::map> childAppRecordMap_; + // render record std::map> renderRecordMap_; ffrt::mutex renderRecordMapLock_; diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index d85a5ce9ce8..f56f2db5705 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -165,6 +166,7 @@ const std::string SYSTEM_BASIC = "system_basic"; const std::string SYSTEM_CORE = "system_core"; const std::string ABILITY_OWNER_USERID = "AbilityMS_Owner_UserId"; const std::string PROCESS_EXIT_EVENT_TASK = "Send Process Exit Event Task"; +const char* WANT_PARAMS_ATTACHE_TO_PARENT = "ohos.ability.params.attachToParent"; constexpr int32_t ROOT_UID = 0; constexpr int32_t FOUNDATION_UID = 5523; @@ -313,6 +315,12 @@ void AppMgrServiceInner::LoadAbility(const sptr &token, const spt MakeProcessName(abilityInfo, appInfo, hapModuleInfo, appIndex, processName); HILOG_DEBUG("processName = %{public}s", processName.c_str()); + bool needAttachToParent = false; + if (want) { + needAttachToParent = want->GetBoolParam(WANT_PARAMS_ATTACHE_TO_PARENT, false); + want->RemoveParam(WANT_PARAMS_ATTACHE_TO_PARENT); + } + std::shared_ptr appRecord; // for isolation process std::string specifiedProcessFlag = ""; @@ -347,6 +355,10 @@ void AppMgrServiceInner::LoadAbility(const sptr &token, const spt } SendAppStartupTypeEvent(appRecord, abilityInfo, AppStartType::COLD); auto callRecord = GetAppRunningRecordByAbilityToken(preToken); + if (needAttachToParent && callRecord == nullptr) { + HILOG_ERROR("parent is not exist."); + return; + } if (callRecord != nullptr) { auto launchReson = (want == nullptr) ? 0 : want->GetIntParam("ohos.ability.launch.reason", 0); HILOG_DEBUG("req: %{public}d, proc: %{public}s, call:%{public}d,%{public}s", launchReson, @@ -356,6 +368,13 @@ void AppMgrServiceInner::LoadAbility(const sptr &token, const spt int32_t bundleIndex = (want == nullptr) ? 0 : want->GetIntParam(DLP_PARAMS_INDEX, 0); StartProcess(abilityInfo->applicationName, processName, startFlags, appRecord, appInfo->uid, bundleInfo, appInfo->bundleName, bundleIndex, appExistFlag); + if (needAttachToParent) { + auto pid = appRecord->GetPriorityObject()->GetPid(); + if (pid > 0) { + appRecord->SetParentAppRecord(callRecord); + callRecord->AddChildAppRecord(pid, appRecord); + } + } std::string perfCmd = (want == nullptr) ? "" : want->GetStringParam(PERF_CMD); bool isSandboxApp = (want == nullptr) ? false : want->GetBoolParam(ENTER_SANDBOX, false); (void)StartPerfProcess(appRecord, perfCmd, "", isSandboxApp); @@ -771,6 +790,7 @@ void AppMgrServiceInner::ApplicationTerminated(const int32_t recordId) KillRenderProcess(appRecord); KillChildProcess(appRecord); + KillAttachedChildProcess(appRecord); appRecord->SetState(ApplicationState::APP_STATE_TERMINATED); appRecord->RemoveAppDeathRecipient(); appRecord->SetProcessChangeReason(ProcessChangeReason::REASON_APP_TERMINATED); @@ -2450,6 +2470,7 @@ void AppMgrServiceInner::ClearAppRunningData(const std::shared_ptrGetPriorityObject() != nullptr) { SendProcessExitEvent(appRecord->GetPriorityObject()->GetPid()); @@ -5269,6 +5290,40 @@ void AppMgrServiceInner::ExitChildProcessSafelyByChildPid(const pid_t pid) } } +void AppMgrServiceInner::KillAttachedChildProcess(const std::shared_ptr &appRecord) +{ + if (appRecord == nullptr) { + HILOG_ERROR("appRecord is nullptr."); + return; + } + auto parentAppRecord = appRecord->GetParentAppRecord(); + if (parentAppRecord) { + parentAppRecord->RemoveChildAppRecord(appRecord->GetPriorityObject()->GetPid()); + } + std::vector pids; + std::queue> queue; + queue.push(appRecord); + while (!queue.empty()) { + auto front = queue.front(); + queue.pop(); + if (front == nullptr) { + continue; + } + auto childAppRecordMap = front->GetChildAppRecordMap(); + for (const auto& [pid, weakChildAppRecord] : childAppRecordMap) { + auto childRecord = weakChildAppRecord.lock(); + if (childRecord) { + queue.push(childRecord); + pids.push_back(pid); + } + } + front->ClearChildAppRecordMap(); + } + for (const auto& pid : pids) { + KillProcessByPid(pid); + } +} + void AppMgrServiceInner::NotifyAppRunningStatusEvent( const std::string &bundle, int32_t uid, AbilityRuntime::RunningStatus runningStatus) { diff --git a/services/appmgr/src/app_running_record.cpp b/services/appmgr/src/app_running_record.cpp index be53832e782..076a9a99174 100644 --- a/services/appmgr/src/app_running_record.cpp +++ b/services/appmgr/src/app_running_record.cpp @@ -1848,6 +1848,36 @@ ProcessType AppRunningRecord::GetProcessType() const return processType_; } +std::map> AppRunningRecord::GetChildAppRecordMap() const +{ + return childAppRecordMap_; +} + +void AppRunningRecord::AddChildAppRecord(pid_t pid, std::shared_ptr appRecord) +{ + childAppRecordMap_[pid] = appRecord; +} + +void AppRunningRecord::RemoveChildAppRecord(pid_t pid) +{ + childAppRecordMap_.erase(pid); +} + +void AppRunningRecord::ClearChildAppRecordMap() +{ + childAppRecordMap_.clear(); +} + +void AppRunningRecord::SetParentAppRecord(std::shared_ptr appRecord) +{ + parentAppRecord_ = appRecord; +} + +std::shared_ptr AppRunningRecord::GetParentAppRecord() +{ + return parentAppRecord_.lock(); +} + int32_t AppRunningRecord::ChangeAppGcState(const int32_t state) { HILOG_DEBUG("called."); -- Gitee