• 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_NOTIFY_LOAD_REPAIR_PATCH)] =
56         &AppSchedulerHost::HandleNotifyLoadRepairPatch;
57     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_HOT_RELOAD_PAGE)] =
58         &AppSchedulerHost::HandleNotifyHotReloadPage;
59     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_UNLOAD_REPAIR_PATCH)] =
60         &AppSchedulerHost::HandleNotifyUnLoadRepairPatch;
61     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_UPDATE_APPLICATION_INFO_INSTALLED)] =
62         &AppSchedulerHost::HandleScheduleUpdateApplicationInfoInstalled;
63     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_HEAPMEMORY_APPLICATION_TRANSACTION)] =
64         &AppSchedulerHost::HandleScheduleHeapMemory;
65     memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_FAULT)] =
66         &AppSchedulerHost::HandleNotifyAppFault;
67 }
68 
~AppSchedulerHost()69 AppSchedulerHost::~AppSchedulerHost()
70 {
71     memberFuncMap_.clear();
72 }
73 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)74 int AppSchedulerHost::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
75 {
76     HILOG_DEBUG("AppSchedulerHost::OnReceived, code = %{public}u, flags= %{public}d.", code, option.GetFlags());
77     std::u16string descriptor = AppSchedulerHost::GetDescriptor();
78     std::u16string remoteDescriptor = data.ReadInterfaceToken();
79     if (descriptor != remoteDescriptor) {
80         HILOG_ERROR("local descriptor is not equal to remote");
81         return ERR_INVALID_STATE;
82     }
83 
84     auto itFunc = memberFuncMap_.find(code);
85     if (itFunc != memberFuncMap_.end()) {
86         auto memberFunc = itFunc->second;
87         if (memberFunc != nullptr) {
88             return (this->*memberFunc)(data, reply);
89         }
90     }
91     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
92 }
93 
HandleScheduleForegroundApplication(MessageParcel & data,MessageParcel & reply)94 int32_t AppSchedulerHost::HandleScheduleForegroundApplication(MessageParcel &data, MessageParcel &reply)
95 {
96     HITRACE_METER(HITRACE_TAG_APP);
97     ScheduleForegroundApplication();
98     return NO_ERROR;
99 }
100 
HandleScheduleBackgroundApplication(MessageParcel & data,MessageParcel & reply)101 int32_t AppSchedulerHost::HandleScheduleBackgroundApplication(MessageParcel &data, MessageParcel &reply)
102 {
103     HITRACE_METER(HITRACE_TAG_APP);
104     ScheduleBackgroundApplication();
105     return NO_ERROR;
106 }
107 
HandleScheduleTerminateApplication(MessageParcel & data,MessageParcel & reply)108 int32_t AppSchedulerHost::HandleScheduleTerminateApplication(MessageParcel &data, MessageParcel &reply)
109 {
110     HITRACE_METER(HITRACE_TAG_APP);
111     ScheduleTerminateApplication();
112     return NO_ERROR;
113 }
114 
HandleScheduleLowMemory(MessageParcel & data,MessageParcel & reply)115 int32_t AppSchedulerHost::HandleScheduleLowMemory(MessageParcel &data, MessageParcel &reply)
116 {
117     HITRACE_METER(HITRACE_TAG_APP);
118     ScheduleLowMemory();
119     return NO_ERROR;
120 }
121 
HandleScheduleShrinkMemory(MessageParcel & data,MessageParcel & reply)122 int32_t AppSchedulerHost::HandleScheduleShrinkMemory(MessageParcel &data, MessageParcel &reply)
123 {
124     HITRACE_METER(HITRACE_TAG_APP);
125     ScheduleShrinkMemory(data.ReadInt32());
126     return NO_ERROR;
127 }
128 
HandleScheduleMemoryLevel(MessageParcel & data,MessageParcel & reply)129 int32_t AppSchedulerHost::HandleScheduleMemoryLevel(MessageParcel &data, MessageParcel &reply)
130 {
131     HITRACE_METER(HITRACE_TAG_APP);
132     ScheduleMemoryLevel(data.ReadInt32());
133     return NO_ERROR;
134 }
135 
HandleScheduleHeapMemory(MessageParcel & data,MessageParcel & reply)136 int32_t AppSchedulerHost::HandleScheduleHeapMemory(MessageParcel &data, MessageParcel &reply)
137 {
138     int32_t pid = data.ReadInt32();
139     struct OHOS::AppExecFwk::MallocInfo mallocInfo;
140     ScheduleHeapMemory(pid, mallocInfo);
141     reply.WriteParcelable(&mallocInfo);
142     return NO_ERROR;
143 }
144 
HandleScheduleLaunchAbility(MessageParcel & data,MessageParcel & reply)145 int32_t AppSchedulerHost::HandleScheduleLaunchAbility(MessageParcel &data, MessageParcel &reply)
146 {
147     HITRACE_METER(HITRACE_TAG_APP);
148     std::unique_ptr<AbilityInfo> abilityInfo(data.ReadParcelable<AbilityInfo>());
149     if (!abilityInfo) {
150         HILOG_ERROR("ReadParcelable<AbilityInfo> failed");
151         return ERR_APPEXECFWK_PARCEL_ERROR;
152     }
153 
154     sptr<IRemoteObject> token = nullptr;
155     if (data.ReadBool()) {
156         token = data.ReadRemoteObject();
157     }
158 
159     std::shared_ptr<AAFwk::Want> want(data.ReadParcelable<AAFwk::Want>());
160     ScheduleLaunchAbility(*abilityInfo, token, want);
161     return NO_ERROR;
162 }
163 
HandleScheduleCleanAbility(MessageParcel & data,MessageParcel & reply)164 int32_t AppSchedulerHost::HandleScheduleCleanAbility(MessageParcel &data, MessageParcel &reply)
165 {
166     HITRACE_METER(HITRACE_TAG_APP);
167     sptr<IRemoteObject> token = data.ReadRemoteObject();
168     ScheduleCleanAbility(token);
169     return NO_ERROR;
170 }
171 
HandleScheduleLaunchApplication(MessageParcel & data,MessageParcel & reply)172 int32_t AppSchedulerHost::HandleScheduleLaunchApplication(MessageParcel &data, MessageParcel &reply)
173 {
174     HITRACE_METER(HITRACE_TAG_APP);
175     std::unique_ptr<AppLaunchData> launchData(data.ReadParcelable<AppLaunchData>());
176     std::unique_ptr<Configuration> config(data.ReadParcelable<Configuration>());
177     if (!launchData) {
178         HILOG_ERROR("ReadParcelable<launchData> failed");
179         return ERR_APPEXECFWK_PARCEL_ERROR;
180     }
181     if (!config) {
182         HILOG_ERROR("ReadParcelable<Configuration> failed");
183         return ERR_APPEXECFWK_PARCEL_ERROR;
184     }
185 
186     ScheduleLaunchApplication(*launchData, *config);
187     return NO_ERROR;
188 }
189 
HandleScheduleUpdateApplicationInfoInstalled(MessageParcel & data,MessageParcel & reply)190 int32_t AppSchedulerHost::HandleScheduleUpdateApplicationInfoInstalled(MessageParcel &data, MessageParcel &reply)
191 {
192     HITRACE_METER(HITRACE_TAG_APP);
193     std::unique_ptr<ApplicationInfo> appInfo(data.ReadParcelable<ApplicationInfo>());
194     if (!appInfo) {
195         HILOG_ERROR("ReadParcelable<ApplicationInfo> failed");
196         return ERR_APPEXECFWK_PARCEL_ERROR;
197     }
198 
199     ScheduleUpdateApplicationInfoInstalled(*appInfo);
200     return NO_ERROR;
201 }
202 
HandleScheduleAbilityStage(MessageParcel & data,MessageParcel & reply)203 int32_t AppSchedulerHost::HandleScheduleAbilityStage(MessageParcel &data, MessageParcel &reply)
204 {
205     HITRACE_METER(HITRACE_TAG_APP);
206     std::unique_ptr<HapModuleInfo> abilityStage(data.ReadParcelable<HapModuleInfo>());
207     if (!abilityStage) {
208         HILOG_ERROR("ReadParcelable<launchData> failed");
209         return ERR_APPEXECFWK_PARCEL_ERROR;
210     }
211 
212     ScheduleAbilityStage(*abilityStage);
213     return NO_ERROR;
214 }
215 
HandleScheduleProfileChanged(MessageParcel & data,MessageParcel & reply)216 int32_t AppSchedulerHost::HandleScheduleProfileChanged(MessageParcel &data, MessageParcel &reply)
217 {
218     HITRACE_METER(HITRACE_TAG_APP);
219     std::unique_ptr<Profile> profile(data.ReadParcelable<Profile>());
220     if (!profile) {
221         HILOG_ERROR("ReadParcelable<Profile> failed");
222         return ERR_APPEXECFWK_PARCEL_ERROR;
223     }
224 
225     ScheduleProfileChanged(*profile);
226     return NO_ERROR;
227 }
228 
HandleScheduleConfigurationUpdated(MessageParcel & data,MessageParcel & reply)229 int32_t AppSchedulerHost::HandleScheduleConfigurationUpdated(MessageParcel &data, MessageParcel &reply)
230 {
231     HITRACE_METER(HITRACE_TAG_APP);
232     std::unique_ptr<Configuration> configuration(data.ReadParcelable<Configuration>());
233     if (!configuration) {
234         HILOG_ERROR("ReadParcelable<Configuration> failed");
235         return ERR_APPEXECFWK_PARCEL_ERROR;
236     }
237 
238     ScheduleConfigurationUpdated(*configuration);
239     return NO_ERROR;
240 }
241 
HandleScheduleProcessSecurityExit(MessageParcel & data,MessageParcel & reply)242 int32_t AppSchedulerHost::HandleScheduleProcessSecurityExit(MessageParcel &data, MessageParcel &reply)
243 {
244     HITRACE_METER(HITRACE_TAG_APP);
245     ScheduleProcessSecurityExit();
246     return NO_ERROR;
247 }
248 
HandleScheduleAcceptWant(MessageParcel & data,MessageParcel & reply)249 int32_t AppSchedulerHost::HandleScheduleAcceptWant(MessageParcel &data, MessageParcel &reply)
250 {
251     HITRACE_METER(HITRACE_TAG_APP);
252     AAFwk::Want *want = data.ReadParcelable<AAFwk::Want>();
253     if (want == nullptr) {
254         HILOG_ERROR("want is nullptr");
255         return ERR_INVALID_VALUE;
256     }
257     auto moduleName = data.ReadString();
258     ScheduleAcceptWant(*want, moduleName);
259     delete want;
260     return NO_ERROR;
261 }
262 
HandleNotifyLoadRepairPatch(MessageParcel & data,MessageParcel & reply)263 int32_t AppSchedulerHost::HandleNotifyLoadRepairPatch(MessageParcel &data, MessageParcel &reply)
264 {
265     HITRACE_METER(HITRACE_TAG_APP);
266     std::string bundleName = data.ReadString();
267     auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
268     auto recordId = data.ReadInt32();
269     ScheduleNotifyLoadRepairPatch(bundleName, callback, recordId);
270     return NO_ERROR;
271 }
272 
HandleNotifyHotReloadPage(MessageParcel & data,MessageParcel & reply)273 int32_t AppSchedulerHost::HandleNotifyHotReloadPage(MessageParcel &data, MessageParcel &reply)
274 {
275     HITRACE_METER(HITRACE_TAG_APP);
276     auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
277     auto recordId = data.ReadInt32();
278     ScheduleNotifyHotReloadPage(callback, recordId);
279     return NO_ERROR;
280 }
281 
HandleNotifyUnLoadRepairPatch(MessageParcel & data,MessageParcel & reply)282 int32_t AppSchedulerHost::HandleNotifyUnLoadRepairPatch(MessageParcel &data, MessageParcel &reply)
283 {
284     HITRACE_METER(HITRACE_TAG_APP);
285     std::string bundleName = data.ReadString();
286     auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
287     auto recordId = data.ReadInt32();
288     ScheduleNotifyUnLoadRepairPatch(bundleName, callback, recordId);
289     return NO_ERROR;
290 }
291 
HandleNotifyAppFault(MessageParcel & data,MessageParcel & reply)292 int32_t AppSchedulerHost::HandleNotifyAppFault(MessageParcel &data, MessageParcel &reply)
293 {
294     std::unique_ptr<FaultData> faultData(data.ReadParcelable<FaultData>());
295     if (faultData == nullptr) {
296         HILOG_ERROR("ReadParcelable<FaultData> failed");
297         return ERR_INVALID_VALUE;
298     }
299 
300     int32_t result = ScheduleNotifyAppFault(*faultData);
301     if (!reply.WriteInt32(result)) {
302         HILOG_ERROR("reply write failed.");
303         return ERR_INVALID_VALUE;
304     }
305     return NO_ERROR;
306 }
307 }  // namespace AppExecFwk
308 }  // namespace OHOS
309