xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/UidObserver.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2023, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_MEDIA_UIDOBSERVER_H_
19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_UIDOBSERVER_H_
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <map>
22*ec779b8eSAndroid Build Coastguard Worker #include <set>
23*ec779b8eSAndroid Build Coastguard Worker #include <mutex>
24*ec779b8eSAndroid Build Coastguard Worker #include <functional>
25*ec779b8eSAndroid Build Coastguard Worker #include <binder/ActivityManager.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <binder/IUidObserver.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <binder/BinderService.h>
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker namespace android {
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker using OnProcessTerminated = std::function<void(int32_t pid, uid_t)>;
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoInterface;
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker //
36*ec779b8eSAndroid Build Coastguard Worker // UidObserver class
37*ec779b8eSAndroid Build Coastguard Worker //
38*ec779b8eSAndroid Build Coastguard Worker // This class implements a callback mechanism to notify the termination of the
39*ec779b8eSAndroid Build Coastguard Worker // process/applications that are registered with this class.
40*ec779b8eSAndroid Build Coastguard Worker //
41*ec779b8eSAndroid Build Coastguard Worker // It uses ActivityManager get notification on when an UID is not existent
42*ec779b8eSAndroid Build Coastguard Worker // anymore.
43*ec779b8eSAndroid Build Coastguard Worker // Since one UID could have multiple PIDs, it uses ActivityManager
44*ec779b8eSAndroid Build Coastguard Worker // (through ProcessInfoInterface) to query for the process/application
45*ec779b8eSAndroid Build Coastguard Worker // state for the pids.
46*ec779b8eSAndroid Build Coastguard Worker //
47*ec779b8eSAndroid Build Coastguard Worker class UidObserver :
48*ec779b8eSAndroid Build Coastguard Worker         public BnUidObserver,
49*ec779b8eSAndroid Build Coastguard Worker         public virtual IBinder::DeathRecipient,
50*ec779b8eSAndroid Build Coastguard Worker         public virtual IServiceManager::LocalRegistrationCallback {
51*ec779b8eSAndroid Build Coastguard Worker public:
52*ec779b8eSAndroid Build Coastguard Worker     explicit UidObserver(const sp<ProcessInfoInterface>& processInfo,
53*ec779b8eSAndroid Build Coastguard Worker                          OnProcessTerminated onProcessTerminated);
54*ec779b8eSAndroid Build Coastguard Worker     virtual ~UidObserver();
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker     // Start registration (with Application Manager)
57*ec779b8eSAndroid Build Coastguard Worker     void start();
58*ec779b8eSAndroid Build Coastguard Worker     // Stop registration (with Application Manager)
59*ec779b8eSAndroid Build Coastguard Worker     void stop();
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker     // Add this pid/uid to set of Uid to be observed.
62*ec779b8eSAndroid Build Coastguard Worker     void add(int pid, uid_t uid);
63*ec779b8eSAndroid Build Coastguard Worker 
64*ec779b8eSAndroid Build Coastguard Worker private:
65*ec779b8eSAndroid Build Coastguard Worker     UidObserver() = delete;
66*ec779b8eSAndroid Build Coastguard Worker     UidObserver(const UidObserver&) = delete;
67*ec779b8eSAndroid Build Coastguard Worker     UidObserver(UidObserver&&) = delete;
68*ec779b8eSAndroid Build Coastguard Worker     UidObserver& operator=(const UidObserver&) = delete;
69*ec779b8eSAndroid Build Coastguard Worker     UidObserver& operator=(UidObserver&&) = delete;
70*ec779b8eSAndroid Build Coastguard Worker 
71*ec779b8eSAndroid Build Coastguard Worker     // IUidObserver implementation.
72*ec779b8eSAndroid Build Coastguard Worker     void onUidGone(uid_t uid, bool disabled) override;
73*ec779b8eSAndroid Build Coastguard Worker     void onUidActive(uid_t uid) override;
74*ec779b8eSAndroid Build Coastguard Worker     void onUidIdle(uid_t uid, bool disabled) override;
75*ec779b8eSAndroid Build Coastguard Worker     void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq,
76*ec779b8eSAndroid Build Coastguard Worker             int32_t capability) override;
77*ec779b8eSAndroid Build Coastguard Worker     void onUidProcAdjChanged(uid_t uid, int32_t adj) override;
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker     // IServiceManager::LocalRegistrationCallback implementation.
80*ec779b8eSAndroid Build Coastguard Worker     void onServiceRegistration(const String16& name,
81*ec779b8eSAndroid Build Coastguard Worker                     const sp<IBinder>& binder) override;
82*ec779b8eSAndroid Build Coastguard Worker 
83*ec779b8eSAndroid Build Coastguard Worker     // IBinder::DeathRecipient implementation.
84*ec779b8eSAndroid Build Coastguard Worker     void binderDied(const wp<IBinder> &who) override;
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker     // Registers with Application Manager for UID gone event
87*ec779b8eSAndroid Build Coastguard Worker     // to track the termination of Applications.
88*ec779b8eSAndroid Build Coastguard Worker     void registerWithActivityManager();
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker     /*
91*ec779b8eSAndroid Build Coastguard Worker      * For a list of input pids, it will check whether the corresponding
92*ec779b8eSAndroid Build Coastguard Worker      * processes are already terminated or not.
93*ec779b8eSAndroid Build Coastguard Worker      *
94*ec779b8eSAndroid Build Coastguard Worker      * @param[in] pids List of pids to check whether they are terminated.
95*ec779b8eSAndroid Build Coastguard Worker      * @param[out] terminatedPids List of pid of terminated processes.
96*ec779b8eSAndroid Build Coastguard Worker      *
97*ec779b8eSAndroid Build Coastguard Worker      * Upon return, terminatedPids returns list of all the termibated pids
98*ec779b8eSAndroid Build Coastguard Worker      * that will be a subset of input pids (in that order).
99*ec779b8eSAndroid Build Coastguard Worker      * If none of the input pids have terminated, terminatedPids will be empty.
100*ec779b8eSAndroid Build Coastguard Worker      */
101*ec779b8eSAndroid Build Coastguard Worker     void getTerminatedProcesses(const std::vector<int32_t>& pids,
102*ec779b8eSAndroid Build Coastguard Worker                                 std::vector<int32_t>& terminatedPids);
103*ec779b8eSAndroid Build Coastguard Worker 
104*ec779b8eSAndroid Build Coastguard Worker     bool mRegistered = false;
105*ec779b8eSAndroid Build Coastguard Worker     std::mutex mLock;
106*ec779b8eSAndroid Build Coastguard Worker     ActivityManager mAm;
107*ec779b8eSAndroid Build Coastguard Worker     // map of UID and all the PIDs associated with it
108*ec779b8eSAndroid Build Coastguard Worker     // as one UID could have multiple PIDs.
109*ec779b8eSAndroid Build Coastguard Worker     std::map<uid_t, std::set<int32_t>> mUids;
110*ec779b8eSAndroid Build Coastguard Worker     OnProcessTerminated mOnProcessTerminated;
111*ec779b8eSAndroid Build Coastguard Worker     sp<ProcessInfoInterface> mProcessInfo;
112*ec779b8eSAndroid Build Coastguard Worker };
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker #endif  //ANDROID_MEDIA_UIDOBSERVER_H_
117