xref: /aosp_15_r20/frameworks/native/libs/binder/ActivityManager.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
18*38e8c45fSAndroid Build Coastguard Worker #include <unistd.h>
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <android/permission_manager.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/ActivityManager.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/Binder.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker namespace android {
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker using namespace std::chrono_literals;
29*38e8c45fSAndroid Build Coastguard Worker 
ActivityManager()30*38e8c45fSAndroid Build Coastguard Worker ActivityManager::ActivityManager()
31*38e8c45fSAndroid Build Coastguard Worker {
32*38e8c45fSAndroid Build Coastguard Worker }
33*38e8c45fSAndroid Build Coastguard Worker 
getService()34*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> ActivityManager::getService()
35*38e8c45fSAndroid Build Coastguard Worker {
36*38e8c45fSAndroid Build Coastguard Worker     std::lock_guard<Mutex> scoped_lock(mLock);
37*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = mService;
38*38e8c45fSAndroid Build Coastguard Worker     if (ProcessState::self()->isThreadPoolStarted()) {
39*38e8c45fSAndroid Build Coastguard Worker         if (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) {
40*38e8c45fSAndroid Build Coastguard Worker             sp<IBinder> binder = defaultServiceManager()->waitForService(String16("activity"));
41*38e8c45fSAndroid Build Coastguard Worker             service = interface_cast<IActivityManager>(binder);
42*38e8c45fSAndroid Build Coastguard Worker             mService = service;
43*38e8c45fSAndroid Build Coastguard Worker         }
44*38e8c45fSAndroid Build Coastguard Worker     } else {
45*38e8c45fSAndroid Build Coastguard Worker         ALOGI("Thread pool not started. Polling for activity service.");
46*38e8c45fSAndroid Build Coastguard Worker         auto startTime = std::chrono::steady_clock::now().min();
47*38e8c45fSAndroid Build Coastguard Worker         while (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) {
48*38e8c45fSAndroid Build Coastguard Worker             sp<IBinder> binder = defaultServiceManager()->checkService(String16("activity"));
49*38e8c45fSAndroid Build Coastguard Worker             if (binder == nullptr) {
50*38e8c45fSAndroid Build Coastguard Worker                 // Wait for the activity service to come back...
51*38e8c45fSAndroid Build Coastguard Worker                 if (startTime == startTime.min()) {
52*38e8c45fSAndroid Build Coastguard Worker                     startTime = std::chrono::steady_clock::now();
53*38e8c45fSAndroid Build Coastguard Worker                     ALOGI("Waiting for activity service");
54*38e8c45fSAndroid Build Coastguard Worker                 } else if (std::chrono::steady_clock::now() - startTime > 1000s) {
55*38e8c45fSAndroid Build Coastguard Worker                     // TODO(b/342453147): timeout of 1000s = 16min and 40s doesn't seem intended
56*38e8c45fSAndroid Build Coastguard Worker                     ALOGW("Waiting too long for activity service, giving up");
57*38e8c45fSAndroid Build Coastguard Worker                     service = nullptr;
58*38e8c45fSAndroid Build Coastguard Worker                     break;
59*38e8c45fSAndroid Build Coastguard Worker                 }
60*38e8c45fSAndroid Build Coastguard Worker                 usleep(25000);
61*38e8c45fSAndroid Build Coastguard Worker             } else {
62*38e8c45fSAndroid Build Coastguard Worker                 service = interface_cast<IActivityManager>(binder);
63*38e8c45fSAndroid Build Coastguard Worker                 mService = service;
64*38e8c45fSAndroid Build Coastguard Worker             }
65*38e8c45fSAndroid Build Coastguard Worker         }
66*38e8c45fSAndroid Build Coastguard Worker     }
67*38e8c45fSAndroid Build Coastguard Worker     return mService;
68*38e8c45fSAndroid Build Coastguard Worker }
69*38e8c45fSAndroid Build Coastguard Worker 
openContentUri(const String16 & stringUri)70*38e8c45fSAndroid Build Coastguard Worker int ActivityManager::openContentUri(const String16& stringUri)
71*38e8c45fSAndroid Build Coastguard Worker {
72*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
73*38e8c45fSAndroid Build Coastguard Worker     return service != nullptr ? service->openContentUri(stringUri) : -1;
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker 
registerUidObserver(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage)76*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::registerUidObserver(const sp<IUidObserver>& observer,
77*38e8c45fSAndroid Build Coastguard Worker                                           const int32_t event,
78*38e8c45fSAndroid Build Coastguard Worker                                           const int32_t cutpoint,
79*38e8c45fSAndroid Build Coastguard Worker                                           const String16& callingPackage)
80*38e8c45fSAndroid Build Coastguard Worker {
81*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
82*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
83*38e8c45fSAndroid Build Coastguard Worker         return service->registerUidObserver(observer, event, cutpoint, callingPackage);
84*38e8c45fSAndroid Build Coastguard Worker     }
85*38e8c45fSAndroid Build Coastguard Worker     // ActivityManagerService appears dead. Return usual error code for dead service.
86*38e8c45fSAndroid Build Coastguard Worker     return DEAD_OBJECT;
87*38e8c45fSAndroid Build Coastguard Worker }
88*38e8c45fSAndroid Build Coastguard Worker 
registerUidObserverForUids(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage,const int32_t uids[],size_t nUids,sp<IBinder> & observerToken)89*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::registerUidObserverForUids(const sp<IUidObserver>& observer,
90*38e8c45fSAndroid Build Coastguard Worker                                                      const int32_t event, const int32_t cutpoint,
91*38e8c45fSAndroid Build Coastguard Worker                                                      const String16& callingPackage,
92*38e8c45fSAndroid Build Coastguard Worker                                                      const int32_t uids[], size_t nUids,
93*38e8c45fSAndroid Build Coastguard Worker                                                      /*out*/ sp<IBinder>& observerToken) {
94*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
95*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
96*38e8c45fSAndroid Build Coastguard Worker         return service->registerUidObserverForUids(observer, event, cutpoint, callingPackage, uids,
97*38e8c45fSAndroid Build Coastguard Worker                                                    nUids, observerToken);
98*38e8c45fSAndroid Build Coastguard Worker     }
99*38e8c45fSAndroid Build Coastguard Worker     // ActivityManagerService appears dead. Return usual error code for dead service.
100*38e8c45fSAndroid Build Coastguard Worker     return DEAD_OBJECT;
101*38e8c45fSAndroid Build Coastguard Worker }
102*38e8c45fSAndroid Build Coastguard Worker 
unregisterUidObserver(const sp<IUidObserver> & observer)103*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::unregisterUidObserver(const sp<IUidObserver>& observer)
104*38e8c45fSAndroid Build Coastguard Worker {
105*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
106*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
107*38e8c45fSAndroid Build Coastguard Worker         return service->unregisterUidObserver(observer);
108*38e8c45fSAndroid Build Coastguard Worker     }
109*38e8c45fSAndroid Build Coastguard Worker     // ActivityManagerService appears dead. Return usual error code for dead service.
110*38e8c45fSAndroid Build Coastguard Worker     return DEAD_OBJECT;
111*38e8c45fSAndroid Build Coastguard Worker }
112*38e8c45fSAndroid Build Coastguard Worker 
addUidToObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)113*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::addUidToObserver(const sp<IBinder>& observerToken,
114*38e8c45fSAndroid Build Coastguard Worker                                            const String16& callingPackage, int32_t uid) {
115*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
116*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
117*38e8c45fSAndroid Build Coastguard Worker         return service->addUidToObserver(observerToken, callingPackage, uid);
118*38e8c45fSAndroid Build Coastguard Worker     }
119*38e8c45fSAndroid Build Coastguard Worker     // ActivityManagerService appears dead. Return usual error code for dead service.
120*38e8c45fSAndroid Build Coastguard Worker     return DEAD_OBJECT;
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker 
removeUidFromObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)123*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::removeUidFromObserver(const sp<IBinder>& observerToken,
124*38e8c45fSAndroid Build Coastguard Worker                                                 const String16& callingPackage, int32_t uid) {
125*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
126*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
127*38e8c45fSAndroid Build Coastguard Worker         return service->removeUidFromObserver(observerToken, callingPackage, uid);
128*38e8c45fSAndroid Build Coastguard Worker     }
129*38e8c45fSAndroid Build Coastguard Worker     // ActivityManagerService appears dead. Return usual error code for dead service.
130*38e8c45fSAndroid Build Coastguard Worker     return DEAD_OBJECT;
131*38e8c45fSAndroid Build Coastguard Worker }
132*38e8c45fSAndroid Build Coastguard Worker 
isUidActive(const uid_t uid,const String16 & callingPackage)133*38e8c45fSAndroid Build Coastguard Worker bool ActivityManager::isUidActive(const uid_t uid, const String16& callingPackage)
134*38e8c45fSAndroid Build Coastguard Worker {
135*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
136*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
137*38e8c45fSAndroid Build Coastguard Worker         return service->isUidActive(uid, callingPackage);
138*38e8c45fSAndroid Build Coastguard Worker     }
139*38e8c45fSAndroid Build Coastguard Worker     return false;
140*38e8c45fSAndroid Build Coastguard Worker }
141*38e8c45fSAndroid Build Coastguard Worker 
getUidProcessState(const uid_t uid,const String16 & callingPackage)142*38e8c45fSAndroid Build Coastguard Worker int32_t ActivityManager::getUidProcessState(const uid_t uid, const String16& callingPackage)
143*38e8c45fSAndroid Build Coastguard Worker {
144*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
145*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
146*38e8c45fSAndroid Build Coastguard Worker         return service->getUidProcessState(uid, callingPackage);
147*38e8c45fSAndroid Build Coastguard Worker     }
148*38e8c45fSAndroid Build Coastguard Worker     return PROCESS_STATE_UNKNOWN;
149*38e8c45fSAndroid Build Coastguard Worker }
150*38e8c45fSAndroid Build Coastguard Worker 
checkPermission(const String16 & permission,const pid_t pid,const uid_t uid,int32_t * outResult)151*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::checkPermission(const String16& permission,
152*38e8c45fSAndroid Build Coastguard Worker                                      const pid_t pid,
153*38e8c45fSAndroid Build Coastguard Worker                                      const uid_t uid,
154*38e8c45fSAndroid Build Coastguard Worker                                      int32_t* outResult) {
155*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
156*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
157*38e8c45fSAndroid Build Coastguard Worker         return service->checkPermission(permission, pid, uid, outResult);
158*38e8c45fSAndroid Build Coastguard Worker     }
159*38e8c45fSAndroid Build Coastguard Worker     // ActivityManagerService appears dead. Return usual error code for dead service.
160*38e8c45fSAndroid Build Coastguard Worker     return DEAD_OBJECT;
161*38e8c45fSAndroid Build Coastguard Worker }
162*38e8c45fSAndroid Build Coastguard Worker 
linkToDeath(const sp<IBinder::DeathRecipient> & recipient)163*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::linkToDeath(const sp<IBinder::DeathRecipient>& recipient) {
164*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
165*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
166*38e8c45fSAndroid Build Coastguard Worker         return IInterface::asBinder(service)->linkToDeath(recipient);
167*38e8c45fSAndroid Build Coastguard Worker     }
168*38e8c45fSAndroid Build Coastguard Worker     return INVALID_OPERATION;
169*38e8c45fSAndroid Build Coastguard Worker }
170*38e8c45fSAndroid Build Coastguard Worker 
unlinkToDeath(const sp<IBinder::DeathRecipient> & recipient)171*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::unlinkToDeath(const sp<IBinder::DeathRecipient>& recipient) {
172*38e8c45fSAndroid Build Coastguard Worker     sp<IActivityManager> service = getService();
173*38e8c45fSAndroid Build Coastguard Worker     if (service != nullptr) {
174*38e8c45fSAndroid Build Coastguard Worker         return IInterface::asBinder(service)->unlinkToDeath(recipient);
175*38e8c45fSAndroid Build Coastguard Worker     }
176*38e8c45fSAndroid Build Coastguard Worker     return INVALID_OPERATION;
177*38e8c45fSAndroid Build Coastguard Worker }
178*38e8c45fSAndroid Build Coastguard Worker 
179*38e8c45fSAndroid Build Coastguard Worker } // namespace android
180