• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #ifndef FOUNDATION_APPEXECFWK_SERVICES_APPMGR_INCLUDE_PROCESS_OPTIMIZER_H
17 #define FOUNDATION_APPEXECFWK_SERVICES_APPMGR_INCLUDE_PROCESS_OPTIMIZER_H
18 
19 #include <functional>
20 #include <list>
21 #include <memory>
22 #include <set>
23 #include <string>
24 
25 #include "ability_running_record.h"
26 #include "app_running_record.h"
27 #include "cgroup_manager.h"
28 #include "lmks_client.h"
29 #include "event_handler.h"
30 #include "nocopyable.h"
31 
32 namespace OHOS {
33 namespace AppExecFwk {
34 class ProcessOptimizer : public NoCopyable {
35 public:
36     using EventHandlerPtr = std::shared_ptr<EventHandler>;
37     using AppPtr = std::shared_ptr<AppRunningRecord>;
38     using AbilityPtr = std::shared_ptr<AbilityRunningRecord>;
39     using CgroupManagerPtr = std::shared_ptr<CgroupManager>;
40     using LmksClientPtr = std::shared_ptr<LmksClient>;
41 
42     static constexpr int APP_SUSPEND_TIMEOUT_DEFAULT = 5000;   // in milliseconds
43     static constexpr int APP_SUSPEND_TIMEOUT_MAX = 30 * 1000;  // in milliseconds
44 
45 public:
46     ProcessOptimizer(const LmksClientPtr &lmksClient = nullptr, int suspendTimeout = APP_SUSPEND_TIMEOUT_DEFAULT);
47 
48     virtual ~ProcessOptimizer();
49 
50 public:
51     // callbacks
52     std::function<void(AppPtr)> AppSuspended;
53     std::function<void(AppPtr)> AppResumed;
54     std::function<void(AppPtr, CgroupManager::LowMemoryLevel)> AppLowMemoryAlert;
55     std::function<AppPtr(AbilityPtr)> GetAbilityOwnerApp;
56 
57 public:
58     virtual bool Init();
59     virtual void OnAppAdded(const AppPtr &app);
60     virtual void OnAppRemoved(const AppPtr &app);
61     virtual void OnAppStateChanged(const AppPtr &app, const ApplicationState oldState);
62     virtual void OnAbilityStarted(const AbilityPtr &ability);
63     virtual void OnAbilityConnected(const AbilityPtr &ability, const AbilityPtr &targetAbility);
64     virtual void OnAbilityDisconnected(const AbilityPtr &ability, const AbilityPtr &targetAbility);
65     virtual void OnAbilityStateChanged(const AbilityPtr &ability, const AbilityState oldState);
66     virtual void OnAbilityVisibleChanged(const AbilityPtr &ability);
67     virtual void OnAbilityPerceptibleChanged(const AbilityPtr &ability);
68     virtual void OnAbilityRemoved(const AbilityPtr &ability);
69     virtual void SetAppFreezingTime(int time);
70     virtual void GetAppFreezingTime(int &time);
71 
72 protected:
73     bool SetAppOomAdj(const AppPtr &app, int oomAdj);
74     bool SetAppSchedPolicy(const AppPtr &app, const CgroupManager::SchedPolicy schedPolicy);
75     virtual void OnLowMemoryAlert(const CgroupManager::LowMemoryLevel level);
76 
77 private:
78     bool UpdateAppOomAdj(const AppPtr &app);
79     bool GetAppOomAdj(const AppPtr &app,ApplicationState state,int &oomAdj,int &oomAdjMax);
80     bool UpdateAppSchedPolicy(const AppPtr &app);
81     void StartAppSuspendTimer(const AppPtr &app);
82     void StopAppSuspendTimer(const AppPtr &app);
83     void SuspendApp(const AppPtr &app);
84     std::string GetAppSuspendTimerName(const AppPtr &app);
85 
86 private:
87     using AppLru = std::list<AppPtr>;
88     using SuspendTimers = std::set<std::string>;
89 
90     LmksClientPtr lmksClient_;
91     AppLru appLru_;
92     EventHandlerPtr eventHandler_;
93     SuspendTimers suspendTimers_;
94     int suspendTimeout_;
95 };
96 }  // namespace AppExecFwk
97 }  // namespace OHOS
98 
99 #endif  // FOUNDATION_APPEXECFWK_SERVICES_APPMGR_INCLUDE_PROCESS_OPTIMIZER_H
100