xref: /aosp_15_r20/frameworks/native/libs/binder/IActivityManager.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2016 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 <unistd.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <fcntl.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/IActivityManager.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h>
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker namespace android {
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker // ------------------------------------------------------------------------------------
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker class BpActivityManager : public BpInterface<IActivityManager>
31*38e8c45fSAndroid Build Coastguard Worker {
32*38e8c45fSAndroid Build Coastguard Worker public:
BpActivityManager(const sp<IBinder> & impl)33*38e8c45fSAndroid Build Coastguard Worker     explicit BpActivityManager(const sp<IBinder>& impl)
34*38e8c45fSAndroid Build Coastguard Worker         : BpInterface<IActivityManager>(impl)
35*38e8c45fSAndroid Build Coastguard Worker     {
36*38e8c45fSAndroid Build Coastguard Worker     }
37*38e8c45fSAndroid Build Coastguard Worker 
openContentUri(const String16 & stringUri)38*38e8c45fSAndroid Build Coastguard Worker     virtual int openContentUri(const String16& stringUri)
39*38e8c45fSAndroid Build Coastguard Worker     {
40*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
41*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
42*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(stringUri);
43*38e8c45fSAndroid Build Coastguard Worker         status_t ret = remote()->transact(OPEN_CONTENT_URI_TRANSACTION, data, & reply);
44*38e8c45fSAndroid Build Coastguard Worker         int fd = -1;
45*38e8c45fSAndroid Build Coastguard Worker         if (ret == NO_ERROR) {
46*38e8c45fSAndroid Build Coastguard Worker             int32_t exceptionCode = reply.readExceptionCode();
47*38e8c45fSAndroid Build Coastguard Worker             if (!exceptionCode) {
48*38e8c45fSAndroid Build Coastguard Worker                 // Success is indicated here by a nonzero int followed by the fd;
49*38e8c45fSAndroid Build Coastguard Worker                 // failure by a zero int with no data following.
50*38e8c45fSAndroid Build Coastguard Worker                 if (reply.readInt32() != 0) {
51*38e8c45fSAndroid Build Coastguard Worker                     fd = fcntl(reply.readParcelFileDescriptor(), F_DUPFD_CLOEXEC, 0);
52*38e8c45fSAndroid Build Coastguard Worker                 }
53*38e8c45fSAndroid Build Coastguard Worker             } else {
54*38e8c45fSAndroid Build Coastguard Worker                 // An exception was thrown back; fall through to return failure
55*38e8c45fSAndroid Build Coastguard Worker                 ALOGD("openContentUri(%s) caught exception %d\n", String8(stringUri).c_str(),
56*38e8c45fSAndroid Build Coastguard Worker                       exceptionCode);
57*38e8c45fSAndroid Build Coastguard Worker             }
58*38e8c45fSAndroid Build Coastguard Worker         }
59*38e8c45fSAndroid Build Coastguard Worker         return fd;
60*38e8c45fSAndroid Build Coastguard Worker     }
61*38e8c45fSAndroid Build Coastguard Worker 
registerUidObserver(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage)62*38e8c45fSAndroid Build Coastguard Worker     virtual status_t registerUidObserver(const sp<IUidObserver>& observer,
63*38e8c45fSAndroid Build Coastguard Worker                                      const int32_t event,
64*38e8c45fSAndroid Build Coastguard Worker                                      const int32_t cutpoint,
65*38e8c45fSAndroid Build Coastguard Worker                                      const String16& callingPackage)
66*38e8c45fSAndroid Build Coastguard Worker     {
67*38e8c45fSAndroid Build Coastguard Worker          Parcel data, reply;
68*38e8c45fSAndroid Build Coastguard Worker          data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
69*38e8c45fSAndroid Build Coastguard Worker          data.writeStrongBinder(IInterface::asBinder(observer));
70*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(event);
71*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(cutpoint);
72*38e8c45fSAndroid Build Coastguard Worker          data.writeString16(callingPackage);
73*38e8c45fSAndroid Build Coastguard Worker          status_t err = remote()->transact(REGISTER_UID_OBSERVER_TRANSACTION, data, &reply);
74*38e8c45fSAndroid Build Coastguard Worker          if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
75*38e8c45fSAndroid Build Coastguard Worker              return err;
76*38e8c45fSAndroid Build Coastguard Worker          }
77*38e8c45fSAndroid Build Coastguard Worker          return OK;
78*38e8c45fSAndroid Build Coastguard Worker     }
79*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)80*38e8c45fSAndroid Build Coastguard Worker     virtual status_t registerUidObserverForUids(const sp<IUidObserver>& observer,
81*38e8c45fSAndroid Build Coastguard Worker                                                 const int32_t event, const int32_t cutpoint,
82*38e8c45fSAndroid Build Coastguard Worker                                                 const String16& callingPackage,
83*38e8c45fSAndroid Build Coastguard Worker                                                 const int32_t uids[], size_t nUids,
84*38e8c45fSAndroid Build Coastguard Worker                                                 /*out*/ sp<IBinder>& observerToken) {
85*38e8c45fSAndroid Build Coastguard Worker          Parcel data, reply;
86*38e8c45fSAndroid Build Coastguard Worker          data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
87*38e8c45fSAndroid Build Coastguard Worker          data.writeStrongBinder(IInterface::asBinder(observer));
88*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(event);
89*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(cutpoint);
90*38e8c45fSAndroid Build Coastguard Worker          data.writeString16(callingPackage);
91*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32Array(nUids, uids);
92*38e8c45fSAndroid Build Coastguard Worker          status_t err =
93*38e8c45fSAndroid Build Coastguard Worker                  remote()->transact(REGISTER_UID_OBSERVER_FOR_UIDS_TRANSACTION, data, &reply);
94*38e8c45fSAndroid Build Coastguard Worker          if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
95*38e8c45fSAndroid Build Coastguard Worker              return err;
96*38e8c45fSAndroid Build Coastguard Worker          }
97*38e8c45fSAndroid Build Coastguard Worker          err = reply.readStrongBinder(&observerToken);
98*38e8c45fSAndroid Build Coastguard Worker          if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
99*38e8c45fSAndroid Build Coastguard Worker              return err;
100*38e8c45fSAndroid Build Coastguard Worker          }
101*38e8c45fSAndroid Build Coastguard Worker          return OK;
102*38e8c45fSAndroid Build Coastguard Worker     }
103*38e8c45fSAndroid Build Coastguard Worker 
unregisterUidObserver(const sp<IUidObserver> & observer)104*38e8c45fSAndroid Build Coastguard Worker     virtual status_t unregisterUidObserver(const sp<IUidObserver>& observer)
105*38e8c45fSAndroid Build Coastguard Worker     {
106*38e8c45fSAndroid Build Coastguard Worker          Parcel data, reply;
107*38e8c45fSAndroid Build Coastguard Worker          data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
108*38e8c45fSAndroid Build Coastguard Worker          data.writeStrongBinder(IInterface::asBinder(observer));
109*38e8c45fSAndroid Build Coastguard Worker          status_t err = remote()->transact(UNREGISTER_UID_OBSERVER_TRANSACTION, data, &reply);
110*38e8c45fSAndroid Build Coastguard Worker          if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
111*38e8c45fSAndroid Build Coastguard Worker              return err;
112*38e8c45fSAndroid Build Coastguard Worker          }
113*38e8c45fSAndroid Build Coastguard Worker          return OK;
114*38e8c45fSAndroid Build Coastguard Worker     }
115*38e8c45fSAndroid Build Coastguard Worker 
addUidToObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)116*38e8c45fSAndroid Build Coastguard Worker     virtual status_t addUidToObserver(const sp<IBinder>& observerToken,
117*38e8c45fSAndroid Build Coastguard Worker                                       const String16& callingPackage, int32_t uid) {
118*38e8c45fSAndroid Build Coastguard Worker          Parcel data, reply;
119*38e8c45fSAndroid Build Coastguard Worker          data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
120*38e8c45fSAndroid Build Coastguard Worker          data.writeStrongBinder(observerToken);
121*38e8c45fSAndroid Build Coastguard Worker          data.writeString16(callingPackage);
122*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(uid);
123*38e8c45fSAndroid Build Coastguard Worker          status_t err = remote()->transact(ADD_UID_TO_OBSERVER_TRANSACTION, data, &reply);
124*38e8c45fSAndroid Build Coastguard Worker          if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
125*38e8c45fSAndroid Build Coastguard Worker              return err;
126*38e8c45fSAndroid Build Coastguard Worker          }
127*38e8c45fSAndroid Build Coastguard Worker          return OK;
128*38e8c45fSAndroid Build Coastguard Worker     }
129*38e8c45fSAndroid Build Coastguard Worker 
removeUidFromObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)130*38e8c45fSAndroid Build Coastguard Worker     virtual status_t removeUidFromObserver(const sp<IBinder>& observerToken,
131*38e8c45fSAndroid Build Coastguard Worker                                            const String16& callingPackage, int32_t uid) {
132*38e8c45fSAndroid Build Coastguard Worker          Parcel data, reply;
133*38e8c45fSAndroid Build Coastguard Worker          data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
134*38e8c45fSAndroid Build Coastguard Worker          data.writeStrongBinder(observerToken);
135*38e8c45fSAndroid Build Coastguard Worker          data.writeString16(callingPackage);
136*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(uid);
137*38e8c45fSAndroid Build Coastguard Worker          status_t err = remote()->transact(REMOVE_UID_FROM_OBSERVER_TRANSACTION, data, &reply);
138*38e8c45fSAndroid Build Coastguard Worker          if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
139*38e8c45fSAndroid Build Coastguard Worker              return err;
140*38e8c45fSAndroid Build Coastguard Worker          }
141*38e8c45fSAndroid Build Coastguard Worker          return OK;
142*38e8c45fSAndroid Build Coastguard Worker     }
143*38e8c45fSAndroid Build Coastguard Worker 
isUidActive(const uid_t uid,const String16 & callingPackage)144*38e8c45fSAndroid Build Coastguard Worker     virtual bool isUidActive(const uid_t uid, const String16& callingPackage)
145*38e8c45fSAndroid Build Coastguard Worker     {
146*38e8c45fSAndroid Build Coastguard Worker          Parcel data, reply;
147*38e8c45fSAndroid Build Coastguard Worker          data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
148*38e8c45fSAndroid Build Coastguard Worker          data.writeInt32(uid);
149*38e8c45fSAndroid Build Coastguard Worker          data.writeString16(callingPackage);
150*38e8c45fSAndroid Build Coastguard Worker          remote()->transact(IS_UID_ACTIVE_TRANSACTION, data, &reply);
151*38e8c45fSAndroid Build Coastguard Worker          // fail on exception
152*38e8c45fSAndroid Build Coastguard Worker          if (reply.readExceptionCode() != 0) return false;
153*38e8c45fSAndroid Build Coastguard Worker          return reply.readInt32() == 1;
154*38e8c45fSAndroid Build Coastguard Worker     }
155*38e8c45fSAndroid Build Coastguard Worker 
getUidProcessState(const uid_t uid,const String16 & callingPackage)156*38e8c45fSAndroid Build Coastguard Worker     virtual int32_t getUidProcessState(const uid_t uid, const String16& callingPackage)
157*38e8c45fSAndroid Build Coastguard Worker     {
158*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
159*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
160*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
161*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(callingPackage);
162*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(GET_UID_PROCESS_STATE_TRANSACTION, data, &reply);
163*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
164*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) {
165*38e8c45fSAndroid Build Coastguard Worker             return ActivityManager::PROCESS_STATE_UNKNOWN;
166*38e8c45fSAndroid Build Coastguard Worker         }
167*38e8c45fSAndroid Build Coastguard Worker         return reply.readInt32();
168*38e8c45fSAndroid Build Coastguard Worker     }
169*38e8c45fSAndroid Build Coastguard Worker 
checkPermission(const String16 & permission,const pid_t pid,const uid_t uid,int32_t * outResult)170*38e8c45fSAndroid Build Coastguard Worker     virtual status_t checkPermission(const String16& permission,
171*38e8c45fSAndroid Build Coastguard Worker                                     const pid_t pid,
172*38e8c45fSAndroid Build Coastguard Worker                                     const uid_t uid,
173*38e8c45fSAndroid Build Coastguard Worker                                     int32_t* outResult) {
174*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
175*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
176*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(permission);
177*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(pid);
178*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
179*38e8c45fSAndroid Build Coastguard Worker         status_t err = remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
180*38e8c45fSAndroid Build Coastguard Worker         if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
181*38e8c45fSAndroid Build Coastguard Worker             return err;
182*38e8c45fSAndroid Build Coastguard Worker         }
183*38e8c45fSAndroid Build Coastguard Worker         *outResult = reply.readInt32();
184*38e8c45fSAndroid Build Coastguard Worker         return NO_ERROR;
185*38e8c45fSAndroid Build Coastguard Worker     }
186*38e8c45fSAndroid Build Coastguard Worker 
logFgsApiBegin(int32_t apiType,int32_t appUid,int32_t appPid)187*38e8c45fSAndroid Build Coastguard Worker     virtual status_t logFgsApiBegin(int32_t apiType, int32_t appUid, int32_t appPid) {
188*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
189*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
190*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(apiType);
191*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(appUid);
192*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(appPid);
193*38e8c45fSAndroid Build Coastguard Worker         status_t err = remote()->transact(LOG_FGS_API_BEGIN_TRANSACTION, data, &reply,
194*38e8c45fSAndroid Build Coastguard Worker                                           IBinder::FLAG_ONEWAY);
195*38e8c45fSAndroid Build Coastguard Worker         if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
196*38e8c45fSAndroid Build Coastguard Worker             ALOGD("%s: FGS Logger Transaction failed, %d", __func__, err);
197*38e8c45fSAndroid Build Coastguard Worker             return err;
198*38e8c45fSAndroid Build Coastguard Worker         }
199*38e8c45fSAndroid Build Coastguard Worker         return NO_ERROR;
200*38e8c45fSAndroid Build Coastguard Worker     }
201*38e8c45fSAndroid Build Coastguard Worker 
logFgsApiEnd(int32_t apiType,int32_t appUid,int32_t appPid)202*38e8c45fSAndroid Build Coastguard Worker     virtual status_t logFgsApiEnd(int32_t apiType, int32_t appUid, int32_t appPid) {
203*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
204*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
205*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(apiType);
206*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(appUid);
207*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(appPid);
208*38e8c45fSAndroid Build Coastguard Worker         status_t err =
209*38e8c45fSAndroid Build Coastguard Worker                 remote()->transact(LOG_FGS_API_END_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
210*38e8c45fSAndroid Build Coastguard Worker         if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
211*38e8c45fSAndroid Build Coastguard Worker             ALOGD("%s: FGS Logger Transaction failed, %d", __func__, err);
212*38e8c45fSAndroid Build Coastguard Worker             return err;
213*38e8c45fSAndroid Build Coastguard Worker         }
214*38e8c45fSAndroid Build Coastguard Worker         return NO_ERROR;
215*38e8c45fSAndroid Build Coastguard Worker     }
216*38e8c45fSAndroid Build Coastguard Worker 
logFgsApiStateChanged(int32_t apiType,int32_t state,int32_t appUid,int32_t appPid)217*38e8c45fSAndroid Build Coastguard Worker     virtual status_t logFgsApiStateChanged(int32_t apiType, int32_t state, int32_t appUid,
218*38e8c45fSAndroid Build Coastguard Worker                                            int32_t appPid) {
219*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
220*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
221*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(apiType);
222*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(state);
223*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(appUid);
224*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(appPid);
225*38e8c45fSAndroid Build Coastguard Worker         status_t err = remote()->transact(LOG_FGS_API_STATE_CHANGED_TRANSACTION, data, &reply,
226*38e8c45fSAndroid Build Coastguard Worker                                           IBinder::FLAG_ONEWAY);
227*38e8c45fSAndroid Build Coastguard Worker         if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
228*38e8c45fSAndroid Build Coastguard Worker             ALOGD("%s: FGS Logger Transaction failed, %d", __func__, err);
229*38e8c45fSAndroid Build Coastguard Worker             return err;
230*38e8c45fSAndroid Build Coastguard Worker         }
231*38e8c45fSAndroid Build Coastguard Worker         return NO_ERROR;
232*38e8c45fSAndroid Build Coastguard Worker     }
233*38e8c45fSAndroid Build Coastguard Worker };
234*38e8c45fSAndroid Build Coastguard Worker 
235*38e8c45fSAndroid Build Coastguard Worker // ------------------------------------------------------------------------------------
236*38e8c45fSAndroid Build Coastguard Worker 
237*38e8c45fSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(ActivityManager, "android.app.IActivityManager")
238*38e8c45fSAndroid Build Coastguard Worker 
239*38e8c45fSAndroid Build Coastguard Worker } // namespace android
240