1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "app_state_observer.h"
17
18 #include "app_mgr_constants.h"
19 #include "iservice_registry.h"
20 #include "system_ability_definition.h"
21
22 #include "bg_continuous_task_mgr.h"
23 #include "continuous_task_log.h"
24 #include "bg_efficiency_resources_mgr.h"
25
26 namespace OHOS {
27 namespace BackgroundTaskMgr {
28 namespace {
29 const std::string TASK_ON_PROCESS_DIED = "OnProcessDiedTask";
30 const std::string TASK_ON_ABILITY_STATE_CHANGED = "OnAbilityStateChangedTask";
31 }
32
33 #ifdef BGTASK_MGR_UNIT_TEST
34 #define WEAK_FUNC __attribute__((weak))
35 #else
36 #define WEAK_FUNC
37 #endif
38
AppStateObserver()39 AppStateObserver::AppStateObserver() {}
40
~AppStateObserver()41 AppStateObserver::~AppStateObserver() {}
42
CheckParamValid()43 bool AppStateObserver::CheckParamValid()
44 {
45 if (handler_.expired()) {
46 BGTASK_LOGE("AppStateObserver handler is null");
47 return false;
48 }
49 if (bgContinuousTaskMgr_.expired()) {
50 BGTASK_LOGE("AppStateObserver bgContinuousTaskMgr is null");
51 return false;
52 }
53 return true;
54 }
55
OnAbilityStateChanged(const AppExecFwk::AbilityStateData & abilityStateData)56 void AppStateObserver::OnAbilityStateChanged(const AppExecFwk::AbilityStateData &abilityStateData)
57 {
58 if (abilityStateData.abilityState != static_cast<int32_t>(AppExecFwk::AbilityState::ABILITY_STATE_TERMINATED)) {
59 return;
60 }
61 BGTASK_LOGD("ability state changed, uid: %{public}d abilityName: %{public}s, abilityState: %{public}d",
62 abilityStateData.uid, abilityStateData.abilityName.c_str(), abilityStateData.abilityState);
63 if (!CheckParamValid()) {
64 return;
65 }
66 int32_t uid = abilityStateData.uid;
67 std::string abilityName = abilityStateData.abilityName;
68 auto task = [this, uid, abilityName]() {
69 this->bgContinuousTaskMgr_.lock()->OnAbilityStateChanged(uid, abilityName);
70 };
71 handler_.lock()->PostTask(task, TASK_ON_ABILITY_STATE_CHANGED);
72 }
73
OnProcessDied(const AppExecFwk::ProcessData & processData)74 void AppStateObserver::OnProcessDied(const AppExecFwk::ProcessData &processData)
75 {
76 BGTASK_LOGD("process died, uid : %{public}d, pid : %{public}d", processData.uid, processData.pid);
77 OnProcessDiedContinuousTask(processData);
78 OnProcessDiedEfficiencyRes(processData);
79 }
80
OnProcessDiedContinuousTask(const AppExecFwk::ProcessData & processData)81 void AppStateObserver::OnProcessDiedContinuousTask(const AppExecFwk::ProcessData &processData)
82 {
83 if (!CheckParamValid()) {
84 return;
85 }
86 auto task = [this, processData]() {
87 this->bgContinuousTaskMgr_.lock()->OnProcessDied(processData.uid, processData.pid);
88 };
89 handler_.lock()->PostTask(task, TASK_ON_PROCESS_DIED);
90 }
91
OnProcessDiedEfficiencyRes(const AppExecFwk::ProcessData & processData)92 void AppStateObserver::OnProcessDiedEfficiencyRes(const AppExecFwk::ProcessData &processData)
93 {
94 auto bgEfficiencyResourcesMgr = bgEfficiencyResourcesMgr_.lock();
95 if (!bgEfficiencyResourcesMgr) {
96 BGTASK_LOGE("bgEfficiencyResourcesMgr is null");
97 return;
98 }
99 bgEfficiencyResourcesMgr->RemoveProcessRecord(processData.uid, processData.pid, processData.bundleName);
100 }
101
OnApplicationStateChanged(const AppExecFwk::AppStateData & appStateData)102 void AppStateObserver::OnApplicationStateChanged(const AppExecFwk::AppStateData &appStateData)
103 {
104 if (!ValidateAppStateData(appStateData)) {
105 BGTASK_LOGD("%{public}s : validate app state data failed!", __func__);
106 return;
107 }
108 auto uid = appStateData.uid;
109 auto bundleName = appStateData.bundleName;
110 auto state = appStateData.state;
111 if (state == static_cast<int32_t>(AppExecFwk::ApplicationState::APP_STATE_TERMINATED) || state ==
112 static_cast<int32_t>(AppExecFwk::ApplicationState::APP_STATE_END)) {
113 auto bgEfficiencyResourcesMgr = bgEfficiencyResourcesMgr_.lock();
114 if (!bgEfficiencyResourcesMgr) {
115 BGTASK_LOGE("bgEfficiencyResourcesMgr is null");
116 return;
117 }
118 bgEfficiencyResourcesMgr->RemoveAppRecord(uid, bundleName, false);
119 }
120 }
121
ValidateAppStateData(const AppExecFwk::AppStateData & appStateData)122 inline bool AppStateObserver::ValidateAppStateData(const AppExecFwk::AppStateData &appStateData)
123 {
124 return appStateData.uid > 0 && appStateData.bundleName.size() > 0;
125 }
126
SetEventHandler(const std::shared_ptr<AppExecFwk::EventHandler> & handler)127 void AppStateObserver::SetEventHandler(const std::shared_ptr<AppExecFwk::EventHandler> &handler)
128 {
129 handler_ = handler;
130 }
131
SetBgContinuousTaskMgr(const std::shared_ptr<BgContinuousTaskMgr> & bgContinuousTaskMgr)132 void AppStateObserver::SetBgContinuousTaskMgr(const std::shared_ptr<BgContinuousTaskMgr> &bgContinuousTaskMgr)
133 {
134 bgContinuousTaskMgr_ = bgContinuousTaskMgr;
135 }
136
SetBgEfficiencyResourcesMgr(const std::shared_ptr<BgEfficiencyResourcesMgr> & resourceMgr)137 void WEAK_FUNC AppStateObserver::SetBgEfficiencyResourcesMgr(
138 const std::shared_ptr<BgEfficiencyResourcesMgr> &resourceMgr)
139 {
140 bgEfficiencyResourcesMgr_ = resourceMgr;
141 }
142
Subscribe()143 bool WEAK_FUNC AppStateObserver::Subscribe()
144 {
145 std::lock_guard<std::mutex> lock(mutex_);
146
147 if (!Connect()) {
148 return false;
149 }
150 appMgrProxy_->RegisterApplicationStateObserver(iface_cast<AppExecFwk::IApplicationStateObserver>(this));
151 return true;
152 }
153
Unsubscribe()154 bool WEAK_FUNC AppStateObserver::Unsubscribe()
155 {
156 std::lock_guard<std::mutex> lock(mutex_);
157 if (!Connect()) {
158 return false;
159 }
160 appMgrProxy_->UnregisterApplicationStateObserver(iface_cast<AppExecFwk::IApplicationStateObserver>(this));
161 return true;
162 }
163
Connect()164 bool AppStateObserver::Connect()
165 {
166 if (appMgrProxy_ != nullptr) {
167 return true;
168 }
169
170 sptr<ISystemAbilityManager> systemAbilityManager =
171 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
172 if (systemAbilityManager == nullptr) {
173 BGTASK_LOGE("get SystemAbilityManager failed");
174 return false;
175 }
176
177 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(APP_MGR_SERVICE_ID);
178 if (remoteObject == nullptr) {
179 BGTASK_LOGE("get App Manager Service failed");
180 return false;
181 }
182
183 appMgrProxy_ = iface_cast<AppExecFwk::IAppMgr>(remoteObject);
184 if (!appMgrProxy_ || !appMgrProxy_->AsObject()) {
185 BGTASK_LOGE("get app mgr proxy failed!");
186 return false;
187 }
188 return true;
189 }
190 } // namespace BackgroundTaskMgr
191 } // namespace OHOS