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