• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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_scheduler_host.h"
17 #include "ability_info.h"
18 #include "appexecfwk_errors.h"
19 #include "hitrace_meter.h"
20 #include "hilog_wrapper.h"
21 #include "ipc_types.h"
22 
23 namespace OHOS {
24 namespace AppExecFwk {
AppSchedulerHost()25 AppSchedulerHost::AppSchedulerHost()
26 {
27     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_FOREGROUND_APPLICATION_TRANSACTION)] =
28         &AppSchedulerHost::HandleScheduleForegroundApplication;
29     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_BACKGROUND_APPLICATION_TRANSACTION)] =
30         &AppSchedulerHost::HandleScheduleBackgroundApplication;
31     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_TERMINATE_APPLICATION_TRANSACTION)] =
32         &AppSchedulerHost::HandleScheduleTerminateApplication;
33     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_LOWMEMORY_APPLICATION_TRANSACTION)] =
34         &AppSchedulerHost::HandleScheduleLowMemory;
35     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_SHRINK_MEMORY_APPLICATION_TRANSACTION)] =
36         &AppSchedulerHost::HandleScheduleShrinkMemory;
37     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_MEMORYLEVEL_APPLICATION_TRANSACTION)] =
38         &AppSchedulerHost::HandleScheduleMemoryLevel;
39     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_LAUNCH_ABILITY_TRANSACTION)] =
40         &AppSchedulerHost::HandleScheduleLaunchAbility;
41     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_CLEAN_ABILITY_TRANSACTION)] =
42         &AppSchedulerHost::HandleScheduleCleanAbility;
43     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_LAUNCH_APPLICATION_TRANSACTION)] =
44         &AppSchedulerHost::HandleScheduleLaunchApplication;
45     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_PROFILE_CHANGED_TRANSACTION)] =
46         &AppSchedulerHost::HandleScheduleProfileChanged;
47     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_CONFIGURATION_UPDATED)] =
48         &AppSchedulerHost::HandleScheduleConfigurationUpdated;
49     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_PROCESS_SECURITY_EXIT_TRANSACTION)] =
50         &AppSchedulerHost::HandleScheduleProcessSecurityExit;
51     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_ABILITY_STAGE_INFO)] =
52         &AppSchedulerHost::HandleScheduleAbilityStage;
53     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_ACCEPT_WANT)] =
54         &AppSchedulerHost::HandleScheduleAcceptWant;
55     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NEW_PROCESS_REQUEST)] =
56         &AppSchedulerHost::HandleScheduleNewProcessRequest;
57     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_LOAD_REPAIR_PATCH)] =
58         &AppSchedulerHost::HandleNotifyLoadRepairPatch;
59     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_HOT_RELOAD_PAGE)] =
60         &AppSchedulerHost::HandleNotifyHotReloadPage;
61     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_UNLOAD_REPAIR_PATCH)] =
62         &AppSchedulerHost::HandleNotifyUnLoadRepairPatch;
63     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_UPDATE_APPLICATION_INFO_INSTALLED)] =
64         &AppSchedulerHost::HandleScheduleUpdateApplicationInfoInstalled;
65     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_HEAPMEMORY_APPLICATION_TRANSACTION)] =
66         &AppSchedulerHost::HandleScheduleHeapMemory;
67     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_FAULT)] =
68         &AppSchedulerHost::HandleNotifyAppFault;
69     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::APP_GC_STATE_CHANGE)] =
70         &AppSchedulerHost::HandleScheduleChangeAppGcState;
71     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_ATTACH_APP_DEBUG)] =
72         &AppSchedulerHost::HandleAttachAppDebug;
73     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_DETACH_APP_DEBUG)] =
74         &AppSchedulerHost::HandleDetachAppDebug;
75 }
76 
~AppSchedulerHost()77 AppSchedulerHost::~AppSchedulerHost()
78 {
79     HILOG_INFO("AppSchedulerHost destruction");
80     memberFuncMap_.clear();
81 }
82 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)83 int AppSchedulerHost::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
84 {
85     HILOG_DEBUG("AppSchedulerHost::OnReceived, code = %{public}u, flags= %{public}d.", code, option.GetFlags());
86     std::u16string descriptor = AppSchedulerHost::GetDescriptor();
87     std::u16string remoteDescriptor = data.ReadInterfaceToken();
88     if (descriptor != remoteDescriptor) {
89         HILOG_ERROR("local descriptor is not equal to remote");
90         return ERR_INVALID_STATE;
91     }
92 
93     auto itFunc = memberFuncMap_.find(code);
94     if (itFunc != memberFuncMap_.end()) {
95         auto memberFunc = itFunc->second;
96         if (memberFunc != nullptr) {
97             return (this->*memberFunc)(data, reply);
98         }
99     }
100     HILOG_DEBUG("AppSchedulerHost::OnRemoteRequest end");
101     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
102 }
103 
HandleScheduleForegroundApplication(MessageParcel & data,MessageParcel & reply)104 int32_t AppSchedulerHost::HandleScheduleForegroundApplication(MessageParcel &data, MessageParcel &reply)
105 {
106     HITRACE_METER(HITRACE_TAG_APP);
107     ScheduleForegroundApplication();
108     return NO_ERROR;
109 }
110 
HandleScheduleBackgroundApplication(MessageParcel & data,MessageParcel & reply)111 int32_t AppSchedulerHost::HandleScheduleBackgroundApplication(MessageParcel &data, MessageParcel &reply)
112 {
113     HITRACE_METER(HITRACE_TAG_APP);
114     ScheduleBackgroundApplication();
115     return NO_ERROR;
116 }
117 
HandleScheduleTerminateApplication(MessageParcel & data,MessageParcel & reply)118 int32_t AppSchedulerHost::HandleScheduleTerminateApplication(MessageParcel &data, MessageParcel &reply)
119 {
120     HITRACE_METER(HITRACE_TAG_APP);
121     auto isLastProcess = data.ReadBool();
122     ScheduleTerminateApplication(isLastProcess);
123     return NO_ERROR;
124 }
125 
HandleScheduleLowMemory(MessageParcel & data,MessageParcel & reply)126 int32_t AppSchedulerHost::HandleScheduleLowMemory(MessageParcel &data, MessageParcel &reply)
127 {
128     HITRACE_METER(HITRACE_TAG_APP);
129     ScheduleLowMemory();
130     return NO_ERROR;
131 }
132 
HandleScheduleShrinkMemory(MessageParcel & data,MessageParcel & reply)133 int32_t AppSchedulerHost::HandleScheduleShrinkMemory(MessageParcel &data, MessageParcel &reply)
134 {
135     HITRACE_METER(HITRACE_TAG_APP);
136     ScheduleShrinkMemory(data.ReadInt32());
137     return NO_ERROR;
138 }
139 
HandleScheduleMemoryLevel(MessageParcel & data,MessageParcel & reply)140 int32_t AppSchedulerHost::HandleScheduleMemoryLevel(MessageParcel &data, MessageParcel &reply)
141 {
142     HITRACE_METER(HITRACE_TAG_APP);
143     ScheduleMemoryLevel(data.ReadInt32());
144     return NO_ERROR;
145 }
146 
HandleScheduleHeapMemory(MessageParcel & data,MessageParcel & reply)147 int32_t AppSchedulerHost::HandleScheduleHeapMemory(MessageParcel &data, MessageParcel &reply)
148 {
149     int32_t pid = data.ReadInt32();
150     struct OHOS::AppExecFwk::MallocInfo mallocInfo;
151     ScheduleHeapMemory(pid, mallocInfo);
152     reply.WriteParcelable(&mallocInfo);
153     return NO_ERROR;
154 }
155 
HandleScheduleLaunchAbility(MessageParcel & data,MessageParcel & reply)156 int32_t AppSchedulerHost::HandleScheduleLaunchAbility(MessageParcel &data, MessageParcel &reply)
157 {
158     HITRACE_METER(HITRACE_TAG_APP);
159     std::unique_ptr<AbilityInfo> abilityInfo(data.ReadParcelable<AbilityInfo>());
160     if (!abilityInfo) {
161         HILOG_ERROR("ReadParcelable<AbilityInfo> failed");
162         return ERR_APPEXECFWK_PARCEL_ERROR;
163     }
164 
165     sptr<IRemoteObject> token = nullptr;
166     if (data.ReadBool()) {
167         token = data.ReadRemoteObject();
168     }
169 
170     std::shared_ptr<AAFwk::Want> want(data.ReadParcelable<AAFwk::Want>());
171     ScheduleLaunchAbility(*abilityInfo, token, want);
172     return NO_ERROR;
173 }
174 
HandleScheduleCleanAbility(MessageParcel & data,MessageParcel & reply)175 int32_t AppSchedulerHost::HandleScheduleCleanAbility(MessageParcel &data, MessageParcel &reply)
176 {
177     HITRACE_METER(HITRACE_TAG_APP);
178     sptr<IRemoteObject> token = data.ReadRemoteObject();
179     ScheduleCleanAbility(token);
180     return NO_ERROR;
181 }
182 
HandleScheduleLaunchApplication(MessageParcel & data,MessageParcel & reply)183 int32_t AppSchedulerHost::HandleScheduleLaunchApplication(MessageParcel &data, MessageParcel &reply)
184 {
185     HITRACE_METER(HITRACE_TAG_APP);
186     std::unique_ptr<AppLaunchData> launchData(data.ReadParcelable<AppLaunchData>());
187     std::unique_ptr<Configuration> config(data.ReadParcelable<Configuration>());
188     if (!launchData) {
189         HILOG_ERROR("ReadParcelable<launchData> failed");
190         return ERR_APPEXECFWK_PARCEL_ERROR;
191     }
192     if (!config) {
193         HILOG_ERROR("ReadParcelable<Configuration> failed");
194         return ERR_APPEXECFWK_PARCEL_ERROR;
195     }
196 
197     ScheduleLaunchApplication(*launchData, *config);
198     return NO_ERROR;
199 }
200 
HandleScheduleUpdateApplicationInfoInstalled(MessageParcel & data,MessageParcel & reply)201 int32_t AppSchedulerHost::HandleScheduleUpdateApplicationInfoInstalled(MessageParcel &data, MessageParcel &reply)
202 {
203     HITRACE_METER(HITRACE_TAG_APP);
204     std::unique_ptr<ApplicationInfo> appInfo(data.ReadParcelable<ApplicationInfo>());
205     if (!appInfo) {
206         HILOG_ERROR("ReadParcelable<ApplicationInfo> failed");
207         return ERR_APPEXECFWK_PARCEL_ERROR;
208     }
209 
210     ScheduleUpdateApplicationInfoInstalled(*appInfo);
211     return NO_ERROR;
212 }
213 
HandleScheduleAbilityStage(MessageParcel & data,MessageParcel & reply)214 int32_t AppSchedulerHost::HandleScheduleAbilityStage(MessageParcel &data, MessageParcel &reply)
215 {
216     HITRACE_METER(HITRACE_TAG_APP);
217     std::unique_ptr<HapModuleInfo> abilityStage(data.ReadParcelable<HapModuleInfo>());
218     if (!abilityStage) {
219         HILOG_ERROR("ReadParcelable<launchData> failed");
220         return ERR_APPEXECFWK_PARCEL_ERROR;
221     }
222 
223     ScheduleAbilityStage(*abilityStage);
224     return NO_ERROR;
225 }
226 
HandleScheduleProfileChanged(MessageParcel & data,MessageParcel & reply)227 int32_t AppSchedulerHost::HandleScheduleProfileChanged(MessageParcel &data, MessageParcel &reply)
228 {
229     HITRACE_METER(HITRACE_TAG_APP);
230     std::unique_ptr<Profile> profile(data.ReadParcelable<Profile>());
231     if (!profile) {
232         HILOG_ERROR("ReadParcelable<Profile> failed");
233         return ERR_APPEXECFWK_PARCEL_ERROR;
234     }
235 
236     ScheduleProfileChanged(*profile);
237     return NO_ERROR;
238 }
239 
HandleScheduleConfigurationUpdated(MessageParcel & data,MessageParcel & reply)240 int32_t AppSchedulerHost::HandleScheduleConfigurationUpdated(MessageParcel &data, MessageParcel &reply)
241 {
242     HITRACE_METER(HITRACE_TAG_APP);
243     std::unique_ptr<Configuration> configuration(data.ReadParcelable<Configuration>());
244     if (!configuration) {
245         HILOG_ERROR("ReadParcelable<Configuration> failed");
246         return ERR_APPEXECFWK_PARCEL_ERROR;
247     }
248 
249     ScheduleConfigurationUpdated(*configuration);
250     return NO_ERROR;
251 }
252 
HandleScheduleProcessSecurityExit(MessageParcel & data,MessageParcel & reply)253 int32_t AppSchedulerHost::HandleScheduleProcessSecurityExit(MessageParcel &data, MessageParcel &reply)
254 {
255     HITRACE_METER(HITRACE_TAG_APP);
256     ScheduleProcessSecurityExit();
257     return NO_ERROR;
258 }
259 
HandleScheduleAcceptWant(MessageParcel & data,MessageParcel & reply)260 int32_t AppSchedulerHost::HandleScheduleAcceptWant(MessageParcel &data, MessageParcel &reply)
261 {
262     HITRACE_METER(HITRACE_TAG_APP);
263     AAFwk::Want *want = data.ReadParcelable<AAFwk::Want>();
264     if (want == nullptr) {
265         HILOG_ERROR("want is nullptr");
266         return ERR_INVALID_VALUE;
267     }
268     auto moduleName = data.ReadString();
269     ScheduleAcceptWant(*want, moduleName);
270     delete want;
271     return NO_ERROR;
272 }
273 
HandleScheduleNewProcessRequest(MessageParcel & data,MessageParcel & reply)274 int32_t AppSchedulerHost::HandleScheduleNewProcessRequest(MessageParcel &data, MessageParcel &reply)
275 {
276     HILOG_DEBUG("call.");
277     HITRACE_METER(HITRACE_TAG_APP);
278     AAFwk::Want *want = data.ReadParcelable<AAFwk::Want>();
279     if (want == nullptr) {
280         HILOG_ERROR("want is nullptr");
281         return ERR_INVALID_VALUE;
282     }
283     auto moduleName = data.ReadString();
284     ScheduleNewProcessRequest(*want, moduleName);
285     delete want;
286     return NO_ERROR;
287 }
288 
HandleNotifyLoadRepairPatch(MessageParcel & data,MessageParcel & reply)289 int32_t AppSchedulerHost::HandleNotifyLoadRepairPatch(MessageParcel &data, MessageParcel &reply)
290 {
291     HITRACE_METER(HITRACE_TAG_APP);
292     std::string bundleName = data.ReadString();
293     auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
294     auto recordId = data.ReadInt32();
295     ScheduleNotifyLoadRepairPatch(bundleName, callback, recordId);
296     return NO_ERROR;
297 }
298 
HandleNotifyHotReloadPage(MessageParcel & data,MessageParcel & reply)299 int32_t AppSchedulerHost::HandleNotifyHotReloadPage(MessageParcel &data, MessageParcel &reply)
300 {
301     HITRACE_METER(HITRACE_TAG_APP);
302     auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
303     auto recordId = data.ReadInt32();
304     ScheduleNotifyHotReloadPage(callback, recordId);
305     return NO_ERROR;
306 }
307 
HandleNotifyUnLoadRepairPatch(MessageParcel & data,MessageParcel & reply)308 int32_t AppSchedulerHost::HandleNotifyUnLoadRepairPatch(MessageParcel &data, MessageParcel &reply)
309 {
310     HITRACE_METER(HITRACE_TAG_APP);
311     std::string bundleName = data.ReadString();
312     auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
313     auto recordId = data.ReadInt32();
314     ScheduleNotifyUnLoadRepairPatch(bundleName, callback, recordId);
315     return NO_ERROR;
316 }
317 
HandleNotifyAppFault(MessageParcel & data,MessageParcel & reply)318 int32_t AppSchedulerHost::HandleNotifyAppFault(MessageParcel &data, MessageParcel &reply)
319 {
320     std::unique_ptr<FaultData> faultData(data.ReadParcelable<FaultData>());
321     if (faultData == nullptr) {
322         HILOG_ERROR("ReadParcelable<FaultData> failed");
323         return ERR_INVALID_VALUE;
324     }
325 
326     int32_t result = ScheduleNotifyAppFault(*faultData);
327     if (!reply.WriteInt32(result)) {
328         HILOG_ERROR("reply write failed.");
329         return ERR_INVALID_VALUE;
330     }
331     return NO_ERROR;
332 }
333 
HandleScheduleChangeAppGcState(MessageParcel & data,MessageParcel & reply)334 int32_t AppSchedulerHost::HandleScheduleChangeAppGcState(MessageParcel &data, MessageParcel &reply)
335 {
336     int32_t state = data.ReadInt32();
337     int32_t result = ScheduleChangeAppGcState(state);
338     if (!reply.WriteInt32(result)) {
339         HILOG_ERROR("reply write failed.");
340         return ERR_INVALID_VALUE;
341     }
342     return NO_ERROR;
343 }
344 
HandleAttachAppDebug(MessageParcel & data,MessageParcel & reply)345 int32_t AppSchedulerHost::HandleAttachAppDebug(MessageParcel &data, MessageParcel &reply)
346 {
347     HITRACE_METER(HITRACE_TAG_APP);
348     AttachAppDebug();
349     return NO_ERROR;
350 }
351 
HandleDetachAppDebug(MessageParcel & data,MessageParcel & reply)352 int32_t AppSchedulerHost::HandleDetachAppDebug(MessageParcel &data, MessageParcel &reply)
353 {
354     HITRACE_METER(HITRACE_TAG_APP);
355     DetachAppDebug();
356     return NO_ERROR;
357 }
358 }  // namespace AppExecFwk
359 }  // namespace OHOS
360