diff --git a/services/form_render_service/include/form_render_record.h b/services/form_render_service/include/form_render_record.h index fafb1d7bcd88916a214bbbe4a651599184a78b01..3a25f7812169efededc75944caf0fd9223653c49 100644 --- a/services/form_render_service/include/form_render_record.h +++ b/services/form_render_service/include/form_render_record.h @@ -132,6 +132,7 @@ private: std::unordered_map> formRendererGroupMap_; std::string hapPath_; + std::string breakPoint_; }; } // namespace FormRender } // namespace AppExecFwk diff --git a/services/form_render_service/src/form_render_record.cpp b/services/form_render_service/src/form_render_record.cpp index fb2d9f968bf557bd8354d38d921e16aa04ae74fa..d3c15b35b5bec438d17497c9d9829baad8a1fbbd 100644 --- a/services/form_render_service/src/form_render_record.cpp +++ b/services/form_render_service/src/form_render_record.cpp @@ -103,6 +103,7 @@ bool FormRenderRecord::CreateEventHandler(const std::string &bundleName) int32_t FormRenderRecord::UpdateRenderRecord(const FormJsInfo &formJsInfo, const Want &want, const sptr hostRemoteObj) { HILOG_INFO("Updated record."); + breakPoint_ = want.GetStringParam("BreakPoint"); // Some resources need to be initialized in a JS thread std::weak_ptr thisWeakPtr(shared_from_this()); @@ -190,7 +191,20 @@ bool FormRenderRecord::CreateRuntime(const FormJsInfo &formJsInfo) options.loadAce = true; options.isBundle = true; options.isUnique = true; + if (breakPoint_ == "beforePreload") { + HILOG_ERROR("raul start beforePreload loop"); + while (true) + { + } + } + runtime_ = AbilityRuntime::Runtime::Create(options); + if (breakPoint_ == "afterPreload") { + HILOG_ERROR("raul start afterPreload loop"); + while (true) + { + } + } if (runtime_ == nullptr) { HILOG_ERROR("Create runtime Failed!"); return false; diff --git a/services/include/form_data_mgr.h b/services/include/form_data_mgr.h index 249718cfddf52081f749deb766c003ee90b9d8ce..b056adedb7ad9fa2331a2d91f1879c36a7d3997c 100644 --- a/services/include/form_data_mgr.h +++ b/services/include/form_data_mgr.h @@ -511,6 +511,12 @@ public: * @param formId The form id. */ void StopRenderingForm(int32_t formId); + + /** + * @brief update host forms + * @param updateFormIds + */ + void UpdateHostForms(const std::vector &updateFormIds); private: /** * @brief Create form record. @@ -601,6 +607,7 @@ private: template bool GetAbilityFormInfo(const FormRecord &record, const std::vector &abilities, AbilityFormInfo &abilityFormInfo); + private: mutable std::recursive_mutex formRecordMutex_; mutable std::recursive_mutex formHostRecordMutex_; diff --git a/services/include/form_event_util.h b/services/include/form_event_util.h index d029d44768433f831f3e7ea8191fceecedc11141..4a8e7716cb5bb8653957818d833946ba50582c03 100644 --- a/services/include/form_event_util.h +++ b/services/include/form_event_util.h @@ -39,10 +39,8 @@ public: void HandleProviderRemoved(const std::string &bundleName, const int32_t userId); void HandleBundleDataCleared(const std::string &bundleName, int32_t userId); void HandleFormHostDataCleared(const int uid); - bool ProviderFormUpdated(const int64_t formId, const FormRecord &formRecord, - const std::vector &targetForms); - bool ProviderFormUpdated(int64_t formId, const FormRecord &formRecord, - const BundlePackInfo &bundlePackInfo); + bool ProviderFormUpdated(const int64_t formId, FormRecord &formRecord, const std::vector &targetForms); + bool ProviderFormUpdated(int64_t formId, FormRecord &formRecord, const BundlePackInfo &bundlePackInfo); void ClearFormDBRecordData(const int uid, std::map &removedFormsMap); void ClearTempFormRecordData(const int uid, std::map &removedFormsMap); void BatchDeleteNoHostTempForms(const int uid, std::map> &noHostTempFormsMap, @@ -53,6 +51,10 @@ public: void ReCreateForm(const int64_t formId); void BatchDeleteNoHostDBForms(const int uid, std::map> &noHostFormDbMap, std::map &removedFormsMap); + +private: + void UpateFormRecord(const FormInfo &formInfo, FormRecord &formRecord); + void UpateFormRecord(const AbilityFormInfo &formInfo, FormRecord &formRecord); }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_render_mgr.h b/services/include/form_render_mgr.h index 2c53f7ce08d97392423b16821829aa9ccc3d8ccf..47f87b62bc301cde62ce0fc604c875bf9a73db93 100644 --- a/services/include/form_render_mgr.h +++ b/services/include/form_render_mgr.h @@ -66,6 +66,11 @@ public: bool IsRerenderForRenderServiceDied(int64_t formId); + void SetEvent(const std::string &event) + { + breakPointEvent_ = event; + } + private: ErrCode ConnectRenderService(const sptr &connection) const; @@ -95,6 +100,7 @@ private: sptr renderRemoteObj_ = nullptr; sptr renderDeathRecipient_ = nullptr; std::atomic atomicRerenderCount_ = 0; + std::string breakPointEvent_ = "RemoveBreakPoint"; }; /** diff --git a/services/src/form_data_mgr.cpp b/services/src/form_data_mgr.cpp index 6739ae65509cd61c968caf0494f2c8644f2cc320..df675d37e5344b35e6f13387ab360c93ff77126b 100644 --- a/services/src/form_data_mgr.cpp +++ b/services/src/form_data_mgr.cpp @@ -519,6 +519,27 @@ void FormDataMgr::CleanHostRemovedForms(const std::vector &removedFormI HILOG_INFO("%{public}s end", __func__); } + +void FormDataMgr::UpdateHostForms(const std::vector &updateFormIds) +{ + HILOG_INFO("%{public}s start, update form host record by formId list", __func__); + std::vector matchedIds; + std::lock_guard lock(formHostRecordMutex_); + for (FormHostRecord &record : clientRecords_) { + for (const int64_t &formId : updateFormIds) { + if (record.Contains(formId)) { + matchedIds.emplace_back(formId); + } + } + if (!matchedIds.empty()) { + HILOG_INFO("%{public}s, OnFormUninstalled called", __func__); + record.OnFormUninstalled(matchedIds); + matchedIds.clear(); + } + } + HILOG_INFO("%{public}s end", __func__); +} + /** * @brief Handle form host died. * @param remoteHost Form host proxy object. diff --git a/services/src/form_event_util.cpp b/services/src/form_event_util.cpp index 92025961dcdcea1b8d60708e5d4fbefca8df2e1d..3a20f6a6c91b76fd0fca94cf9060b1f2339df6a1 100644 --- a/services/src/form_event_util.cpp +++ b/services/src/form_event_util.cpp @@ -56,7 +56,7 @@ void FormEventUtil::HandleProviderUpdated(const std::string &bundleName, const i bool hasPackInfo = FormBmsHelper::GetInstance().GetBundlePackInfo(bundleName, userId, bundlePackInfo); std::vector removedForms; std::vector updatedForms; - for (const FormRecord& formRecord : formInfos) { + for (FormRecord& formRecord : formInfos) { HILOG_INFO("%{public}s, provider update, formName:%{public}s", __func__, formRecord.formName.c_str()); int64_t formId = formRecord.formId; if (ProviderFormUpdated(formId, formRecord, targetForms)) { @@ -92,6 +92,7 @@ void FormEventUtil::HandleProviderUpdated(const std::string &bundleName, const i for (const int64_t id : updatedForms) { FormProviderMgr::GetInstance().RefreshForm(id, want, true); } + FormDataMgr::GetInstance().UpdateHostForms(updatedForms); FormRenderMgr::GetInstance().ReloadForm(std::move(updatedForms), bundleName, userId); } @@ -175,8 +176,8 @@ void FormEventUtil::HandleFormHostDataCleared(const int uid) } } -bool FormEventUtil::ProviderFormUpdated(const int64_t formId, - const FormRecord &formRecord, const std::vector &targetForms) +bool FormEventUtil::ProviderFormUpdated(const int64_t formId, FormRecord &formRecord, + const std::vector &targetForms) { HILOG_INFO("%{public}s start", __func__); if (targetForms.empty()) { @@ -190,9 +191,10 @@ bool FormEventUtil::ProviderFormUpdated(const int64_t formId, HILOG_INFO("%{public}s, no updated form.", __func__); return false; } - HILOG_INFO("%{public}s, form is still exist,form:%{public}s", __func__, formRecord.formName.c_str()); + // update resource + UpateFormRecord(updatedForm, formRecord); FormDataMgr::GetInstance().SetNeedRefresh(formId, true); FormCacheMgr::GetInstance().DeleteData(formId); FormBmsHelper::GetInstance().NotifyModuleNotRemovable(formRecord.bundleName, formRecord.moduleName); @@ -203,7 +205,7 @@ bool FormEventUtil::ProviderFormUpdated(const int64_t formId, return true; } -bool FormEventUtil::ProviderFormUpdated(const int64_t formId, const FormRecord &formRecord, +bool FormEventUtil::ProviderFormUpdated(const int64_t formId, FormRecord &formRecord, const BundlePackInfo &bundlePackInfo) { HILOG_INFO("%{public}s start", __func__); @@ -214,6 +216,7 @@ bool FormEventUtil::ProviderFormUpdated(const int64_t formId, const FormRecord & } HILOG_INFO("%{public}s, form is still in package info, form:%{public}s", __func__, formRecord.formName.c_str()); + UpateFormRecord(packForm, formRecord); FormDataMgr::GetInstance().SetRecordNeedFreeInstall(formId, true); FormTimerCfg timerCfg; GetTimerCfg(packForm.updateEnabled, packForm.updateDuration, packForm.scheduledUpdateTime, timerCfg); @@ -462,5 +465,33 @@ void FormEventUtil::BatchDeleteNoHostDBForms(const int uid, std::map time = FormUtil::StringSplit(formInfo.scheduledUpdateTime, Constants::TIME_DELIMETER); + if (time.size() == Constants::UPDATE_AT_CONFIG_COUNT) { + formRecord.updateAtHour = std::stoi(time[0]); + formRecord.updateAtMin = std::stoi(time[1]); + } + HILOG_INFO("%{public}s formId:%{public}lld", __func__, formRecord.formId); + FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord); +} + +void FormEventUtil::UpateFormRecord(const AbilityFormInfo &formInfo, FormRecord &formRecord) +{ + formRecord.uiSyntax = (formInfo.type.compare("arkts") == 0 ? FormType::ETS : FormType::JS); + formRecord.isEnableUpdate = formInfo.updateEnabled; + formRecord.updateDuration = formInfo.updateDuration; + std::vector time = FormUtil::StringSplit(formInfo.scheduledUpdateTime, Constants::TIME_DELIMETER); + if (time.size() == Constants::UPDATE_AT_CONFIG_COUNT) { + formRecord.updateAtHour = std::stoi(time[0]); + formRecord.updateAtMin = std::stoi(time[1]); + } + HILOG_INFO("%{public}s formId:%{public}lld", __func__, formRecord.formId); + FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord); +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index 27b8b7d8dc3eed6dcb1ef1c5854989b9cdf7d30f..b45d0459eb634a2b89268655891e7402079ebd86 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -475,7 +475,7 @@ int FormMgrAdapter::UpdateForm(const int64_t formId, HILOG_ERROR("%{public}s error, not match bundleName:%{public}s.", __func__, bundleName.c_str()); return ERR_APPEXECFWK_FORM_INVALID_PARAM; } - + HILOG_INFO("uiSyntax = %{public}d", formRecord.uiSyntax); if (formRecord.uiSyntax == FormType::ETS) { WantParams wantParams; return FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true); diff --git a/services/src/form_mgr_service.cpp b/services/src/form_mgr_service.cpp index cdd4a28216c5596d226c45dab5cc95d4f7b9b865..39da299a2e222539620c9e7ad65cbd4843a92613 100644 --- a/services/src/form_mgr_service.cpp +++ b/services/src/form_mgr_service.cpp @@ -571,6 +571,8 @@ ErrCode FormMgrService::Init() matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_DATA_CLEARED); matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED); matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED); + matchingSkills.AddEvent("beforePreload"); + matchingSkills.AddEvent("afterPreload"); // init TimerReceiver EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills); formSysEventReceiver_ = std::make_shared(subscribeInfo); diff --git a/services/src/form_render_mgr.cpp b/services/src/form_render_mgr.cpp index e889c519eebb1fc6cacaf7f437ea0efa272da451..e63806f0699cda8badffb6a3c13b7a7bbc7dc822 100644 --- a/services/src/form_render_mgr.cpp +++ b/services/src/form_render_mgr.cpp @@ -44,9 +44,10 @@ ErrCode FormRenderMgr::RenderForm( const FormRecord &formRecord, const WantParams &wantParams, const sptr &hostToken) { HILOG_INFO("RenderForm formId: %{public}" PRId64 "", formRecord.formId); - if (formRecord.uiSyntax != FormType::ETS) { - return ERR_OK; - } + HILOG_INFO("uiSyntax = %{public}d", formRecord.uiSyntax); + // if (formRecord.uiSyntax != FormType::ETS) { + // return ERR_OK; + // } if (formRecord.formId <= 0) { HILOG_ERROR("%{public}s fail, formId should be greater than 0.", __func__); @@ -57,6 +58,7 @@ ErrCode FormRenderMgr::RenderForm( Want want; want.SetParams(wantParams); want.SetParam(Constants::FORM_SUPPLY_UID, std::to_string(userId) + formRecord.bundleName); + want.SetParam("BreakPoint", breakPointEvent_); if (atomicRerenderCount_ > 0) { --atomicRerenderCount_; } else { @@ -93,6 +95,7 @@ ErrCode FormRenderMgr::RenderForm( return ERR_APPEXECFWK_FORM_INVALID_PARAM; } want.SetParam(Constants::FORM_CONNECT_ID, connection->GetConnectId()); + HILOG_ERROR("post render form"); FormTaskMgr::GetInstance().PostRenderForm(formRecord, want, remoteObject); return ERR_OK; } @@ -185,9 +188,10 @@ ErrCode FormRenderMgr::ReloadForm(std::vector &&formIds, const std::str ErrCode FormRenderMgr::StopRenderingForm(int64_t formId, const FormRecord &formRecord, const std::string &compId) { HILOG_DEBUG("%{public}s called.", __func__); - if (formRecord.uiSyntax != FormType::ETS) { - return ERR_OK; - } + HILOG_INFO("uiSyntax = %{public}d", formRecord.uiSyntax); + // if (formRecord.uiSyntax != FormType::ETS) { + // return ERR_OK; + // } if (formRecord.abilityName.empty()) { HILOG_ERROR("%{public}s, formRecord.abilityName is empty.", __func__); return ERR_APPEXECFWK_FORM_INVALID_PARAM; @@ -383,10 +387,11 @@ bool FormRenderMgr::IsNeedRender(int64_t formId) HILOG_ERROR("%{public}s fail, not exist such form, formId:%{public}" PRId64 "", __func__, formId); return false; } - if (formRecord.uiSyntax != FormType::ETS) { - HILOG_DEBUG("%{public}s fail, no need render, formId:%{public}" PRId64 "", __func__, formId); - return false; - } + HILOG_INFO("uiSyntax = %{public}d", formRecord.uiSyntax); + // if (formRecord.uiSyntax != FormType::ETS) { + // HILOG_DEBUG("%{public}s fail, no need render, formId:%{public}" PRId64 "", __func__, formId); + // return false; + // } return true; } diff --git a/services/src/form_sys_event_receiver.cpp b/services/src/form_sys_event_receiver.cpp index f5f62436a77d38ba2d09a6b4ef7366864f119f2a..f2d7e4a8159ac2d348f6183e8b8427a8a32c8704 100644 --- a/services/src/form_sys_event_receiver.cpp +++ b/services/src/form_sys_event_receiver.cpp @@ -23,6 +23,7 @@ #include "form_db_cache.h" #include "form_info_mgr.h" #include "form_timer_mgr.h" +#include "form_render_mgr.h" #include "hilog_wrapper.h" #include "in_process_call_wrapper.h" #include "want.h" @@ -49,6 +50,10 @@ void FormSysEventReceiver::OnReceiveEvent(const EventFwk::CommonEventData &event HILOG_ERROR("%{public}s failed, empty action", __func__); return; } + if (action == "beforePreload" || action == "afterPreload") { + HILOG_ERROR("raul receive event = %{public}s", action.c_str()); + FormRenderMgr::GetInstance().SetEvent(action); + } if (bundleName.empty() && action != EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED && action != EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED) { HILOG_ERROR("%{public}s failed, invalid param, action: %{public}s, bundleName: %{public}s",