• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.am;
18 
19 import static com.android.server.am.ActivityManagerDebugConfig.*;
20 
21 import java.io.FileDescriptor;
22 import java.io.IOException;
23 import java.io.PrintWriter;
24 import java.io.StringWriter;
25 import java.util.ArrayList;
26 import java.util.HashSet;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Set;
30 
31 import android.app.ActivityThread;
32 import android.app.AppOpsManager;
33 import android.content.IIntentSender;
34 import android.content.IntentSender;
35 import android.os.Build;
36 import android.os.Bundle;
37 import android.os.DeadObjectException;
38 import android.os.Handler;
39 import android.os.Looper;
40 import android.os.RemoteCallback;
41 import android.os.SystemProperties;
42 import android.os.TransactionTooLargeException;
43 import android.util.ArrayMap;
44 import android.util.ArraySet;
45 
46 import com.android.internal.app.procstats.ServiceState;
47 import com.android.internal.os.BatteryStatsImpl;
48 import com.android.internal.os.TransferPipe;
49 import com.android.internal.util.FastPrintWriter;
50 import com.android.server.am.ActivityManagerService.ItemMatcher;
51 import com.android.server.am.ActivityManagerService.NeededUriGrants;
52 
53 import android.app.ActivityManager;
54 import android.app.AppGlobals;
55 import android.app.IApplicationThread;
56 import android.app.IServiceConnection;
57 import android.app.Notification;
58 import android.app.PendingIntent;
59 import android.app.Service;
60 import android.content.ComponentName;
61 import android.content.Context;
62 import android.content.Intent;
63 import android.content.pm.ApplicationInfo;
64 import android.content.pm.PackageManager;
65 import android.content.pm.ResolveInfo;
66 import android.content.pm.ServiceInfo;
67 import android.os.Binder;
68 import android.os.IBinder;
69 import android.os.Message;
70 import android.os.Process;
71 import android.os.RemoteException;
72 import android.os.SystemClock;
73 import android.os.UserHandle;
74 import android.util.EventLog;
75 import android.util.Slog;
76 import android.util.SparseArray;
77 import android.util.TimeUtils;
78 
79 public final class ActiveServices {
80     private static final String TAG = TAG_WITH_CLASS_NAME ? "ActiveServices" : TAG_AM;
81     private static final String TAG_MU = TAG + POSTFIX_MU;
82     private static final String TAG_SERVICE = TAG + POSTFIX_SERVICE;
83     private static final String TAG_SERVICE_EXECUTING = TAG + POSTFIX_SERVICE_EXECUTING;
84 
85     private static final boolean DEBUG_DELAYED_SERVICE = DEBUG_SERVICE;
86     private static final boolean DEBUG_DELAYED_STARTS = DEBUG_DELAYED_SERVICE;
87 
88     private static final boolean LOG_SERVICE_START_STOP = false;
89 
90     // How long we wait for a service to finish executing.
91     static final int SERVICE_TIMEOUT = 20*1000;
92 
93     // How long we wait for a service to finish executing.
94     static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;
95 
96     // How long a service needs to be running until restarting its process
97     // is no longer considered to be a relaunch of the service.
98     static final int SERVICE_RESTART_DURATION = 1*1000;
99 
100     // How long a service needs to be running until it will start back at
101     // SERVICE_RESTART_DURATION after being killed.
102     static final int SERVICE_RESET_RUN_DURATION = 60*1000;
103 
104     // Multiplying factor to increase restart duration time by, for each time
105     // a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
106     static final int SERVICE_RESTART_DURATION_FACTOR = 4;
107 
108     // The minimum amount of time between restarting services that we allow.
109     // That is, when multiple services are restarting, we won't allow each
110     // to restart less than this amount of time from the last one.
111     static final int SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
112 
113     // Maximum amount of time for there to be no activity on a service before
114     // we consider it non-essential and allow its process to go on the
115     // LRU background list.
116     static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
117 
118     // How long we wait for a background started service to stop itself before
119     // allowing the next pending start to run.
120     static final int BG_START_TIMEOUT = 15*1000;
121 
122     final ActivityManagerService mAm;
123 
124     // Maximum number of services that we allow to start in the background
125     // at the same time.
126     final int mMaxStartingBackground;
127 
128     final SparseArray<ServiceMap> mServiceMap = new SparseArray<>();
129 
130     /**
131      * All currently bound service connections.  Keys are the IBinder of
132      * the client's IServiceConnection.
133      */
134     final ArrayMap<IBinder, ArrayList<ConnectionRecord>> mServiceConnections = new ArrayMap<>();
135 
136     /**
137      * List of services that we have been asked to start,
138      * but haven't yet been able to.  It is used to hold start requests
139      * while waiting for their corresponding application thread to get
140      * going.
141      */
142     final ArrayList<ServiceRecord> mPendingServices = new ArrayList<>();
143 
144     /**
145      * List of services that are scheduled to restart following a crash.
146      */
147     final ArrayList<ServiceRecord> mRestartingServices = new ArrayList<>();
148 
149     /**
150      * List of services that are in the process of being destroyed.
151      */
152     final ArrayList<ServiceRecord> mDestroyingServices = new ArrayList<>();
153 
154     /** Temporary list for holding the results of calls to {@link #collectPackageServicesLocked} */
155     private ArrayList<ServiceRecord> mTmpCollectionResults = null;
156 
157     /** Amount of time to allow a last ANR message to exist before freeing the memory. */
158     static final int LAST_ANR_LIFETIME_DURATION_MSECS = 2 * 60 * 60 * 1000; // Two hours
159 
160     String mLastAnrDump;
161 
162     final Runnable mLastAnrDumpClearer = new Runnable() {
163         @Override public void run() {
164             synchronized (mAm) {
165                 mLastAnrDump = null;
166             }
167         }
168     };
169 
170     /**
171      * Information about services for a single user.
172      */
173     class ServiceMap extends Handler {
174         final int mUserId;
175         final ArrayMap<ComponentName, ServiceRecord> mServicesByName = new ArrayMap<>();
176         final ArrayMap<Intent.FilterComparison, ServiceRecord> mServicesByIntent = new ArrayMap<>();
177 
178         final ArrayList<ServiceRecord> mDelayedStartList = new ArrayList<>();
179         /* XXX eventually I'd like to have this based on processes instead of services.
180          * That is, if we try to start two services in a row both running in the same
181          * process, this should be one entry in mStartingBackground for that one process
182          * that remains until all services in it are done.
183         final ArrayMap<ProcessRecord, DelayingProcess> mStartingBackgroundMap
184                 = new ArrayMap<ProcessRecord, DelayingProcess>();
185         final ArrayList<DelayingProcess> mStartingProcessList
186                 = new ArrayList<DelayingProcess>();
187         */
188 
189         final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>();
190 
191         static final int MSG_BG_START_TIMEOUT = 1;
192 
ServiceMap(Looper looper, int userId)193         ServiceMap(Looper looper, int userId) {
194             super(looper);
195             mUserId = userId;
196         }
197 
198         @Override
handleMessage(Message msg)199         public void handleMessage(Message msg) {
200             switch (msg.what) {
201                 case MSG_BG_START_TIMEOUT: {
202                     synchronized (mAm) {
203                         rescheduleDelayedStarts();
204                     }
205                 } break;
206             }
207         }
208 
ensureNotStartingBackground(ServiceRecord r)209         void ensureNotStartingBackground(ServiceRecord r) {
210             if (mStartingBackground.remove(r)) {
211                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
212                         "No longer background starting: " + r);
213                 rescheduleDelayedStarts();
214             }
215             if (mDelayedStartList.remove(r)) {
216                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "No longer delaying start: " + r);
217             }
218         }
219 
rescheduleDelayedStarts()220         void rescheduleDelayedStarts() {
221             removeMessages(MSG_BG_START_TIMEOUT);
222             final long now = SystemClock.uptimeMillis();
223             for (int i=0, N=mStartingBackground.size(); i<N; i++) {
224                 ServiceRecord r = mStartingBackground.get(i);
225                 if (r.startingBgTimeout <= now) {
226                     Slog.i(TAG, "Waited long enough for: " + r);
227                     mStartingBackground.remove(i);
228                     N--;
229                     i--;
230                 }
231             }
232             while (mDelayedStartList.size() > 0
233                     && mStartingBackground.size() < mMaxStartingBackground) {
234                 ServiceRecord r = mDelayedStartList.remove(0);
235                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
236                         "REM FR DELAY LIST (exec next): " + r);
237                 if (r.pendingStarts.size() <= 0) {
238                     Slog.w(TAG, "**** NO PENDING STARTS! " + r + " startReq=" + r.startRequested
239                             + " delayedStop=" + r.delayedStop);
240                 }
241                 if (DEBUG_DELAYED_SERVICE) {
242                     if (mDelayedStartList.size() > 0) {
243                         Slog.v(TAG_SERVICE, "Remaining delayed list:");
244                         for (int i=0; i<mDelayedStartList.size(); i++) {
245                             Slog.v(TAG_SERVICE, "  #" + i + ": " + mDelayedStartList.get(i));
246                         }
247                     }
248                 }
249                 r.delayed = false;
250                 try {
251                     startServiceInnerLocked(this, r.pendingStarts.get(0).intent, r, false, true);
252                 } catch (TransactionTooLargeException e) {
253                     // Ignore, nobody upstack cares.
254                 }
255             }
256             if (mStartingBackground.size() > 0) {
257                 ServiceRecord next = mStartingBackground.get(0);
258                 long when = next.startingBgTimeout > now ? next.startingBgTimeout : now;
259                 if (DEBUG_DELAYED_SERVICE) Slog.v(TAG_SERVICE, "Top bg start is " + next
260                         + ", can delay others up to " + when);
261                 Message msg = obtainMessage(MSG_BG_START_TIMEOUT);
262                 sendMessageAtTime(msg, when);
263             }
264             if (mStartingBackground.size() < mMaxStartingBackground) {
265                 mAm.backgroundServicesFinishedLocked(mUserId);
266             }
267         }
268     }
269 
ActiveServices(ActivityManagerService service)270     public ActiveServices(ActivityManagerService service) {
271         mAm = service;
272         int maxBg = 0;
273         try {
274             maxBg = Integer.parseInt(SystemProperties.get("ro.config.max_starting_bg", "0"));
275         } catch(RuntimeException e) {
276         }
277         mMaxStartingBackground = maxBg > 0
278                 ? maxBg : ActivityManager.isLowRamDeviceStatic() ? 1 : 8;
279     }
280 
getServiceByName(ComponentName name, int callingUser)281     ServiceRecord getServiceByName(ComponentName name, int callingUser) {
282         // TODO: Deal with global services
283         if (DEBUG_MU)
284             Slog.v(TAG_MU, "getServiceByName(" + name + "), callingUser = " + callingUser);
285         return getServiceMap(callingUser).mServicesByName.get(name);
286     }
287 
hasBackgroundServices(int callingUser)288     boolean hasBackgroundServices(int callingUser) {
289         ServiceMap smap = mServiceMap.get(callingUser);
290         return smap != null ? smap.mStartingBackground.size() >= mMaxStartingBackground : false;
291     }
292 
getServiceMap(int callingUser)293     private ServiceMap getServiceMap(int callingUser) {
294         ServiceMap smap = mServiceMap.get(callingUser);
295         if (smap == null) {
296             smap = new ServiceMap(mAm.mHandler.getLooper(), callingUser);
297             mServiceMap.put(callingUser, smap);
298         }
299         return smap;
300     }
301 
getServices(int callingUser)302     ArrayMap<ComponentName, ServiceRecord> getServices(int callingUser) {
303         return getServiceMap(callingUser).mServicesByName;
304     }
305 
startServiceLocked(IApplicationThread caller, Intent service, String resolvedType, int callingPid, int callingUid, String callingPackage, final int userId)306     ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType,
307             int callingPid, int callingUid, String callingPackage, final int userId)
308             throws TransactionTooLargeException {
309         if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "startService: " + service
310                 + " type=" + resolvedType + " args=" + service.getExtras());
311 
312         final boolean callerFg;
313         if (caller != null) {
314             final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
315             if (callerApp == null) {
316                 throw new SecurityException(
317                         "Unable to find app for caller " + caller
318                         + " (pid=" + Binder.getCallingPid()
319                         + ") when starting service " + service);
320             }
321             callerFg = callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND;
322         } else {
323             callerFg = true;
324         }
325 
326 
327         ServiceLookupResult res =
328             retrieveServiceLocked(service, resolvedType, callingPackage,
329                     callingPid, callingUid, userId, true, callerFg, false);
330         if (res == null) {
331             return null;
332         }
333         if (res.record == null) {
334             return new ComponentName("!", res.permission != null
335                     ? res.permission : "private to package");
336         }
337 
338         ServiceRecord r = res.record;
339 
340         if (!mAm.mUserController.exists(r.userId)) {
341             Slog.w(TAG, "Trying to start service with non-existent user! " + r.userId);
342             return null;
343         }
344 
345         if (!r.startRequested) {
346             final long token = Binder.clearCallingIdentity();
347             try {
348                 // Before going further -- if this app is not allowed to run in the
349                 // background, then at this point we aren't going to let it period.
350                 final int allowed = mAm.checkAllowBackgroundLocked(
351                         r.appInfo.uid, r.packageName, callingPid, true);
352                 if (allowed != ActivityManager.APP_START_MODE_NORMAL) {
353                     Slog.w(TAG, "Background start not allowed: service "
354                             + service + " to " + r.name.flattenToShortString()
355                             + " from pid=" + callingPid + " uid=" + callingUid
356                             + " pkg=" + callingPackage);
357                     return null;
358                 }
359             } finally {
360                 Binder.restoreCallingIdentity(token);
361             }
362         }
363 
364         NeededUriGrants neededGrants = mAm.checkGrantUriPermissionFromIntentLocked(
365                 callingUid, r.packageName, service, service.getFlags(), null, r.userId);
366 
367         // If permissions need a review before any of the app components can run,
368         // we do not start the service and launch a review activity if the calling app
369         // is in the foreground passing it a pending intent to start the service when
370         // review is completed.
371         if (Build.PERMISSIONS_REVIEW_REQUIRED) {
372             if (!requestStartTargetPermissionsReviewIfNeededLocked(r, callingPackage,
373                     callingUid, service, callerFg, userId)) {
374                 return null;
375             }
376         }
377 
378         if (unscheduleServiceRestartLocked(r, callingUid, false)) {
379             if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "START SERVICE WHILE RESTART PENDING: " + r);
380         }
381         r.lastActivity = SystemClock.uptimeMillis();
382         r.startRequested = true;
383         r.delayedStop = false;
384         r.pendingStarts.add(new ServiceRecord.StartItem(r, false, r.makeNextStartId(),
385                 service, neededGrants));
386 
387         final ServiceMap smap = getServiceMap(r.userId);
388         boolean addToStarting = false;
389         if (!callerFg && r.app == null
390                 && mAm.mUserController.hasStartedUserState(r.userId)) {
391             ProcessRecord proc = mAm.getProcessRecordLocked(r.processName, r.appInfo.uid, false);
392             if (proc == null || proc.curProcState > ActivityManager.PROCESS_STATE_RECEIVER) {
393                 // If this is not coming from a foreground caller, then we may want
394                 // to delay the start if there are already other background services
395                 // that are starting.  This is to avoid process start spam when lots
396                 // of applications are all handling things like connectivity broadcasts.
397                 // We only do this for cached processes, because otherwise an application
398                 // can have assumptions about calling startService() for a service to run
399                 // in its own process, and for that process to not be killed before the
400                 // service is started.  This is especially the case for receivers, which
401                 // may start a service in onReceive() to do some additional work and have
402                 // initialized some global state as part of that.
403                 if (DEBUG_DELAYED_SERVICE) Slog.v(TAG_SERVICE, "Potential start delay of "
404                         + r + " in " + proc);
405                 if (r.delayed) {
406                     // This service is already scheduled for a delayed start; just leave
407                     // it still waiting.
408                     if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Continuing to delay: " + r);
409                     return r.name;
410                 }
411                 if (smap.mStartingBackground.size() >= mMaxStartingBackground) {
412                     // Something else is starting, delay!
413                     Slog.i(TAG_SERVICE, "Delaying start of: " + r);
414                     smap.mDelayedStartList.add(r);
415                     r.delayed = true;
416                     return r.name;
417                 }
418                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Not delaying: " + r);
419                 addToStarting = true;
420             } else if (proc.curProcState >= ActivityManager.PROCESS_STATE_SERVICE) {
421                 // We slightly loosen when we will enqueue this new service as a background
422                 // starting service we are waiting for, to also include processes that are
423                 // currently running other services or receivers.
424                 addToStarting = true;
425                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
426                         "Not delaying, but counting as bg: " + r);
427             } else if (DEBUG_DELAYED_STARTS) {
428                 StringBuilder sb = new StringBuilder(128);
429                 sb.append("Not potential delay (state=").append(proc.curProcState)
430                         .append(' ').append(proc.adjType);
431                 String reason = proc.makeAdjReason();
432                 if (reason != null) {
433                     sb.append(' ');
434                     sb.append(reason);
435                 }
436                 sb.append("): ");
437                 sb.append(r.toString());
438                 Slog.v(TAG_SERVICE, sb.toString());
439             }
440         } else if (DEBUG_DELAYED_STARTS) {
441             if (callerFg) {
442                 Slog.v(TAG_SERVICE, "Not potential delay (callerFg=" + callerFg + " uid="
443                         + callingUid + " pid=" + callingPid + "): " + r);
444             } else if (r.app != null) {
445                 Slog.v(TAG_SERVICE, "Not potential delay (cur app=" + r.app + "): " + r);
446             } else {
447                 Slog.v(TAG_SERVICE,
448                         "Not potential delay (user " + r.userId + " not started): " + r);
449             }
450         }
451 
452         return startServiceInnerLocked(smap, service, r, callerFg, addToStarting);
453     }
454 
requestStartTargetPermissionsReviewIfNeededLocked(ServiceRecord r, String callingPackage, int callingUid, Intent service, boolean callerFg, final int userId)455     private boolean requestStartTargetPermissionsReviewIfNeededLocked(ServiceRecord r,
456             String callingPackage, int callingUid, Intent service, boolean callerFg,
457             final int userId) {
458         if (mAm.getPackageManagerInternalLocked().isPermissionsReviewRequired(
459                 r.packageName, r.userId)) {
460 
461             // Show a permission review UI only for starting from a foreground app
462             if (!callerFg) {
463                 Slog.w(TAG, "u" + r.userId + " Starting a service in package"
464                         + r.packageName + " requires a permissions review");
465                 return false;
466             }
467 
468             IIntentSender target = mAm.getIntentSenderLocked(
469                     ActivityManager.INTENT_SENDER_SERVICE, callingPackage,
470                     callingUid, userId, null, null, 0, new Intent[]{service},
471                     new String[]{service.resolveType(mAm.mContext.getContentResolver())},
472                     PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT
473                             | PendingIntent.FLAG_IMMUTABLE, null);
474 
475             final Intent intent = new Intent(Intent.ACTION_REVIEW_PERMISSIONS);
476             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
477                     | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
478             intent.putExtra(Intent.EXTRA_PACKAGE_NAME, r.packageName);
479             intent.putExtra(Intent.EXTRA_INTENT, new IntentSender(target));
480 
481             if (DEBUG_PERMISSIONS_REVIEW) {
482                 Slog.i(TAG, "u" + r.userId + " Launching permission review for package "
483                         + r.packageName);
484             }
485 
486             mAm.mHandler.post(new Runnable() {
487                 @Override
488                 public void run() {
489                     mAm.mContext.startActivityAsUser(intent, new UserHandle(userId));
490                 }
491             });
492 
493             return false;
494         }
495 
496         return  true;
497     }
498 
startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r, boolean callerFg, boolean addToStarting)499     ComponentName startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r,
500             boolean callerFg, boolean addToStarting) throws TransactionTooLargeException {
501         ServiceState stracker = r.getTracker();
502         if (stracker != null) {
503             stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity);
504         }
505         r.callStart = false;
506         synchronized (r.stats.getBatteryStats()) {
507             r.stats.startRunningLocked();
508         }
509         String error = bringUpServiceLocked(r, service.getFlags(), callerFg, false, false);
510         if (error != null) {
511             return new ComponentName("!!", error);
512         }
513 
514         if (r.startRequested && addToStarting) {
515             boolean first = smap.mStartingBackground.size() == 0;
516             smap.mStartingBackground.add(r);
517             r.startingBgTimeout = SystemClock.uptimeMillis() + BG_START_TIMEOUT;
518             if (DEBUG_DELAYED_SERVICE) {
519                 RuntimeException here = new RuntimeException("here");
520                 here.fillInStackTrace();
521                 Slog.v(TAG_SERVICE, "Starting background (first=" + first + "): " + r, here);
522             } else if (DEBUG_DELAYED_STARTS) {
523                 Slog.v(TAG_SERVICE, "Starting background (first=" + first + "): " + r);
524             }
525             if (first) {
526                 smap.rescheduleDelayedStarts();
527             }
528         } else if (callerFg) {
529             smap.ensureNotStartingBackground(r);
530         }
531 
532         return r.name;
533     }
534 
stopServiceLocked(ServiceRecord service)535     private void stopServiceLocked(ServiceRecord service) {
536         if (service.delayed) {
537             // If service isn't actually running, but is is being held in the
538             // delayed list, then we need to keep it started but note that it
539             // should be stopped once no longer delayed.
540             if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Delaying stop of pending: " + service);
541             service.delayedStop = true;
542             return;
543         }
544         synchronized (service.stats.getBatteryStats()) {
545             service.stats.stopRunningLocked();
546         }
547         service.startRequested = false;
548         if (service.tracker != null) {
549             service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
550                     SystemClock.uptimeMillis());
551         }
552         service.callStart = false;
553         bringDownServiceIfNeededLocked(service, false, false);
554     }
555 
stopServiceLocked(IApplicationThread caller, Intent service, String resolvedType, int userId)556     int stopServiceLocked(IApplicationThread caller, Intent service,
557             String resolvedType, int userId) {
558         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "stopService: " + service
559                 + " type=" + resolvedType);
560 
561         final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
562         if (caller != null && callerApp == null) {
563             throw new SecurityException(
564                     "Unable to find app for caller " + caller
565                     + " (pid=" + Binder.getCallingPid()
566                     + ") when stopping service " + service);
567         }
568 
569         // If this service is active, make sure it is stopped.
570         ServiceLookupResult r = retrieveServiceLocked(service, resolvedType, null,
571                 Binder.getCallingPid(), Binder.getCallingUid(), userId, false, false, false);
572         if (r != null) {
573             if (r.record != null) {
574                 final long origId = Binder.clearCallingIdentity();
575                 try {
576                     stopServiceLocked(r.record);
577                 } finally {
578                     Binder.restoreCallingIdentity(origId);
579                 }
580                 return 1;
581             }
582             return -1;
583         }
584 
585         return 0;
586     }
587 
stopInBackgroundLocked(int uid)588     void stopInBackgroundLocked(int uid) {
589         // Stop all services associated with this uid due to it going to the background
590         // stopped state.
591         ServiceMap services = mServiceMap.get(UserHandle.getUserId(uid));
592         ArrayList<ServiceRecord> stopping = null;
593         if (services != null) {
594             for (int i=services.mServicesByName.size()-1; i>=0; i--) {
595                 ServiceRecord service = services.mServicesByName.valueAt(i);
596                 if (service.appInfo.uid == uid && service.startRequested) {
597                     if (mAm.mAppOpsService.noteOperation(AppOpsManager.OP_RUN_IN_BACKGROUND,
598                             uid, service.packageName) != AppOpsManager.MODE_ALLOWED) {
599                         if (stopping == null) {
600                             stopping = new ArrayList<>();
601                             stopping.add(service);
602                         }
603                     }
604                 }
605             }
606             if (stopping != null) {
607                 for (int i=stopping.size()-1; i>=0; i--) {
608                     ServiceRecord service = stopping.get(i);
609                     service.delayed = false;
610                     services.ensureNotStartingBackground(service);
611                     stopServiceLocked(service);
612                 }
613             }
614         }
615     }
616 
peekServiceLocked(Intent service, String resolvedType, String callingPackage)617     IBinder peekServiceLocked(Intent service, String resolvedType, String callingPackage) {
618         ServiceLookupResult r = retrieveServiceLocked(service, resolvedType, callingPackage,
619                 Binder.getCallingPid(), Binder.getCallingUid(),
620                 UserHandle.getCallingUserId(), false, false, false);
621 
622         IBinder ret = null;
623         if (r != null) {
624             // r.record is null if findServiceLocked() failed the caller permission check
625             if (r.record == null) {
626                 throw new SecurityException(
627                         "Permission Denial: Accessing service"
628                         + " from pid=" + Binder.getCallingPid()
629                         + ", uid=" + Binder.getCallingUid()
630                         + " requires " + r.permission);
631             }
632             IntentBindRecord ib = r.record.bindings.get(r.record.intent);
633             if (ib != null) {
634                 ret = ib.binder;
635             }
636         }
637 
638         return ret;
639     }
640 
stopServiceTokenLocked(ComponentName className, IBinder token, int startId)641     boolean stopServiceTokenLocked(ComponentName className, IBinder token,
642             int startId) {
643         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "stopServiceToken: " + className
644                 + " " + token + " startId=" + startId);
645         ServiceRecord r = findServiceLocked(className, token, UserHandle.getCallingUserId());
646         if (r != null) {
647             if (startId >= 0) {
648                 // Asked to only stop if done with all work.  Note that
649                 // to avoid leaks, we will take this as dropping all
650                 // start items up to and including this one.
651                 ServiceRecord.StartItem si = r.findDeliveredStart(startId, false);
652                 if (si != null) {
653                     while (r.deliveredStarts.size() > 0) {
654                         ServiceRecord.StartItem cur = r.deliveredStarts.remove(0);
655                         cur.removeUriPermissionsLocked();
656                         if (cur == si) {
657                             break;
658                         }
659                     }
660                 }
661 
662                 if (r.getLastStartId() != startId) {
663                     return false;
664                 }
665 
666                 if (r.deliveredStarts.size() > 0) {
667                     Slog.w(TAG, "stopServiceToken startId " + startId
668                             + " is last, but have " + r.deliveredStarts.size()
669                             + " remaining args");
670                 }
671             }
672 
673             synchronized (r.stats.getBatteryStats()) {
674                 r.stats.stopRunningLocked();
675             }
676             r.startRequested = false;
677             if (r.tracker != null) {
678                 r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
679                         SystemClock.uptimeMillis());
680             }
681             r.callStart = false;
682             final long origId = Binder.clearCallingIdentity();
683             bringDownServiceIfNeededLocked(r, false, false);
684             Binder.restoreCallingIdentity(origId);
685             return true;
686         }
687         return false;
688     }
689 
setServiceForegroundLocked(ComponentName className, IBinder token, int id, Notification notification, int flags)690     public void setServiceForegroundLocked(ComponentName className, IBinder token,
691             int id, Notification notification, int flags) {
692         final int userId = UserHandle.getCallingUserId();
693         final long origId = Binder.clearCallingIdentity();
694         try {
695             ServiceRecord r = findServiceLocked(className, token, userId);
696             if (r != null) {
697                 if (id != 0) {
698                     if (notification == null) {
699                         throw new IllegalArgumentException("null notification");
700                     }
701                     if (r.foregroundId != id) {
702                         cancelForegroudNotificationLocked(r);
703                         r.foregroundId = id;
704                     }
705                     notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
706                     r.foregroundNoti = notification;
707                     r.isForeground = true;
708                     r.postNotification();
709                     if (r.app != null) {
710                         updateServiceForegroundLocked(r.app, true);
711                     }
712                     getServiceMap(r.userId).ensureNotStartingBackground(r);
713                     mAm.notifyPackageUse(r.serviceInfo.packageName,
714                                          PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);
715                 } else {
716                     if (r.isForeground) {
717                         r.isForeground = false;
718                         if (r.app != null) {
719                             mAm.updateLruProcessLocked(r.app, false, null);
720                             updateServiceForegroundLocked(r.app, true);
721                         }
722                     }
723                     if ((flags & Service.STOP_FOREGROUND_REMOVE) != 0) {
724                         cancelForegroudNotificationLocked(r);
725                         r.foregroundId = 0;
726                         r.foregroundNoti = null;
727                     } else if (r.appInfo.targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {
728                         r.stripForegroundServiceFlagFromNotification();
729                         if ((flags & Service.STOP_FOREGROUND_DETACH) != 0) {
730                             r.foregroundId = 0;
731                             r.foregroundNoti = null;
732                         }
733                     }
734                 }
735             }
736         } finally {
737             Binder.restoreCallingIdentity(origId);
738         }
739     }
740 
cancelForegroudNotificationLocked(ServiceRecord r)741     private void cancelForegroudNotificationLocked(ServiceRecord r) {
742         if (r.foregroundId != 0) {
743             // First check to see if this app has any other active foreground services
744             // with the same notification ID.  If so, we shouldn't actually cancel it,
745             // because that would wipe away the notification that still needs to be shown
746             // due the other service.
747             ServiceMap sm = getServiceMap(r.userId);
748             if (sm != null) {
749                 for (int i = sm.mServicesByName.size()-1; i >= 0; i--) {
750                     ServiceRecord other = sm.mServicesByName.valueAt(i);
751                     if (other != r && other.foregroundId == r.foregroundId
752                             && other.packageName.equals(r.packageName)) {
753                         // Found one!  Abort the cancel.
754                         return;
755                     }
756                 }
757             }
758             r.cancelNotification();
759         }
760     }
761 
updateServiceForegroundLocked(ProcessRecord proc, boolean oomAdj)762     private void updateServiceForegroundLocked(ProcessRecord proc, boolean oomAdj) {
763         boolean anyForeground = false;
764         for (int i=proc.services.size()-1; i>=0; i--) {
765             ServiceRecord sr = proc.services.valueAt(i);
766             if (sr.isForeground) {
767                 anyForeground = true;
768                 break;
769             }
770         }
771         mAm.updateProcessForegroundLocked(proc, anyForeground, oomAdj);
772     }
773 
updateWhitelistManagerLocked(ProcessRecord proc)774     private void updateWhitelistManagerLocked(ProcessRecord proc) {
775         proc.whitelistManager = false;
776         for (int i=proc.services.size()-1; i>=0; i--) {
777             ServiceRecord sr = proc.services.valueAt(i);
778             if (sr.whitelistManager) {
779                 proc.whitelistManager = true;
780                 break;
781             }
782         }
783     }
784 
updateServiceConnectionActivitiesLocked(ProcessRecord clientProc)785     public void updateServiceConnectionActivitiesLocked(ProcessRecord clientProc) {
786         ArraySet<ProcessRecord> updatedProcesses = null;
787         for (int i = 0; i < clientProc.connections.size(); i++) {
788             final ConnectionRecord conn = clientProc.connections.valueAt(i);
789             final ProcessRecord proc = conn.binding.service.app;
790             if (proc == null || proc == clientProc) {
791                 continue;
792             } else if (updatedProcesses == null) {
793                 updatedProcesses = new ArraySet<>();
794             } else if (updatedProcesses.contains(proc)) {
795                 continue;
796             }
797             updatedProcesses.add(proc);
798             updateServiceClientActivitiesLocked(proc, null, false);
799         }
800     }
801 
updateServiceClientActivitiesLocked(ProcessRecord proc, ConnectionRecord modCr, boolean updateLru)802     private boolean updateServiceClientActivitiesLocked(ProcessRecord proc,
803             ConnectionRecord modCr, boolean updateLru) {
804         if (modCr != null && modCr.binding.client != null) {
805             if (modCr.binding.client.activities.size() <= 0) {
806                 // This connection is from a client without activities, so adding
807                 // and removing is not interesting.
808                 return false;
809             }
810         }
811 
812         boolean anyClientActivities = false;
813         for (int i=proc.services.size()-1; i>=0 && !anyClientActivities; i--) {
814             ServiceRecord sr = proc.services.valueAt(i);
815             for (int conni=sr.connections.size()-1; conni>=0 && !anyClientActivities; conni--) {
816                 ArrayList<ConnectionRecord> clist = sr.connections.valueAt(conni);
817                 for (int cri=clist.size()-1; cri>=0; cri--) {
818                     ConnectionRecord cr = clist.get(cri);
819                     if (cr.binding.client == null || cr.binding.client == proc) {
820                         // Binding to ourself is not interesting.
821                         continue;
822                     }
823                     if (cr.binding.client.activities.size() > 0) {
824                         anyClientActivities = true;
825                         break;
826                     }
827                 }
828             }
829         }
830         if (anyClientActivities != proc.hasClientActivities) {
831             proc.hasClientActivities = anyClientActivities;
832             if (updateLru) {
833                 mAm.updateLruProcessLocked(proc, anyClientActivities, null);
834             }
835             return true;
836         }
837         return false;
838     }
839 
bindServiceLocked(IApplicationThread caller, IBinder token, Intent service, String resolvedType, final IServiceConnection connection, int flags, String callingPackage, final int userId)840     int bindServiceLocked(IApplicationThread caller, IBinder token, Intent service,
841             String resolvedType, final IServiceConnection connection, int flags,
842             String callingPackage, final int userId) throws TransactionTooLargeException {
843         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service
844                 + " type=" + resolvedType + " conn=" + connection.asBinder()
845                 + " flags=0x" + Integer.toHexString(flags));
846         final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
847         if (callerApp == null) {
848             throw new SecurityException(
849                     "Unable to find app for caller " + caller
850                     + " (pid=" + Binder.getCallingPid()
851                     + ") when binding service " + service);
852         }
853 
854         ActivityRecord activity = null;
855         if (token != null) {
856             activity = ActivityRecord.isInStackLocked(token);
857             if (activity == null) {
858                 Slog.w(TAG, "Binding with unknown activity: " + token);
859                 return 0;
860             }
861         }
862 
863         int clientLabel = 0;
864         PendingIntent clientIntent = null;
865         final boolean isCallerSystem = callerApp.info.uid == Process.SYSTEM_UID;
866 
867         if (isCallerSystem) {
868             // Hacky kind of thing -- allow system stuff to tell us
869             // what they are, so we can report this elsewhere for
870             // others to know why certain services are running.
871             service.setDefusable(true);
872             clientIntent = service.getParcelableExtra(Intent.EXTRA_CLIENT_INTENT);
873             if (clientIntent != null) {
874                 clientLabel = service.getIntExtra(Intent.EXTRA_CLIENT_LABEL, 0);
875                 if (clientLabel != 0) {
876                     // There are no useful extras in the intent, trash them.
877                     // System code calling with this stuff just needs to know
878                     // this will happen.
879                     service = service.cloneFilter();
880                 }
881             }
882         }
883 
884         if ((flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
885             mAm.enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS,
886                     "BIND_TREAT_LIKE_ACTIVITY");
887         }
888 
889         if ((flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0 && !isCallerSystem) {
890             throw new SecurityException(
891                     "Non-system caller " + caller + " (pid=" + Binder.getCallingPid()
892                     + ") set BIND_ALLOW_WHITELIST_MANAGEMENT when binding service " + service);
893         }
894 
895         final boolean callerFg = callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND;
896         final boolean isBindExternal = (flags & Context.BIND_EXTERNAL_SERVICE) != 0;
897 
898         ServiceLookupResult res =
899             retrieveServiceLocked(service, resolvedType, callingPackage, Binder.getCallingPid(),
900                     Binder.getCallingUid(), userId, true, callerFg, isBindExternal);
901         if (res == null) {
902             return 0;
903         }
904         if (res.record == null) {
905             return -1;
906         }
907         ServiceRecord s = res.record;
908 
909         boolean permissionsReviewRequired = false;
910 
911         // If permissions need a review before any of the app components can run,
912         // we schedule binding to the service but do not start its process, then
913         // we launch a review activity to which is passed a callback to invoke
914         // when done to start the bound service's process to completing the binding.
915         if (Build.PERMISSIONS_REVIEW_REQUIRED) {
916             if (mAm.getPackageManagerInternalLocked().isPermissionsReviewRequired(
917                     s.packageName, s.userId)) {
918 
919                 permissionsReviewRequired = true;
920 
921                 // Show a permission review UI only for binding from a foreground app
922                 if (!callerFg) {
923                     Slog.w(TAG, "u" + s.userId + " Binding to a service in package"
924                             + s.packageName + " requires a permissions review");
925                     return 0;
926                 }
927 
928                 final ServiceRecord serviceRecord = s;
929                 final Intent serviceIntent = service;
930 
931                 RemoteCallback callback = new RemoteCallback(
932                         new RemoteCallback.OnResultListener() {
933                     @Override
934                     public void onResult(Bundle result) {
935                         synchronized(mAm) {
936                             final long identity = Binder.clearCallingIdentity();
937                             try {
938                                 if (!mPendingServices.contains(serviceRecord)) {
939                                     return;
940                                 }
941                                 // If there is still a pending record, then the service
942                                 // binding request is still valid, so hook them up. We
943                                 // proceed only if the caller cleared the review requirement
944                                 // otherwise we unbind because the user didn't approve.
945                                 if (!mAm.getPackageManagerInternalLocked()
946                                         .isPermissionsReviewRequired(
947                                                 serviceRecord.packageName,
948                                                 serviceRecord.userId)) {
949                                     try {
950                                         bringUpServiceLocked(serviceRecord,
951                                                 serviceIntent.getFlags(),
952                                                 callerFg, false, false);
953                                     } catch (RemoteException e) {
954                                         /* ignore - local call */
955                                     }
956                                 } else {
957                                     unbindServiceLocked(connection);
958                                 }
959                             } finally {
960                                 Binder.restoreCallingIdentity(identity);
961                             }
962                         }
963                     }
964                 });
965 
966                 final Intent intent = new Intent(Intent.ACTION_REVIEW_PERMISSIONS);
967                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
968                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
969                 intent.putExtra(Intent.EXTRA_PACKAGE_NAME, s.packageName);
970                 intent.putExtra(Intent.EXTRA_REMOTE_CALLBACK, callback);
971 
972                 if (DEBUG_PERMISSIONS_REVIEW) {
973                     Slog.i(TAG, "u" + s.userId + " Launching permission review for package "
974                             + s.packageName);
975                 }
976 
977                 mAm.mHandler.post(new Runnable() {
978                     @Override
979                     public void run() {
980                         mAm.mContext.startActivityAsUser(intent, new UserHandle(userId));
981                     }
982                 });
983             }
984         }
985 
986         final long origId = Binder.clearCallingIdentity();
987 
988         try {
989             if (unscheduleServiceRestartLocked(s, callerApp.info.uid, false)) {
990                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "BIND SERVICE WHILE RESTART PENDING: "
991                         + s);
992             }
993 
994             if ((flags&Context.BIND_AUTO_CREATE) != 0) {
995                 s.lastActivity = SystemClock.uptimeMillis();
996                 if (!s.hasAutoCreateConnections()) {
997                     // This is the first binding, let the tracker know.
998                     ServiceState stracker = s.getTracker();
999                     if (stracker != null) {
1000                         stracker.setBound(true, mAm.mProcessStats.getMemFactorLocked(),
1001                                 s.lastActivity);
1002                     }
1003                 }
1004             }
1005 
1006             mAm.startAssociationLocked(callerApp.uid, callerApp.processName, callerApp.curProcState,
1007                     s.appInfo.uid, s.name, s.processName);
1008 
1009             AppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);
1010             ConnectionRecord c = new ConnectionRecord(b, activity,
1011                     connection, flags, clientLabel, clientIntent);
1012 
1013             IBinder binder = connection.asBinder();
1014             ArrayList<ConnectionRecord> clist = s.connections.get(binder);
1015             if (clist == null) {
1016                 clist = new ArrayList<ConnectionRecord>();
1017                 s.connections.put(binder, clist);
1018             }
1019             clist.add(c);
1020             b.connections.add(c);
1021             if (activity != null) {
1022                 if (activity.connections == null) {
1023                     activity.connections = new HashSet<ConnectionRecord>();
1024                 }
1025                 activity.connections.add(c);
1026             }
1027             b.client.connections.add(c);
1028             if ((c.flags&Context.BIND_ABOVE_CLIENT) != 0) {
1029                 b.client.hasAboveClient = true;
1030             }
1031             if ((c.flags&Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0) {
1032                 s.whitelistManager = true;
1033             }
1034             if (s.app != null) {
1035                 updateServiceClientActivitiesLocked(s.app, c, true);
1036             }
1037             clist = mServiceConnections.get(binder);
1038             if (clist == null) {
1039                 clist = new ArrayList<ConnectionRecord>();
1040                 mServiceConnections.put(binder, clist);
1041             }
1042             clist.add(c);
1043 
1044             if ((flags&Context.BIND_AUTO_CREATE) != 0) {
1045                 s.lastActivity = SystemClock.uptimeMillis();
1046                 if (bringUpServiceLocked(s, service.getFlags(), callerFg, false,
1047                         permissionsReviewRequired) != null) {
1048                     return 0;
1049                 }
1050             }
1051 
1052             if (s.app != null) {
1053                 if ((flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
1054                     s.app.treatLikeActivity = true;
1055                 }
1056                 if (s.whitelistManager) {
1057                     s.app.whitelistManager = true;
1058                 }
1059                 // This could have made the service more important.
1060                 mAm.updateLruProcessLocked(s.app, s.app.hasClientActivities
1061                         || s.app.treatLikeActivity, b.client);
1062                 mAm.updateOomAdjLocked(s.app);
1063             }
1064 
1065             if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b
1066                     + ": received=" + b.intent.received
1067                     + " apps=" + b.intent.apps.size()
1068                     + " doRebind=" + b.intent.doRebind);
1069 
1070             if (s.app != null && b.intent.received) {
1071                 // Service is already running, so we can immediately
1072                 // publish the connection.
1073                 try {
1074                     c.conn.connected(s.name, b.intent.binder);
1075                 } catch (Exception e) {
1076                     Slog.w(TAG, "Failure sending service " + s.shortName
1077                             + " to connection " + c.conn.asBinder()
1078                             + " (in " + c.binding.client.processName + ")", e);
1079                 }
1080 
1081                 // If this is the first app connected back to this binding,
1082                 // and the service had previously asked to be told when
1083                 // rebound, then do so.
1084                 if (b.intent.apps.size() == 1 && b.intent.doRebind) {
1085                     requestServiceBindingLocked(s, b.intent, callerFg, true);
1086                 }
1087             } else if (!b.intent.requested) {
1088                 requestServiceBindingLocked(s, b.intent, callerFg, false);
1089             }
1090 
1091             getServiceMap(s.userId).ensureNotStartingBackground(s);
1092 
1093         } finally {
1094             Binder.restoreCallingIdentity(origId);
1095         }
1096 
1097         return 1;
1098     }
1099 
foo()1100     private void foo() {
1101 
1102     }
1103 
publishServiceLocked(ServiceRecord r, Intent intent, IBinder service)1104     void publishServiceLocked(ServiceRecord r, Intent intent, IBinder service) {
1105         final long origId = Binder.clearCallingIdentity();
1106         try {
1107             if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "PUBLISHING " + r
1108                     + " " + intent + ": " + service);
1109             if (r != null) {
1110                 Intent.FilterComparison filter
1111                         = new Intent.FilterComparison(intent);
1112                 IntentBindRecord b = r.bindings.get(filter);
1113                 if (b != null && !b.received) {
1114                     b.binder = service;
1115                     b.requested = true;
1116                     b.received = true;
1117                     for (int conni=r.connections.size()-1; conni>=0; conni--) {
1118                         ArrayList<ConnectionRecord> clist = r.connections.valueAt(conni);
1119                         for (int i=0; i<clist.size(); i++) {
1120                             ConnectionRecord c = clist.get(i);
1121                             if (!filter.equals(c.binding.intent.intent)) {
1122                                 if (DEBUG_SERVICE) Slog.v(
1123                                         TAG_SERVICE, "Not publishing to: " + c);
1124                                 if (DEBUG_SERVICE) Slog.v(
1125                                         TAG_SERVICE, "Bound intent: " + c.binding.intent.intent);
1126                                 if (DEBUG_SERVICE) Slog.v(
1127                                         TAG_SERVICE, "Published intent: " + intent);
1128                                 continue;
1129                             }
1130                             if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Publishing to: " + c);
1131                             try {
1132                                 c.conn.connected(r.name, service);
1133                             } catch (Exception e) {
1134                                 Slog.w(TAG, "Failure sending service " + r.name +
1135                                       " to connection " + c.conn.asBinder() +
1136                                       " (in " + c.binding.client.processName + ")", e);
1137                             }
1138                         }
1139                     }
1140                 }
1141 
1142                 serviceDoneExecutingLocked(r, mDestroyingServices.contains(r), false);
1143             }
1144         } finally {
1145             Binder.restoreCallingIdentity(origId);
1146         }
1147     }
1148 
unbindServiceLocked(IServiceConnection connection)1149     boolean unbindServiceLocked(IServiceConnection connection) {
1150         IBinder binder = connection.asBinder();
1151         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "unbindService: conn=" + binder);
1152         ArrayList<ConnectionRecord> clist = mServiceConnections.get(binder);
1153         if (clist == null) {
1154             Slog.w(TAG, "Unbind failed: could not find connection for "
1155                   + connection.asBinder());
1156             return false;
1157         }
1158 
1159         final long origId = Binder.clearCallingIdentity();
1160         try {
1161             while (clist.size() > 0) {
1162                 ConnectionRecord r = clist.get(0);
1163                 removeConnectionLocked(r, null, null);
1164                 if (clist.size() > 0 && clist.get(0) == r) {
1165                     // In case it didn't get removed above, do it now.
1166                     Slog.wtf(TAG, "Connection " + r + " not removed for binder " + binder);
1167                     clist.remove(0);
1168                 }
1169 
1170                 if (r.binding.service.app != null) {
1171                     if (r.binding.service.app.whitelistManager) {
1172                         updateWhitelistManagerLocked(r.binding.service.app);
1173                     }
1174                     // This could have made the service less important.
1175                     if ((r.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) {
1176                         r.binding.service.app.treatLikeActivity = true;
1177                         mAm.updateLruProcessLocked(r.binding.service.app,
1178                                 r.binding.service.app.hasClientActivities
1179                                 || r.binding.service.app.treatLikeActivity, null);
1180                     }
1181                     mAm.updateOomAdjLocked(r.binding.service.app);
1182                 }
1183             }
1184         } finally {
1185             Binder.restoreCallingIdentity(origId);
1186         }
1187 
1188         return true;
1189     }
1190 
unbindFinishedLocked(ServiceRecord r, Intent intent, boolean doRebind)1191     void unbindFinishedLocked(ServiceRecord r, Intent intent, boolean doRebind) {
1192         final long origId = Binder.clearCallingIdentity();
1193         try {
1194             if (r != null) {
1195                 Intent.FilterComparison filter
1196                         = new Intent.FilterComparison(intent);
1197                 IntentBindRecord b = r.bindings.get(filter);
1198                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "unbindFinished in " + r
1199                         + " at " + b + ": apps="
1200                         + (b != null ? b.apps.size() : 0));
1201 
1202                 boolean inDestroying = mDestroyingServices.contains(r);
1203                 if (b != null) {
1204                     if (b.apps.size() > 0 && !inDestroying) {
1205                         // Applications have already bound since the last
1206                         // unbind, so just rebind right here.
1207                         boolean inFg = false;
1208                         for (int i=b.apps.size()-1; i>=0; i--) {
1209                             ProcessRecord client = b.apps.valueAt(i).client;
1210                             if (client != null && client.setSchedGroup
1211                                     != ProcessList.SCHED_GROUP_BACKGROUND) {
1212                                 inFg = true;
1213                                 break;
1214                             }
1215                         }
1216                         try {
1217                             requestServiceBindingLocked(r, b, inFg, true);
1218                         } catch (TransactionTooLargeException e) {
1219                             // Don't pass this back to ActivityThread, it's unrelated.
1220                         }
1221                     } else {
1222                         // Note to tell the service the next time there is
1223                         // a new client.
1224                         b.doRebind = true;
1225                     }
1226                 }
1227 
1228                 serviceDoneExecutingLocked(r, inDestroying, false);
1229             }
1230         } finally {
1231             Binder.restoreCallingIdentity(origId);
1232         }
1233     }
1234 
findServiceLocked(ComponentName name, IBinder token, int userId)1235     private final ServiceRecord findServiceLocked(ComponentName name,
1236             IBinder token, int userId) {
1237         ServiceRecord r = getServiceByName(name, userId);
1238         return r == token ? r : null;
1239     }
1240 
1241     private final class ServiceLookupResult {
1242         final ServiceRecord record;
1243         final String permission;
1244 
ServiceLookupResult(ServiceRecord _record, String _permission)1245         ServiceLookupResult(ServiceRecord _record, String _permission) {
1246             record = _record;
1247             permission = _permission;
1248         }
1249     }
1250 
1251     private class ServiceRestarter implements Runnable {
1252         private ServiceRecord mService;
1253 
setService(ServiceRecord service)1254         void setService(ServiceRecord service) {
1255             mService = service;
1256         }
1257 
run()1258         public void run() {
1259             synchronized(mAm) {
1260                 performServiceRestartLocked(mService);
1261             }
1262         }
1263     }
1264 
retrieveServiceLocked(Intent service, String resolvedType, String callingPackage, int callingPid, int callingUid, int userId, boolean createIfNeeded, boolean callingFromFg, boolean isBindExternal)1265     private ServiceLookupResult retrieveServiceLocked(Intent service,
1266             String resolvedType, String callingPackage, int callingPid, int callingUid, int userId,
1267             boolean createIfNeeded, boolean callingFromFg, boolean isBindExternal) {
1268         ServiceRecord r = null;
1269         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "retrieveServiceLocked: " + service
1270                 + " type=" + resolvedType + " callingUid=" + callingUid);
1271 
1272         userId = mAm.mUserController.handleIncomingUser(callingPid, callingUid, userId, false,
1273                 ActivityManagerService.ALLOW_NON_FULL_IN_PROFILE, "service", null);
1274 
1275         ServiceMap smap = getServiceMap(userId);
1276         final ComponentName comp = service.getComponent();
1277         if (comp != null) {
1278             r = smap.mServicesByName.get(comp);
1279         }
1280         if (r == null && !isBindExternal) {
1281             Intent.FilterComparison filter = new Intent.FilterComparison(service);
1282             r = smap.mServicesByIntent.get(filter);
1283         }
1284         if (r != null && (r.serviceInfo.flags & ServiceInfo.FLAG_EXTERNAL_SERVICE) != 0
1285                 && !callingPackage.equals(r.packageName)) {
1286             // If an external service is running within its own package, other packages
1287             // should not bind to that instance.
1288             r = null;
1289         }
1290         if (r == null) {
1291             try {
1292                 // TODO: come back and remove this assumption to triage all services
1293                 ResolveInfo rInfo = AppGlobals.getPackageManager().resolveService(service,
1294                         resolvedType, ActivityManagerService.STOCK_PM_FLAGS
1295                                 | PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
1296                         userId);
1297                 ServiceInfo sInfo =
1298                     rInfo != null ? rInfo.serviceInfo : null;
1299                 if (sInfo == null) {
1300                     Slog.w(TAG_SERVICE, "Unable to start service " + service + " U=" + userId +
1301                           ": not found");
1302                     return null;
1303                 }
1304                 ComponentName name = new ComponentName(
1305                         sInfo.applicationInfo.packageName, sInfo.name);
1306                 if ((sInfo.flags & ServiceInfo.FLAG_EXTERNAL_SERVICE) != 0) {
1307                     if (isBindExternal) {
1308                         if (!sInfo.exported) {
1309                             throw new SecurityException("BIND_EXTERNAL_SERVICE failed, " + name +
1310                                     " is not exported");
1311                         }
1312                         if ((sInfo.flags & ServiceInfo.FLAG_ISOLATED_PROCESS) == 0) {
1313                             throw new SecurityException("BIND_EXTERNAL_SERVICE failed, " + name +
1314                                     " is not an isolatedProcess");
1315                         }
1316                         // Run the service under the calling package's application.
1317                         ApplicationInfo aInfo = AppGlobals.getPackageManager().getApplicationInfo(
1318                                 callingPackage, ActivityManagerService.STOCK_PM_FLAGS, userId);
1319                         if (aInfo == null) {
1320                             throw new SecurityException("BIND_EXTERNAL_SERVICE failed, " +
1321                                     "could not resolve client package " + callingPackage);
1322                         }
1323                         sInfo = new ServiceInfo(sInfo);
1324                         sInfo.applicationInfo = new ApplicationInfo(sInfo.applicationInfo);
1325                         sInfo.applicationInfo.packageName = aInfo.packageName;
1326                         sInfo.applicationInfo.uid = aInfo.uid;
1327                         name = new ComponentName(aInfo.packageName, name.getClassName());
1328                         service.setComponent(name);
1329                     } else {
1330                         throw new SecurityException("BIND_EXTERNAL_SERVICE required for " +
1331                                 name);
1332                     }
1333                 } else if (isBindExternal) {
1334                     throw new SecurityException("BIND_EXTERNAL_SERVICE failed, " + name +
1335                             " is not an externalService");
1336                 }
1337                 if (userId > 0) {
1338                     if (mAm.isSingleton(sInfo.processName, sInfo.applicationInfo,
1339                             sInfo.name, sInfo.flags)
1340                             && mAm.isValidSingletonCall(callingUid, sInfo.applicationInfo.uid)) {
1341                         userId = 0;
1342                         smap = getServiceMap(0);
1343                     }
1344                     sInfo = new ServiceInfo(sInfo);
1345                     sInfo.applicationInfo = mAm.getAppInfoForUser(sInfo.applicationInfo, userId);
1346                 }
1347                 r = smap.mServicesByName.get(name);
1348                 if (r == null && createIfNeeded) {
1349                     Intent.FilterComparison filter
1350                             = new Intent.FilterComparison(service.cloneFilter());
1351                     ServiceRestarter res = new ServiceRestarter();
1352                     BatteryStatsImpl.Uid.Pkg.Serv ss = null;
1353                     BatteryStatsImpl stats = mAm.mBatteryStatsService.getActiveStatistics();
1354                     synchronized (stats) {
1355                         ss = stats.getServiceStatsLocked(
1356                                 sInfo.applicationInfo.uid, sInfo.packageName,
1357                                 sInfo.name);
1358                     }
1359                     r = new ServiceRecord(mAm, ss, name, filter, sInfo, callingFromFg, res);
1360                     res.setService(r);
1361                     smap.mServicesByName.put(name, r);
1362                     smap.mServicesByIntent.put(filter, r);
1363 
1364                     // Make sure this component isn't in the pending list.
1365                     for (int i=mPendingServices.size()-1; i>=0; i--) {
1366                         ServiceRecord pr = mPendingServices.get(i);
1367                         if (pr.serviceInfo.applicationInfo.uid == sInfo.applicationInfo.uid
1368                                 && pr.name.equals(name)) {
1369                             mPendingServices.remove(i);
1370                         }
1371                     }
1372                 }
1373             } catch (RemoteException ex) {
1374                 // pm is in same process, this will never happen.
1375             }
1376         }
1377         if (r != null) {
1378             if (mAm.checkComponentPermission(r.permission,
1379                     callingPid, callingUid, r.appInfo.uid, r.exported)
1380                     != PackageManager.PERMISSION_GRANTED) {
1381                 if (!r.exported) {
1382                     Slog.w(TAG, "Permission Denial: Accessing service " + r.name
1383                             + " from pid=" + callingPid
1384                             + ", uid=" + callingUid
1385                             + " that is not exported from uid " + r.appInfo.uid);
1386                     return new ServiceLookupResult(null, "not exported from uid "
1387                             + r.appInfo.uid);
1388                 }
1389                 Slog.w(TAG, "Permission Denial: Accessing service " + r.name
1390                         + " from pid=" + callingPid
1391                         + ", uid=" + callingUid
1392                         + " requires " + r.permission);
1393                 return new ServiceLookupResult(null, r.permission);
1394             } else if (r.permission != null && callingPackage != null) {
1395                 final int opCode = AppOpsManager.permissionToOpCode(r.permission);
1396                 if (opCode != AppOpsManager.OP_NONE && mAm.mAppOpsService.noteOperation(
1397                         opCode, callingUid, callingPackage) != AppOpsManager.MODE_ALLOWED) {
1398                     Slog.w(TAG, "Appop Denial: Accessing service " + r.name
1399                             + " from pid=" + callingPid
1400                             + ", uid=" + callingUid
1401                             + " requires appop " + AppOpsManager.opToName(opCode));
1402                     return null;
1403                 }
1404             }
1405 
1406             if (!mAm.mIntentFirewall.checkService(r.name, service, callingUid, callingPid,
1407                     resolvedType, r.appInfo)) {
1408                 return null;
1409             }
1410             return new ServiceLookupResult(r, null);
1411         }
1412         return null;
1413     }
1414 
bumpServiceExecutingLocked(ServiceRecord r, boolean fg, String why)1415     private final void bumpServiceExecutingLocked(ServiceRecord r, boolean fg, String why) {
1416         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, ">>> EXECUTING "
1417                 + why + " of " + r + " in app " + r.app);
1418         else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING, ">>> EXECUTING "
1419                 + why + " of " + r.shortName);
1420         long now = SystemClock.uptimeMillis();
1421         if (r.executeNesting == 0) {
1422             r.executeFg = fg;
1423             ServiceState stracker = r.getTracker();
1424             if (stracker != null) {
1425                 stracker.setExecuting(true, mAm.mProcessStats.getMemFactorLocked(), now);
1426             }
1427             if (r.app != null) {
1428                 r.app.executingServices.add(r);
1429                 r.app.execServicesFg |= fg;
1430                 if (r.app.executingServices.size() == 1) {
1431                     scheduleServiceTimeoutLocked(r.app);
1432                 }
1433             }
1434         } else if (r.app != null && fg && !r.app.execServicesFg) {
1435             r.app.execServicesFg = true;
1436             scheduleServiceTimeoutLocked(r.app);
1437         }
1438         r.executeFg |= fg;
1439         r.executeNesting++;
1440         r.executingStart = now;
1441     }
1442 
requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i, boolean execInFg, boolean rebind)1443     private final boolean requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i,
1444             boolean execInFg, boolean rebind) throws TransactionTooLargeException {
1445         if (r.app == null || r.app.thread == null) {
1446             // If service is not currently running, can't yet bind.
1447             return false;
1448         }
1449         if ((!i.requested || rebind) && i.apps.size() > 0) {
1450             try {
1451                 bumpServiceExecutingLocked(r, execInFg, "bind");
1452                 r.app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE);
1453                 r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind,
1454                         r.app.repProcState);
1455                 if (!rebind) {
1456                     i.requested = true;
1457                 }
1458                 i.hasBound = true;
1459                 i.doRebind = false;
1460             } catch (TransactionTooLargeException e) {
1461                 // Keep the executeNesting count accurate.
1462                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while binding " + r, e);
1463                 final boolean inDestroying = mDestroyingServices.contains(r);
1464                 serviceDoneExecutingLocked(r, inDestroying, inDestroying);
1465                 throw e;
1466             } catch (RemoteException e) {
1467                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while binding " + r);
1468                 // Keep the executeNesting count accurate.
1469                 final boolean inDestroying = mDestroyingServices.contains(r);
1470                 serviceDoneExecutingLocked(r, inDestroying, inDestroying);
1471                 return false;
1472             }
1473         }
1474         return true;
1475     }
1476 
scheduleServiceRestartLocked(ServiceRecord r, boolean allowCancel)1477     private final boolean scheduleServiceRestartLocked(ServiceRecord r,
1478             boolean allowCancel) {
1479         boolean canceled = false;
1480 
1481         if (mAm.isShuttingDownLocked()) {
1482             Slog.w(TAG, "Not scheduling restart of crashed service " + r.shortName
1483                     + " - system is shutting down");
1484             return false;
1485         }
1486 
1487         ServiceMap smap = getServiceMap(r.userId);
1488         if (smap.mServicesByName.get(r.name) != r) {
1489             ServiceRecord cur = smap.mServicesByName.get(r.name);
1490             Slog.wtf(TAG, "Attempting to schedule restart of " + r
1491                     + " when found in map: " + cur);
1492             return false;
1493         }
1494 
1495         final long now = SystemClock.uptimeMillis();
1496 
1497         if ((r.serviceInfo.applicationInfo.flags
1498                 &ApplicationInfo.FLAG_PERSISTENT) == 0) {
1499             long minDuration = SERVICE_RESTART_DURATION;
1500             long resetTime = SERVICE_RESET_RUN_DURATION;
1501 
1502             // Any delivered but not yet finished starts should be put back
1503             // on the pending list.
1504             final int N = r.deliveredStarts.size();
1505             if (N > 0) {
1506                 for (int i=N-1; i>=0; i--) {
1507                     ServiceRecord.StartItem si = r.deliveredStarts.get(i);
1508                     si.removeUriPermissionsLocked();
1509                     if (si.intent == null) {
1510                         // We'll generate this again if needed.
1511                     } else if (!allowCancel || (si.deliveryCount < ServiceRecord.MAX_DELIVERY_COUNT
1512                             && si.doneExecutingCount < ServiceRecord.MAX_DONE_EXECUTING_COUNT)) {
1513                         r.pendingStarts.add(0, si);
1514                         long dur = SystemClock.uptimeMillis() - si.deliveredTime;
1515                         dur *= 2;
1516                         if (minDuration < dur) minDuration = dur;
1517                         if (resetTime < dur) resetTime = dur;
1518                     } else {
1519                         Slog.w(TAG, "Canceling start item " + si.intent + " in service "
1520                                 + r.name);
1521                         canceled = true;
1522                     }
1523                 }
1524                 r.deliveredStarts.clear();
1525             }
1526 
1527             r.totalRestartCount++;
1528             if (r.restartDelay == 0) {
1529                 r.restartCount++;
1530                 r.restartDelay = minDuration;
1531             } else {
1532                 // If it has been a "reasonably long time" since the service
1533                 // was started, then reset our restart duration back to
1534                 // the beginning, so we don't infinitely increase the duration
1535                 // on a service that just occasionally gets killed (which is
1536                 // a normal case, due to process being killed to reclaim memory).
1537                 if (now > (r.restartTime+resetTime)) {
1538                     r.restartCount = 1;
1539                     r.restartDelay = minDuration;
1540                 } else {
1541                     r.restartDelay *= SERVICE_RESTART_DURATION_FACTOR;
1542                     if (r.restartDelay < minDuration) {
1543                         r.restartDelay = minDuration;
1544                     }
1545                 }
1546             }
1547 
1548             r.nextRestartTime = now + r.restartDelay;
1549 
1550             // Make sure that we don't end up restarting a bunch of services
1551             // all at the same time.
1552             boolean repeat;
1553             do {
1554                 repeat = false;
1555                 for (int i=mRestartingServices.size()-1; i>=0; i--) {
1556                     ServiceRecord r2 = mRestartingServices.get(i);
1557                     if (r2 != r && r.nextRestartTime
1558                             >= (r2.nextRestartTime-SERVICE_MIN_RESTART_TIME_BETWEEN)
1559                             && r.nextRestartTime
1560                             < (r2.nextRestartTime+SERVICE_MIN_RESTART_TIME_BETWEEN)) {
1561                         r.nextRestartTime = r2.nextRestartTime + SERVICE_MIN_RESTART_TIME_BETWEEN;
1562                         r.restartDelay = r.nextRestartTime - now;
1563                         repeat = true;
1564                         break;
1565                     }
1566                 }
1567             } while (repeat);
1568 
1569         } else {
1570             // Persistent processes are immediately restarted, so there is no
1571             // reason to hold of on restarting their services.
1572             r.totalRestartCount++;
1573             r.restartCount = 0;
1574             r.restartDelay = 0;
1575             r.nextRestartTime = now;
1576         }
1577 
1578         if (!mRestartingServices.contains(r)) {
1579             r.createdFromFg = false;
1580             mRestartingServices.add(r);
1581             r.makeRestarting(mAm.mProcessStats.getMemFactorLocked(), now);
1582         }
1583 
1584         cancelForegroudNotificationLocked(r);
1585 
1586         mAm.mHandler.removeCallbacks(r.restarter);
1587         mAm.mHandler.postAtTime(r.restarter, r.nextRestartTime);
1588         r.nextRestartTime = SystemClock.uptimeMillis() + r.restartDelay;
1589         Slog.w(TAG, "Scheduling restart of crashed service "
1590                 + r.shortName + " in " + r.restartDelay + "ms");
1591         EventLog.writeEvent(EventLogTags.AM_SCHEDULE_SERVICE_RESTART,
1592                 r.userId, r.shortName, r.restartDelay);
1593 
1594         return canceled;
1595     }
1596 
performServiceRestartLocked(ServiceRecord r)1597     final void performServiceRestartLocked(ServiceRecord r) {
1598         if (!mRestartingServices.contains(r)) {
1599             return;
1600         }
1601         if (!isServiceNeeded(r, false, false)) {
1602             // Paranoia: is this service actually needed?  In theory a service that is not
1603             // needed should never remain on the restart list.  In practice...  well, there
1604             // have been bugs where this happens, and bad things happen because the process
1605             // ends up just being cached, so quickly killed, then restarted again and again.
1606             // Let's not let that happen.
1607             Slog.wtf(TAG, "Restarting service that is not needed: " + r);
1608             return;
1609         }
1610         try {
1611             bringUpServiceLocked(r, r.intent.getIntent().getFlags(), r.createdFromFg, true, false);
1612         } catch (TransactionTooLargeException e) {
1613             // Ignore, it's been logged and nothing upstack cares.
1614         }
1615     }
1616 
unscheduleServiceRestartLocked(ServiceRecord r, int callingUid, boolean force)1617     private final boolean unscheduleServiceRestartLocked(ServiceRecord r, int callingUid,
1618             boolean force) {
1619         if (!force && r.restartDelay == 0) {
1620             return false;
1621         }
1622         // Remove from the restarting list; if the service is currently on the
1623         // restarting list, or the call is coming from another app, then this
1624         // service has become of much more interest so we reset the restart interval.
1625         boolean removed = mRestartingServices.remove(r);
1626         if (removed || callingUid != r.appInfo.uid) {
1627             r.resetRestartCounter();
1628         }
1629         if (removed) {
1630             clearRestartingIfNeededLocked(r);
1631         }
1632         mAm.mHandler.removeCallbacks(r.restarter);
1633         return true;
1634     }
1635 
clearRestartingIfNeededLocked(ServiceRecord r)1636     private void clearRestartingIfNeededLocked(ServiceRecord r) {
1637         if (r.restartTracker != null) {
1638             // If this is the last restarting record with this tracker, then clear
1639             // the tracker's restarting state.
1640             boolean stillTracking = false;
1641             for (int i=mRestartingServices.size()-1; i>=0; i--) {
1642                 if (mRestartingServices.get(i).restartTracker == r.restartTracker) {
1643                     stillTracking = true;
1644                     break;
1645                 }
1646             }
1647             if (!stillTracking) {
1648                 r.restartTracker.setRestarting(false, mAm.mProcessStats.getMemFactorLocked(),
1649                         SystemClock.uptimeMillis());
1650                 r.restartTracker = null;
1651             }
1652         }
1653     }
1654 
bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg, boolean whileRestarting, boolean permissionsReviewRequired)1655     private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg,
1656             boolean whileRestarting, boolean permissionsReviewRequired)
1657             throws TransactionTooLargeException {
1658         //Slog.i(TAG, "Bring up service:");
1659         //r.dump("  ");
1660 
1661         if (r.app != null && r.app.thread != null) {
1662             sendServiceArgsLocked(r, execInFg, false);
1663             return null;
1664         }
1665 
1666         if (!whileRestarting && r.restartDelay > 0) {
1667             // If waiting for a restart, then do nothing.
1668             return null;
1669         }
1670 
1671         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bringing up " + r + " " + r.intent);
1672 
1673         // We are now bringing the service up, so no longer in the
1674         // restarting state.
1675         if (mRestartingServices.remove(r)) {
1676             r.resetRestartCounter();
1677             clearRestartingIfNeededLocked(r);
1678         }
1679 
1680         // Make sure this service is no longer considered delayed, we are starting it now.
1681         if (r.delayed) {
1682             if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "REM FR DELAY LIST (bring up): " + r);
1683             getServiceMap(r.userId).mDelayedStartList.remove(r);
1684             r.delayed = false;
1685         }
1686 
1687         // Make sure that the user who owns this service is started.  If not,
1688         // we don't want to allow it to run.
1689         if (!mAm.mUserController.hasStartedUserState(r.userId)) {
1690             String msg = "Unable to launch app "
1691                     + r.appInfo.packageName + "/"
1692                     + r.appInfo.uid + " for service "
1693                     + r.intent.getIntent() + ": user " + r.userId + " is stopped";
1694             Slog.w(TAG, msg);
1695             bringDownServiceLocked(r);
1696             return msg;
1697         }
1698 
1699         // Service is now being launched, its package can't be stopped.
1700         try {
1701             AppGlobals.getPackageManager().setPackageStoppedState(
1702                     r.packageName, false, r.userId);
1703         } catch (RemoteException e) {
1704         } catch (IllegalArgumentException e) {
1705             Slog.w(TAG, "Failed trying to unstop package "
1706                     + r.packageName + ": " + e);
1707         }
1708 
1709         final boolean isolated = (r.serviceInfo.flags&ServiceInfo.FLAG_ISOLATED_PROCESS) != 0;
1710         final String procName = r.processName;
1711         ProcessRecord app;
1712 
1713         if (!isolated) {
1714             app = mAm.getProcessRecordLocked(procName, r.appInfo.uid, false);
1715             if (DEBUG_MU) Slog.v(TAG_MU, "bringUpServiceLocked: appInfo.uid=" + r.appInfo.uid
1716                         + " app=" + app);
1717             if (app != null && app.thread != null) {
1718                 try {
1719                     app.addPackage(r.appInfo.packageName, r.appInfo.versionCode, mAm.mProcessStats);
1720                     realStartServiceLocked(r, app, execInFg);
1721                     return null;
1722                 } catch (TransactionTooLargeException e) {
1723                     throw e;
1724                 } catch (RemoteException e) {
1725                     Slog.w(TAG, "Exception when starting service " + r.shortName, e);
1726                 }
1727 
1728                 // If a dead object exception was thrown -- fall through to
1729                 // restart the application.
1730             }
1731         } else {
1732             // If this service runs in an isolated process, then each time
1733             // we call startProcessLocked() we will get a new isolated
1734             // process, starting another process if we are currently waiting
1735             // for a previous process to come up.  To deal with this, we store
1736             // in the service any current isolated process it is running in or
1737             // waiting to have come up.
1738             app = r.isolatedProc;
1739         }
1740 
1741         // Not running -- get it started, and enqueue this service record
1742         // to be executed when the app comes up.
1743         if (app == null && !permissionsReviewRequired) {
1744             if ((app=mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
1745                     "service", r.name, false, isolated, false)) == null) {
1746                 String msg = "Unable to launch app "
1747                         + r.appInfo.packageName + "/"
1748                         + r.appInfo.uid + " for service "
1749                         + r.intent.getIntent() + ": process is bad";
1750                 Slog.w(TAG, msg);
1751                 bringDownServiceLocked(r);
1752                 return msg;
1753             }
1754             if (isolated) {
1755                 r.isolatedProc = app;
1756             }
1757         }
1758 
1759         if (!mPendingServices.contains(r)) {
1760             mPendingServices.add(r);
1761         }
1762 
1763         if (r.delayedStop) {
1764             // Oh and hey we've already been asked to stop!
1765             r.delayedStop = false;
1766             if (r.startRequested) {
1767                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
1768                         "Applying delayed stop (in bring up): " + r);
1769                 stopServiceLocked(r);
1770             }
1771         }
1772 
1773         return null;
1774     }
1775 
requestServiceBindingsLocked(ServiceRecord r, boolean execInFg)1776     private final void requestServiceBindingsLocked(ServiceRecord r, boolean execInFg)
1777             throws TransactionTooLargeException {
1778         for (int i=r.bindings.size()-1; i>=0; i--) {
1779             IntentBindRecord ibr = r.bindings.valueAt(i);
1780             if (!requestServiceBindingLocked(r, ibr, execInFg, false)) {
1781                 break;
1782             }
1783         }
1784     }
1785 
realStartServiceLocked(ServiceRecord r, ProcessRecord app, boolean execInFg)1786     private final void realStartServiceLocked(ServiceRecord r,
1787             ProcessRecord app, boolean execInFg) throws RemoteException {
1788         if (app.thread == null) {
1789             throw new RemoteException();
1790         }
1791         if (DEBUG_MU)
1792             Slog.v(TAG_MU, "realStartServiceLocked, ServiceRecord.uid = " + r.appInfo.uid
1793                     + ", ProcessRecord.uid = " + app.uid);
1794         r.app = app;
1795         r.restartTime = r.lastActivity = SystemClock.uptimeMillis();
1796 
1797         final boolean newService = app.services.add(r);
1798         bumpServiceExecutingLocked(r, execInFg, "create");
1799         mAm.updateLruProcessLocked(app, false, null);
1800         mAm.updateOomAdjLocked();
1801 
1802         boolean created = false;
1803         try {
1804             if (LOG_SERVICE_START_STOP) {
1805                 String nameTerm;
1806                 int lastPeriod = r.shortName.lastIndexOf('.');
1807                 nameTerm = lastPeriod >= 0 ? r.shortName.substring(lastPeriod) : r.shortName;
1808                 EventLogTags.writeAmCreateService(
1809                         r.userId, System.identityHashCode(r), nameTerm, r.app.uid, r.app.pid);
1810             }
1811             synchronized (r.stats.getBatteryStats()) {
1812                 r.stats.startLaunchedLocked();
1813             }
1814             mAm.notifyPackageUse(r.serviceInfo.packageName,
1815                                  PackageManager.NOTIFY_PACKAGE_USE_SERVICE);
1816             app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE);
1817             app.thread.scheduleCreateService(r, r.serviceInfo,
1818                     mAm.compatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo),
1819                     app.repProcState);
1820             r.postNotification();
1821             created = true;
1822         } catch (DeadObjectException e) {
1823             Slog.w(TAG, "Application dead when creating service " + r);
1824             mAm.appDiedLocked(app);
1825             throw e;
1826         } finally {
1827             if (!created) {
1828                 // Keep the executeNesting count accurate.
1829                 final boolean inDestroying = mDestroyingServices.contains(r);
1830                 serviceDoneExecutingLocked(r, inDestroying, inDestroying);
1831 
1832                 // Cleanup.
1833                 if (newService) {
1834                     app.services.remove(r);
1835                     r.app = null;
1836                 }
1837 
1838                 // Retry.
1839                 if (!inDestroying) {
1840                     scheduleServiceRestartLocked(r, false);
1841                 }
1842             }
1843         }
1844 
1845         if (r.whitelistManager) {
1846             app.whitelistManager = true;
1847         }
1848 
1849         requestServiceBindingsLocked(r, execInFg);
1850 
1851         updateServiceClientActivitiesLocked(app, null, true);
1852 
1853         // If the service is in the started state, and there are no
1854         // pending arguments, then fake up one so its onStartCommand() will
1855         // be called.
1856         if (r.startRequested && r.callStart && r.pendingStarts.size() == 0) {
1857             r.pendingStarts.add(new ServiceRecord.StartItem(r, false, r.makeNextStartId(),
1858                     null, null));
1859         }
1860 
1861         sendServiceArgsLocked(r, execInFg, true);
1862 
1863         if (r.delayed) {
1864             if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "REM FR DELAY LIST (new proc): " + r);
1865             getServiceMap(r.userId).mDelayedStartList.remove(r);
1866             r.delayed = false;
1867         }
1868 
1869         if (r.delayedStop) {
1870             // Oh and hey we've already been asked to stop!
1871             r.delayedStop = false;
1872             if (r.startRequested) {
1873                 if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE,
1874                         "Applying delayed stop (from start): " + r);
1875                 stopServiceLocked(r);
1876             }
1877         }
1878     }
1879 
sendServiceArgsLocked(ServiceRecord r, boolean execInFg, boolean oomAdjusted)1880     private final void sendServiceArgsLocked(ServiceRecord r, boolean execInFg,
1881             boolean oomAdjusted) throws TransactionTooLargeException {
1882         final int N = r.pendingStarts.size();
1883         if (N == 0) {
1884             return;
1885         }
1886 
1887         while (r.pendingStarts.size() > 0) {
1888             Exception caughtException = null;
1889             ServiceRecord.StartItem si = null;
1890             try {
1891                 si = r.pendingStarts.remove(0);
1892                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Sending arguments to: "
1893                         + r + " " + r.intent + " args=" + si.intent);
1894                 if (si.intent == null && N > 1) {
1895                     // If somehow we got a dummy null intent in the middle,
1896                     // then skip it.  DO NOT skip a null intent when it is
1897                     // the only one in the list -- this is to support the
1898                     // onStartCommand(null) case.
1899                     continue;
1900                 }
1901                 si.deliveredTime = SystemClock.uptimeMillis();
1902                 r.deliveredStarts.add(si);
1903                 si.deliveryCount++;
1904                 if (si.neededGrants != null) {
1905                     mAm.grantUriPermissionUncheckedFromIntentLocked(si.neededGrants,
1906                             si.getUriPermissionsLocked());
1907                 }
1908                 bumpServiceExecutingLocked(r, execInFg, "start");
1909                 if (!oomAdjusted) {
1910                     oomAdjusted = true;
1911                     mAm.updateOomAdjLocked(r.app);
1912                 }
1913                 int flags = 0;
1914                 if (si.deliveryCount > 1) {
1915                     flags |= Service.START_FLAG_RETRY;
1916                 }
1917                 if (si.doneExecutingCount > 0) {
1918                     flags |= Service.START_FLAG_REDELIVERY;
1919                 }
1920                 r.app.thread.scheduleServiceArgs(r, si.taskRemoved, si.id, flags, si.intent);
1921             } catch (TransactionTooLargeException e) {
1922                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Transaction too large: intent="
1923                         + si.intent);
1924                 caughtException = e;
1925             } catch (RemoteException e) {
1926                 // Remote process gone...  we'll let the normal cleanup take care of this.
1927                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Crashed while sending args: " + r);
1928                 caughtException = e;
1929             } catch (Exception e) {
1930                 Slog.w(TAG, "Unexpected exception", e);
1931                 caughtException = e;
1932             }
1933 
1934             if (caughtException != null) {
1935                 // Keep nesting count correct
1936                 final boolean inDestroying = mDestroyingServices.contains(r);
1937                 serviceDoneExecutingLocked(r, inDestroying, inDestroying);
1938                 if (caughtException instanceof TransactionTooLargeException) {
1939                     throw (TransactionTooLargeException)caughtException;
1940                 }
1941                 break;
1942             }
1943         }
1944     }
1945 
isServiceNeeded(ServiceRecord r, boolean knowConn, boolean hasConn)1946     private final boolean isServiceNeeded(ServiceRecord r, boolean knowConn, boolean hasConn) {
1947         // Are we still explicitly being asked to run?
1948         if (r.startRequested) {
1949             return true;
1950         }
1951 
1952         // Is someone still bound to us keepign us running?
1953         if (!knowConn) {
1954             hasConn = r.hasAutoCreateConnections();
1955         }
1956         if (hasConn) {
1957             return true;
1958         }
1959 
1960         return false;
1961     }
1962 
bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn, boolean hasConn)1963     private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn,
1964             boolean hasConn) {
1965         //Slog.i(TAG, "Bring down service:");
1966         //r.dump("  ");
1967 
1968         if (isServiceNeeded(r, knowConn, hasConn)) {
1969             return;
1970         }
1971 
1972         // Are we in the process of launching?
1973         if (mPendingServices.contains(r)) {
1974             return;
1975         }
1976 
1977         bringDownServiceLocked(r);
1978     }
1979 
bringDownServiceLocked(ServiceRecord r)1980     private final void bringDownServiceLocked(ServiceRecord r) {
1981         //Slog.i(TAG, "Bring down service:");
1982         //r.dump("  ");
1983 
1984         // Report to all of the connections that the service is no longer
1985         // available.
1986         for (int conni=r.connections.size()-1; conni>=0; conni--) {
1987             ArrayList<ConnectionRecord> c = r.connections.valueAt(conni);
1988             for (int i=0; i<c.size(); i++) {
1989                 ConnectionRecord cr = c.get(i);
1990                 // There is still a connection to the service that is
1991                 // being brought down.  Mark it as dead.
1992                 cr.serviceDead = true;
1993                 try {
1994                     cr.conn.connected(r.name, null);
1995                 } catch (Exception e) {
1996                     Slog.w(TAG, "Failure disconnecting service " + r.name +
1997                           " to connection " + c.get(i).conn.asBinder() +
1998                           " (in " + c.get(i).binding.client.processName + ")", e);
1999                 }
2000             }
2001         }
2002 
2003         // Tell the service that it has been unbound.
2004         if (r.app != null && r.app.thread != null) {
2005             for (int i=r.bindings.size()-1; i>=0; i--) {
2006                 IntentBindRecord ibr = r.bindings.valueAt(i);
2007                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bringing down binding " + ibr
2008                         + ": hasBound=" + ibr.hasBound);
2009                 if (ibr.hasBound) {
2010                     try {
2011                         bumpServiceExecutingLocked(r, false, "bring down unbind");
2012                         mAm.updateOomAdjLocked(r.app);
2013                         ibr.hasBound = false;
2014                         r.app.thread.scheduleUnbindService(r,
2015                                 ibr.intent.getIntent());
2016                     } catch (Exception e) {
2017                         Slog.w(TAG, "Exception when unbinding service "
2018                                 + r.shortName, e);
2019                         serviceProcessGoneLocked(r);
2020                     }
2021                 }
2022             }
2023         }
2024 
2025         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bringing down " + r + " " + r.intent);
2026         r.destroyTime = SystemClock.uptimeMillis();
2027         if (LOG_SERVICE_START_STOP) {
2028             EventLogTags.writeAmDestroyService(
2029                     r.userId, System.identityHashCode(r), (r.app != null) ? r.app.pid : -1);
2030         }
2031 
2032         final ServiceMap smap = getServiceMap(r.userId);
2033         smap.mServicesByName.remove(r.name);
2034         smap.mServicesByIntent.remove(r.intent);
2035         r.totalRestartCount = 0;
2036         unscheduleServiceRestartLocked(r, 0, true);
2037 
2038         // Also make sure it is not on the pending list.
2039         for (int i=mPendingServices.size()-1; i>=0; i--) {
2040             if (mPendingServices.get(i) == r) {
2041                 mPendingServices.remove(i);
2042                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Removed pending: " + r);
2043             }
2044         }
2045 
2046         cancelForegroudNotificationLocked(r);
2047         r.isForeground = false;
2048         r.foregroundId = 0;
2049         r.foregroundNoti = null;
2050 
2051         // Clear start entries.
2052         r.clearDeliveredStartsLocked();
2053         r.pendingStarts.clear();
2054 
2055         if (r.app != null) {
2056             synchronized (r.stats.getBatteryStats()) {
2057                 r.stats.stopLaunchedLocked();
2058             }
2059             r.app.services.remove(r);
2060             if (r.whitelistManager) {
2061                 updateWhitelistManagerLocked(r.app);
2062             }
2063             if (r.app.thread != null) {
2064                 updateServiceForegroundLocked(r.app, false);
2065                 try {
2066                     bumpServiceExecutingLocked(r, false, "destroy");
2067                     mDestroyingServices.add(r);
2068                     r.destroying = true;
2069                     mAm.updateOomAdjLocked(r.app);
2070                     r.app.thread.scheduleStopService(r);
2071                 } catch (Exception e) {
2072                     Slog.w(TAG, "Exception when destroying service "
2073                             + r.shortName, e);
2074                     serviceProcessGoneLocked(r);
2075                 }
2076             } else {
2077                 if (DEBUG_SERVICE) Slog.v(
2078                     TAG_SERVICE, "Removed service that has no process: " + r);
2079             }
2080         } else {
2081             if (DEBUG_SERVICE) Slog.v(
2082                 TAG_SERVICE, "Removed service that is not running: " + r);
2083         }
2084 
2085         if (r.bindings.size() > 0) {
2086             r.bindings.clear();
2087         }
2088 
2089         if (r.restarter instanceof ServiceRestarter) {
2090            ((ServiceRestarter)r.restarter).setService(null);
2091         }
2092 
2093         int memFactor = mAm.mProcessStats.getMemFactorLocked();
2094         long now = SystemClock.uptimeMillis();
2095         if (r.tracker != null) {
2096             r.tracker.setStarted(false, memFactor, now);
2097             r.tracker.setBound(false, memFactor, now);
2098             if (r.executeNesting == 0) {
2099                 r.tracker.clearCurrentOwner(r, false);
2100                 r.tracker = null;
2101             }
2102         }
2103 
2104         smap.ensureNotStartingBackground(r);
2105     }
2106 
removeConnectionLocked( ConnectionRecord c, ProcessRecord skipApp, ActivityRecord skipAct)2107     void removeConnectionLocked(
2108         ConnectionRecord c, ProcessRecord skipApp, ActivityRecord skipAct) {
2109         IBinder binder = c.conn.asBinder();
2110         AppBindRecord b = c.binding;
2111         ServiceRecord s = b.service;
2112         ArrayList<ConnectionRecord> clist = s.connections.get(binder);
2113         if (clist != null) {
2114             clist.remove(c);
2115             if (clist.size() == 0) {
2116                 s.connections.remove(binder);
2117             }
2118         }
2119         b.connections.remove(c);
2120         if (c.activity != null && c.activity != skipAct) {
2121             if (c.activity.connections != null) {
2122                 c.activity.connections.remove(c);
2123             }
2124         }
2125         if (b.client != skipApp) {
2126             b.client.connections.remove(c);
2127             if ((c.flags&Context.BIND_ABOVE_CLIENT) != 0) {
2128                 b.client.updateHasAboveClientLocked();
2129             }
2130             // If this connection requested whitelist management, see if we should
2131             // now clear that state.
2132             if ((c.flags&Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0) {
2133                 s.updateWhitelistManager();
2134                 if (!s.whitelistManager && s.app != null) {
2135                     updateWhitelistManagerLocked(s.app);
2136                 }
2137             }
2138             if (s.app != null) {
2139                 updateServiceClientActivitiesLocked(s.app, c, true);
2140             }
2141         }
2142         clist = mServiceConnections.get(binder);
2143         if (clist != null) {
2144             clist.remove(c);
2145             if (clist.size() == 0) {
2146                 mServiceConnections.remove(binder);
2147             }
2148         }
2149 
2150         mAm.stopAssociationLocked(b.client.uid, b.client.processName, s.appInfo.uid, s.name);
2151 
2152         if (b.connections.size() == 0) {
2153             b.intent.apps.remove(b.client);
2154         }
2155 
2156         if (!c.serviceDead) {
2157             if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Disconnecting binding " + b.intent
2158                     + ": shouldUnbind=" + b.intent.hasBound);
2159             if (s.app != null && s.app.thread != null && b.intent.apps.size() == 0
2160                     && b.intent.hasBound) {
2161                 try {
2162                     bumpServiceExecutingLocked(s, false, "unbind");
2163                     if (b.client != s.app && (c.flags&Context.BIND_WAIVE_PRIORITY) == 0
2164                             && s.app.setProcState <= ActivityManager.PROCESS_STATE_RECEIVER) {
2165                         // If this service's process is not already in the cached list,
2166                         // then update it in the LRU list here because this may be causing
2167                         // it to go down there and we want it to start out near the top.
2168                         mAm.updateLruProcessLocked(s.app, false, null);
2169                     }
2170                     mAm.updateOomAdjLocked(s.app);
2171                     b.intent.hasBound = false;
2172                     // Assume the client doesn't want to know about a rebind;
2173                     // we will deal with that later if it asks for one.
2174                     b.intent.doRebind = false;
2175                     s.app.thread.scheduleUnbindService(s, b.intent.intent.getIntent());
2176                 } catch (Exception e) {
2177                     Slog.w(TAG, "Exception when unbinding service " + s.shortName, e);
2178                     serviceProcessGoneLocked(s);
2179                 }
2180             }
2181 
2182             // If unbound while waiting to start, remove the pending service
2183             mPendingServices.remove(s);
2184 
2185             if ((c.flags&Context.BIND_AUTO_CREATE) != 0) {
2186                 boolean hasAutoCreate = s.hasAutoCreateConnections();
2187                 if (!hasAutoCreate) {
2188                     if (s.tracker != null) {
2189                         s.tracker.setBound(false, mAm.mProcessStats.getMemFactorLocked(),
2190                                 SystemClock.uptimeMillis());
2191                     }
2192                 }
2193                 bringDownServiceIfNeededLocked(s, true, hasAutoCreate);
2194             }
2195         }
2196     }
2197 
serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res)2198     void serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res) {
2199         boolean inDestroying = mDestroyingServices.contains(r);
2200         if (r != null) {
2201             if (type == ActivityThread.SERVICE_DONE_EXECUTING_START) {
2202                 // This is a call from a service start...  take care of
2203                 // book-keeping.
2204                 r.callStart = true;
2205                 switch (res) {
2206                     case Service.START_STICKY_COMPATIBILITY:
2207                     case Service.START_STICKY: {
2208                         // We are done with the associated start arguments.
2209                         r.findDeliveredStart(startId, true);
2210                         // Don't stop if killed.
2211                         r.stopIfKilled = false;
2212                         break;
2213                     }
2214                     case Service.START_NOT_STICKY: {
2215                         // We are done with the associated start arguments.
2216                         r.findDeliveredStart(startId, true);
2217                         if (r.getLastStartId() == startId) {
2218                             // There is no more work, and this service
2219                             // doesn't want to hang around if killed.
2220                             r.stopIfKilled = true;
2221                         }
2222                         break;
2223                     }
2224                     case Service.START_REDELIVER_INTENT: {
2225                         // We'll keep this item until they explicitly
2226                         // call stop for it, but keep track of the fact
2227                         // that it was delivered.
2228                         ServiceRecord.StartItem si = r.findDeliveredStart(startId, false);
2229                         if (si != null) {
2230                             si.deliveryCount = 0;
2231                             si.doneExecutingCount++;
2232                             // Don't stop if killed.
2233                             r.stopIfKilled = true;
2234                         }
2235                         break;
2236                     }
2237                     case Service.START_TASK_REMOVED_COMPLETE: {
2238                         // Special processing for onTaskRemoved().  Don't
2239                         // impact normal onStartCommand() processing.
2240                         r.findDeliveredStart(startId, true);
2241                         break;
2242                     }
2243                     default:
2244                         throw new IllegalArgumentException(
2245                                 "Unknown service start result: " + res);
2246                 }
2247                 if (res == Service.START_STICKY_COMPATIBILITY) {
2248                     r.callStart = false;
2249                 }
2250             } else if (type == ActivityThread.SERVICE_DONE_EXECUTING_STOP) {
2251                 // This is the final call from destroying the service...  we should
2252                 // actually be getting rid of the service at this point.  Do some
2253                 // validation of its state, and ensure it will be fully removed.
2254                 if (!inDestroying) {
2255                     // Not sure what else to do with this...  if it is not actually in the
2256                     // destroying list, we don't need to make sure to remove it from it.
2257                     // If the app is null, then it was probably removed because the process died,
2258                     // otherwise wtf
2259                     if (r.app != null) {
2260                         Slog.w(TAG, "Service done with onDestroy, but not inDestroying: "
2261                                 + r + ", app=" + r.app);
2262                     }
2263                 } else if (r.executeNesting != 1) {
2264                     Slog.w(TAG, "Service done with onDestroy, but executeNesting="
2265                             + r.executeNesting + ": " + r);
2266                     // Fake it to keep from ANR due to orphaned entry.
2267                     r.executeNesting = 1;
2268                 }
2269             }
2270             final long origId = Binder.clearCallingIdentity();
2271             serviceDoneExecutingLocked(r, inDestroying, inDestroying);
2272             Binder.restoreCallingIdentity(origId);
2273         } else {
2274             Slog.w(TAG, "Done executing unknown service from pid "
2275                     + Binder.getCallingPid());
2276         }
2277     }
2278 
serviceProcessGoneLocked(ServiceRecord r)2279     private void serviceProcessGoneLocked(ServiceRecord r) {
2280         if (r.tracker != null) {
2281             int memFactor = mAm.mProcessStats.getMemFactorLocked();
2282             long now = SystemClock.uptimeMillis();
2283             r.tracker.setExecuting(false, memFactor, now);
2284             r.tracker.setBound(false, memFactor, now);
2285             r.tracker.setStarted(false, memFactor, now);
2286         }
2287         serviceDoneExecutingLocked(r, true, true);
2288     }
2289 
serviceDoneExecutingLocked(ServiceRecord r, boolean inDestroying, boolean finishing)2290     private void serviceDoneExecutingLocked(ServiceRecord r, boolean inDestroying,
2291             boolean finishing) {
2292         if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "<<< DONE EXECUTING " + r
2293                 + ": nesting=" + r.executeNesting
2294                 + ", inDestroying=" + inDestroying + ", app=" + r.app);
2295         else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING,
2296                 "<<< DONE EXECUTING " + r.shortName);
2297         r.executeNesting--;
2298         if (r.executeNesting <= 0) {
2299             if (r.app != null) {
2300                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
2301                         "Nesting at 0 of " + r.shortName);
2302                 r.app.execServicesFg = false;
2303                 r.app.executingServices.remove(r);
2304                 if (r.app.executingServices.size() == 0) {
2305                     if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING,
2306                             "No more executingServices of " + r.shortName);
2307                     mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_TIMEOUT_MSG, r.app);
2308                 } else if (r.executeFg) {
2309                     // Need to re-evaluate whether the app still needs to be in the foreground.
2310                     for (int i=r.app.executingServices.size()-1; i>=0; i--) {
2311                         if (r.app.executingServices.valueAt(i).executeFg) {
2312                             r.app.execServicesFg = true;
2313                             break;
2314                         }
2315                     }
2316                 }
2317                 if (inDestroying) {
2318                     if (DEBUG_SERVICE) Slog.v(TAG_SERVICE,
2319                             "doneExecuting remove destroying " + r);
2320                     mDestroyingServices.remove(r);
2321                     r.bindings.clear();
2322                 }
2323                 mAm.updateOomAdjLocked(r.app);
2324             }
2325             r.executeFg = false;
2326             if (r.tracker != null) {
2327                 r.tracker.setExecuting(false, mAm.mProcessStats.getMemFactorLocked(),
2328                         SystemClock.uptimeMillis());
2329                 if (finishing) {
2330                     r.tracker.clearCurrentOwner(r, false);
2331                     r.tracker = null;
2332                 }
2333             }
2334             if (finishing) {
2335                 if (r.app != null && !r.app.persistent) {
2336                     r.app.services.remove(r);
2337                     if (r.whitelistManager) {
2338                         updateWhitelistManagerLocked(r.app);
2339                     }
2340                 }
2341                 r.app = null;
2342             }
2343         }
2344     }
2345 
attachApplicationLocked(ProcessRecord proc, String processName)2346     boolean attachApplicationLocked(ProcessRecord proc, String processName)
2347             throws RemoteException {
2348         boolean didSomething = false;
2349         // Collect any services that are waiting for this process to come up.
2350         if (mPendingServices.size() > 0) {
2351             ServiceRecord sr = null;
2352             try {
2353                 for (int i=0; i<mPendingServices.size(); i++) {
2354                     sr = mPendingServices.get(i);
2355                     if (proc != sr.isolatedProc && (proc.uid != sr.appInfo.uid
2356                             || !processName.equals(sr.processName))) {
2357                         continue;
2358                     }
2359 
2360                     mPendingServices.remove(i);
2361                     i--;
2362                     proc.addPackage(sr.appInfo.packageName, sr.appInfo.versionCode,
2363                             mAm.mProcessStats);
2364                     realStartServiceLocked(sr, proc, sr.createdFromFg);
2365                     didSomething = true;
2366                     if (!isServiceNeeded(sr, false, false)) {
2367                         // We were waiting for this service to start, but it is actually no
2368                         // longer needed.  This could happen because bringDownServiceIfNeeded
2369                         // won't bring down a service that is pending...  so now the pending
2370                         // is done, so let's drop it.
2371                         bringDownServiceLocked(sr);
2372                     }
2373                 }
2374             } catch (RemoteException e) {
2375                 Slog.w(TAG, "Exception in new application when starting service "
2376                         + sr.shortName, e);
2377                 throw e;
2378             }
2379         }
2380         // Also, if there are any services that are waiting to restart and
2381         // would run in this process, now is a good time to start them.  It would
2382         // be weird to bring up the process but arbitrarily not let the services
2383         // run at this point just because their restart time hasn't come up.
2384         if (mRestartingServices.size() > 0) {
2385             ServiceRecord sr;
2386             for (int i=0; i<mRestartingServices.size(); i++) {
2387                 sr = mRestartingServices.get(i);
2388                 if (proc != sr.isolatedProc && (proc.uid != sr.appInfo.uid
2389                         || !processName.equals(sr.processName))) {
2390                     continue;
2391                 }
2392                 mAm.mHandler.removeCallbacks(sr.restarter);
2393                 mAm.mHandler.post(sr.restarter);
2394             }
2395         }
2396         return didSomething;
2397     }
2398 
processStartTimedOutLocked(ProcessRecord proc)2399     void processStartTimedOutLocked(ProcessRecord proc) {
2400         for (int i=0; i<mPendingServices.size(); i++) {
2401             ServiceRecord sr = mPendingServices.get(i);
2402             if ((proc.uid == sr.appInfo.uid
2403                     && proc.processName.equals(sr.processName))
2404                     || sr.isolatedProc == proc) {
2405                 Slog.w(TAG, "Forcing bringing down service: " + sr);
2406                 sr.isolatedProc = null;
2407                 mPendingServices.remove(i);
2408                 i--;
2409                 bringDownServiceLocked(sr);
2410             }
2411         }
2412     }
2413 
collectPackageServicesLocked(String packageName, Set<String> filterByClasses, boolean evenPersistent, boolean doit, boolean killProcess, ArrayMap<ComponentName, ServiceRecord> services)2414     private boolean collectPackageServicesLocked(String packageName, Set<String> filterByClasses,
2415             boolean evenPersistent, boolean doit, boolean killProcess,
2416             ArrayMap<ComponentName, ServiceRecord> services) {
2417         boolean didSomething = false;
2418         for (int i = services.size() - 1; i >= 0; i--) {
2419             ServiceRecord service = services.valueAt(i);
2420             final boolean sameComponent = packageName == null
2421                     || (service.packageName.equals(packageName)
2422                         && (filterByClasses == null
2423                             || filterByClasses.contains(service.name.getClassName())));
2424             if (sameComponent
2425                     && (service.app == null || evenPersistent || !service.app.persistent)) {
2426                 if (!doit) {
2427                     return true;
2428                 }
2429                 didSomething = true;
2430                 Slog.i(TAG, "  Force stopping service " + service);
2431                 if (service.app != null) {
2432                     service.app.removed = killProcess;
2433                     if (!service.app.persistent) {
2434                         service.app.services.remove(service);
2435                         if (service.whitelistManager) {
2436                             updateWhitelistManagerLocked(service.app);
2437                         }
2438                     }
2439                 }
2440                 service.app = null;
2441                 service.isolatedProc = null;
2442                 if (mTmpCollectionResults == null) {
2443                     mTmpCollectionResults = new ArrayList<>();
2444                 }
2445                 mTmpCollectionResults.add(service);
2446             }
2447         }
2448         return didSomething;
2449     }
2450 
bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses, int userId, boolean evenPersistent, boolean killProcess, boolean doit)2451     boolean bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses,
2452             int userId, boolean evenPersistent, boolean killProcess, boolean doit) {
2453         boolean didSomething = false;
2454 
2455         if (mTmpCollectionResults != null) {
2456             mTmpCollectionResults.clear();
2457         }
2458 
2459         if (userId == UserHandle.USER_ALL) {
2460             for (int i = mServiceMap.size() - 1; i >= 0; i--) {
2461                 didSomething |= collectPackageServicesLocked(packageName, filterByClasses,
2462                         evenPersistent, doit, killProcess, mServiceMap.valueAt(i).mServicesByName);
2463                 if (!doit && didSomething) {
2464                     return true;
2465                 }
2466             }
2467         } else {
2468             ServiceMap smap = mServiceMap.get(userId);
2469             if (smap != null) {
2470                 ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByName;
2471                 didSomething = collectPackageServicesLocked(packageName, filterByClasses,
2472                         evenPersistent, doit, killProcess, items);
2473             }
2474         }
2475 
2476         if (mTmpCollectionResults != null) {
2477             for (int i = mTmpCollectionResults.size() - 1; i >= 0; i--) {
2478                 bringDownServiceLocked(mTmpCollectionResults.get(i));
2479             }
2480             mTmpCollectionResults.clear();
2481         }
2482         return didSomething;
2483     }
2484 
cleanUpRemovedTaskLocked(TaskRecord tr, ComponentName component, Intent baseIntent)2485     void cleanUpRemovedTaskLocked(TaskRecord tr, ComponentName component, Intent baseIntent) {
2486         ArrayList<ServiceRecord> services = new ArrayList<>();
2487         ArrayMap<ComponentName, ServiceRecord> alls = getServices(tr.userId);
2488         for (int i = alls.size() - 1; i >= 0; i--) {
2489             ServiceRecord sr = alls.valueAt(i);
2490             if (sr.packageName.equals(component.getPackageName())) {
2491                 services.add(sr);
2492             }
2493         }
2494 
2495         // Take care of any running services associated with the app.
2496         for (int i = services.size() - 1; i >= 0; i--) {
2497             ServiceRecord sr = services.get(i);
2498             if (sr.startRequested) {
2499                 if ((sr.serviceInfo.flags&ServiceInfo.FLAG_STOP_WITH_TASK) != 0) {
2500                     Slog.i(TAG, "Stopping service " + sr.shortName + ": remove task");
2501                     stopServiceLocked(sr);
2502                 } else {
2503                     sr.pendingStarts.add(new ServiceRecord.StartItem(sr, true,
2504                             sr.makeNextStartId(), baseIntent, null));
2505                     if (sr.app != null && sr.app.thread != null) {
2506                         // We always run in the foreground, since this is called as
2507                         // part of the "remove task" UI operation.
2508                         try {
2509                             sendServiceArgsLocked(sr, true, false);
2510                         } catch (TransactionTooLargeException e) {
2511                             // Ignore, keep going.
2512                         }
2513                     }
2514                 }
2515             }
2516         }
2517     }
2518 
killServicesLocked(ProcessRecord app, boolean allowRestart)2519     final void killServicesLocked(ProcessRecord app, boolean allowRestart) {
2520         // Report disconnected services.
2521         if (false) {
2522             // XXX we are letting the client link to the service for
2523             // death notifications.
2524             if (app.services.size() > 0) {
2525                 Iterator<ServiceRecord> it = app.services.iterator();
2526                 while (it.hasNext()) {
2527                     ServiceRecord r = it.next();
2528                     for (int conni=r.connections.size()-1; conni>=0; conni--) {
2529                         ArrayList<ConnectionRecord> cl = r.connections.valueAt(conni);
2530                         for (int i=0; i<cl.size(); i++) {
2531                             ConnectionRecord c = cl.get(i);
2532                             if (c.binding.client != app) {
2533                                 try {
2534                                     //c.conn.connected(r.className, null);
2535                                 } catch (Exception e) {
2536                                     // todo: this should be asynchronous!
2537                                     Slog.w(TAG, "Exception thrown disconnected servce "
2538                                           + r.shortName
2539                                           + " from app " + app.processName, e);
2540                                 }
2541                             }
2542                         }
2543                     }
2544                 }
2545             }
2546         }
2547 
2548         // Clean up any connections this application has to other services.
2549         for (int i = app.connections.size() - 1; i >= 0; i--) {
2550             ConnectionRecord r = app.connections.valueAt(i);
2551             removeConnectionLocked(r, app, null);
2552         }
2553         updateServiceConnectionActivitiesLocked(app);
2554         app.connections.clear();
2555 
2556         app.whitelistManager = false;
2557 
2558         // Clear app state from services.
2559         for (int i = app.services.size() - 1; i >= 0; i--) {
2560             ServiceRecord sr = app.services.valueAt(i);
2561             synchronized (sr.stats.getBatteryStats()) {
2562                 sr.stats.stopLaunchedLocked();
2563             }
2564             if (sr.app != app && sr.app != null && !sr.app.persistent) {
2565                 sr.app.services.remove(sr);
2566             }
2567             sr.app = null;
2568             sr.isolatedProc = null;
2569             sr.executeNesting = 0;
2570             sr.forceClearTracker();
2571             if (mDestroyingServices.remove(sr)) {
2572                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "killServices remove destroying " + sr);
2573             }
2574 
2575             final int numClients = sr.bindings.size();
2576             for (int bindingi=numClients-1; bindingi>=0; bindingi--) {
2577                 IntentBindRecord b = sr.bindings.valueAt(bindingi);
2578                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Killing binding " + b
2579                         + ": shouldUnbind=" + b.hasBound);
2580                 b.binder = null;
2581                 b.requested = b.received = b.hasBound = false;
2582                 // If this binding is coming from a cached process and is asking to keep
2583                 // the service created, then we'll kill the cached process as well -- we
2584                 // don't want to be thrashing around restarting processes that are only
2585                 // there to be cached.
2586                 for (int appi=b.apps.size()-1; appi>=0; appi--) {
2587                     final ProcessRecord proc = b.apps.keyAt(appi);
2588                     // If the process is already gone, skip it.
2589                     if (proc.killedByAm || proc.thread == null) {
2590                         continue;
2591                     }
2592                     // Only do this for processes that have an auto-create binding;
2593                     // otherwise the binding can be left, because it won't cause the
2594                     // service to restart.
2595                     final AppBindRecord abind = b.apps.valueAt(appi);
2596                     boolean hasCreate = false;
2597                     for (int conni=abind.connections.size()-1; conni>=0; conni--) {
2598                         ConnectionRecord conn = abind.connections.valueAt(conni);
2599                         if ((conn.flags&(Context.BIND_AUTO_CREATE|Context.BIND_ALLOW_OOM_MANAGEMENT
2600                                 |Context.BIND_WAIVE_PRIORITY)) == Context.BIND_AUTO_CREATE) {
2601                             hasCreate = true;
2602                             break;
2603                         }
2604                     }
2605                     if (!hasCreate) {
2606                         continue;
2607                     }
2608                     // XXX turned off for now until we have more time to get a better policy.
2609                     if (false && proc != null && !proc.persistent && proc.thread != null
2610                             && proc.pid != 0 && proc.pid != ActivityManagerService.MY_PID
2611                             && proc.setProcState >= ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
2612                         proc.kill("bound to service " + sr.name.flattenToShortString()
2613                                 + " in dying proc " + (app != null ? app.processName : "??"), true);
2614                     }
2615                 }
2616             }
2617         }
2618 
2619         ServiceMap smap = getServiceMap(app.userId);
2620 
2621         // Now do remaining service cleanup.
2622         for (int i=app.services.size()-1; i>=0; i--) {
2623             ServiceRecord sr = app.services.valueAt(i);
2624 
2625             // Unless the process is persistent, this process record is going away,
2626             // so make sure the service is cleaned out of it.
2627             if (!app.persistent) {
2628                 app.services.removeAt(i);
2629             }
2630 
2631             // Sanity check: if the service listed for the app is not one
2632             // we actually are maintaining, just let it drop.
2633             final ServiceRecord curRec = smap.mServicesByName.get(sr.name);
2634             if (curRec != sr) {
2635                 if (curRec != null) {
2636                     Slog.wtf(TAG, "Service " + sr + " in process " + app
2637                             + " not same as in map: " + curRec);
2638                 }
2639                 continue;
2640             }
2641 
2642             // Any services running in the application may need to be placed
2643             // back in the pending list.
2644             if (allowRestart && sr.crashCount >= 2 && (sr.serviceInfo.applicationInfo.flags
2645                     &ApplicationInfo.FLAG_PERSISTENT) == 0) {
2646                 Slog.w(TAG, "Service crashed " + sr.crashCount
2647                         + " times, stopping: " + sr);
2648                 EventLog.writeEvent(EventLogTags.AM_SERVICE_CRASHED_TOO_MUCH,
2649                         sr.userId, sr.crashCount, sr.shortName, app.pid);
2650                 bringDownServiceLocked(sr);
2651             } else if (!allowRestart
2652                     || !mAm.mUserController.isUserRunningLocked(sr.userId, 0)) {
2653                 bringDownServiceLocked(sr);
2654             } else {
2655                 boolean canceled = scheduleServiceRestartLocked(sr, true);
2656 
2657                 // Should the service remain running?  Note that in the
2658                 // extreme case of so many attempts to deliver a command
2659                 // that it failed we also will stop it here.
2660                 if (sr.startRequested && (sr.stopIfKilled || canceled)) {
2661                     if (sr.pendingStarts.size() == 0) {
2662                         sr.startRequested = false;
2663                         if (sr.tracker != null) {
2664                             sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),
2665                                     SystemClock.uptimeMillis());
2666                         }
2667                         if (!sr.hasAutoCreateConnections()) {
2668                             // Whoops, no reason to restart!
2669                             bringDownServiceLocked(sr);
2670                         }
2671                     }
2672                 }
2673             }
2674         }
2675 
2676         if (!allowRestart) {
2677             app.services.clear();
2678 
2679             // Make sure there are no more restarting services for this process.
2680             for (int i=mRestartingServices.size()-1; i>=0; i--) {
2681                 ServiceRecord r = mRestartingServices.get(i);
2682                 if (r.processName.equals(app.processName) &&
2683                         r.serviceInfo.applicationInfo.uid == app.info.uid) {
2684                     mRestartingServices.remove(i);
2685                     clearRestartingIfNeededLocked(r);
2686                 }
2687             }
2688             for (int i=mPendingServices.size()-1; i>=0; i--) {
2689                 ServiceRecord r = mPendingServices.get(i);
2690                 if (r.processName.equals(app.processName) &&
2691                         r.serviceInfo.applicationInfo.uid == app.info.uid) {
2692                     mPendingServices.remove(i);
2693                 }
2694             }
2695         }
2696 
2697         // Make sure we have no more records on the stopping list.
2698         int i = mDestroyingServices.size();
2699         while (i > 0) {
2700             i--;
2701             ServiceRecord sr = mDestroyingServices.get(i);
2702             if (sr.app == app) {
2703                 sr.forceClearTracker();
2704                 mDestroyingServices.remove(i);
2705                 if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "killServices remove destroying " + sr);
2706             }
2707         }
2708 
2709         app.executingServices.clear();
2710     }
2711 
makeRunningServiceInfoLocked(ServiceRecord r)2712     ActivityManager.RunningServiceInfo makeRunningServiceInfoLocked(ServiceRecord r) {
2713         ActivityManager.RunningServiceInfo info =
2714             new ActivityManager.RunningServiceInfo();
2715         info.service = r.name;
2716         if (r.app != null) {
2717             info.pid = r.app.pid;
2718         }
2719         info.uid = r.appInfo.uid;
2720         info.process = r.processName;
2721         info.foreground = r.isForeground;
2722         info.activeSince = r.createTime;
2723         info.started = r.startRequested;
2724         info.clientCount = r.connections.size();
2725         info.crashCount = r.crashCount;
2726         info.lastActivityTime = r.lastActivity;
2727         if (r.isForeground) {
2728             info.flags |= ActivityManager.RunningServiceInfo.FLAG_FOREGROUND;
2729         }
2730         if (r.startRequested) {
2731             info.flags |= ActivityManager.RunningServiceInfo.FLAG_STARTED;
2732         }
2733         if (r.app != null && r.app.pid == ActivityManagerService.MY_PID) {
2734             info.flags |= ActivityManager.RunningServiceInfo.FLAG_SYSTEM_PROCESS;
2735         }
2736         if (r.app != null && r.app.persistent) {
2737             info.flags |= ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS;
2738         }
2739 
2740         for (int conni=r.connections.size()-1; conni>=0; conni--) {
2741             ArrayList<ConnectionRecord> connl = r.connections.valueAt(conni);
2742             for (int i=0; i<connl.size(); i++) {
2743                 ConnectionRecord conn = connl.get(i);
2744                 if (conn.clientLabel != 0) {
2745                     info.clientPackage = conn.binding.client.info.packageName;
2746                     info.clientLabel = conn.clientLabel;
2747                     return info;
2748                 }
2749             }
2750         }
2751         return info;
2752     }
2753 
getRunningServiceInfoLocked(int maxNum, int flags)2754     List<ActivityManager.RunningServiceInfo> getRunningServiceInfoLocked(int maxNum,
2755             int flags) {
2756         ArrayList<ActivityManager.RunningServiceInfo> res
2757                 = new ArrayList<ActivityManager.RunningServiceInfo>();
2758 
2759         final int uid = Binder.getCallingUid();
2760         final long ident = Binder.clearCallingIdentity();
2761         try {
2762             if (ActivityManager.checkUidPermission(
2763                     android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
2764                     uid) == PackageManager.PERMISSION_GRANTED) {
2765                 int[] users = mAm.mUserController.getUsers();
2766                 for (int ui=0; ui<users.length && res.size() < maxNum; ui++) {
2767                     ArrayMap<ComponentName, ServiceRecord> alls = getServices(users[ui]);
2768                     for (int i=0; i<alls.size() && res.size() < maxNum; i++) {
2769                         ServiceRecord sr = alls.valueAt(i);
2770                         res.add(makeRunningServiceInfoLocked(sr));
2771                     }
2772                 }
2773 
2774                 for (int i=0; i<mRestartingServices.size() && res.size() < maxNum; i++) {
2775                     ServiceRecord r = mRestartingServices.get(i);
2776                     ActivityManager.RunningServiceInfo info =
2777                             makeRunningServiceInfoLocked(r);
2778                     info.restarting = r.nextRestartTime;
2779                     res.add(info);
2780                 }
2781             } else {
2782                 int userId = UserHandle.getUserId(uid);
2783                 ArrayMap<ComponentName, ServiceRecord> alls = getServices(userId);
2784                 for (int i=0; i<alls.size() && res.size() < maxNum; i++) {
2785                     ServiceRecord sr = alls.valueAt(i);
2786                     res.add(makeRunningServiceInfoLocked(sr));
2787                 }
2788 
2789                 for (int i=0; i<mRestartingServices.size() && res.size() < maxNum; i++) {
2790                     ServiceRecord r = mRestartingServices.get(i);
2791                     if (r.userId == userId) {
2792                         ActivityManager.RunningServiceInfo info =
2793                                 makeRunningServiceInfoLocked(r);
2794                         info.restarting = r.nextRestartTime;
2795                         res.add(info);
2796                     }
2797                 }
2798             }
2799         } finally {
2800             Binder.restoreCallingIdentity(ident);
2801         }
2802 
2803         return res;
2804     }
2805 
getRunningServiceControlPanelLocked(ComponentName name)2806     public PendingIntent getRunningServiceControlPanelLocked(ComponentName name) {
2807         int userId = UserHandle.getUserId(Binder.getCallingUid());
2808         ServiceRecord r = getServiceByName(name, userId);
2809         if (r != null) {
2810             for (int conni=r.connections.size()-1; conni>=0; conni--) {
2811                 ArrayList<ConnectionRecord> conn = r.connections.valueAt(conni);
2812                 for (int i=0; i<conn.size(); i++) {
2813                     if (conn.get(i).clientIntent != null) {
2814                         return conn.get(i).clientIntent;
2815                     }
2816                 }
2817             }
2818         }
2819         return null;
2820     }
2821 
serviceTimeout(ProcessRecord proc)2822     void serviceTimeout(ProcessRecord proc) {
2823         String anrMessage = null;
2824 
2825         synchronized(mAm) {
2826             if (proc.executingServices.size() == 0 || proc.thread == null) {
2827                 return;
2828             }
2829             final long now = SystemClock.uptimeMillis();
2830             final long maxTime =  now -
2831                     (proc.execServicesFg ? SERVICE_TIMEOUT : SERVICE_BACKGROUND_TIMEOUT);
2832             ServiceRecord timeout = null;
2833             long nextTime = 0;
2834             for (int i=proc.executingServices.size()-1; i>=0; i--) {
2835                 ServiceRecord sr = proc.executingServices.valueAt(i);
2836                 if (sr.executingStart < maxTime) {
2837                     timeout = sr;
2838                     break;
2839                 }
2840                 if (sr.executingStart > nextTime) {
2841                     nextTime = sr.executingStart;
2842                 }
2843             }
2844             if (timeout != null && mAm.mLruProcesses.contains(proc)) {
2845                 Slog.w(TAG, "Timeout executing service: " + timeout);
2846                 StringWriter sw = new StringWriter();
2847                 PrintWriter pw = new FastPrintWriter(sw, false, 1024);
2848                 pw.println(timeout);
2849                 timeout.dump(pw, "    ");
2850                 pw.close();
2851                 mLastAnrDump = sw.toString();
2852                 mAm.mHandler.removeCallbacks(mLastAnrDumpClearer);
2853                 mAm.mHandler.postDelayed(mLastAnrDumpClearer, LAST_ANR_LIFETIME_DURATION_MSECS);
2854                 anrMessage = "executing service " + timeout.shortName;
2855             } else {
2856                 Message msg = mAm.mHandler.obtainMessage(
2857                         ActivityManagerService.SERVICE_TIMEOUT_MSG);
2858                 msg.obj = proc;
2859                 mAm.mHandler.sendMessageAtTime(msg, proc.execServicesFg
2860                         ? (nextTime+SERVICE_TIMEOUT) : (nextTime + SERVICE_BACKGROUND_TIMEOUT));
2861             }
2862         }
2863 
2864         if (anrMessage != null) {
2865             mAm.mAppErrors.appNotResponding(proc, null, null, false, anrMessage);
2866         }
2867     }
2868 
scheduleServiceTimeoutLocked(ProcessRecord proc)2869     void scheduleServiceTimeoutLocked(ProcessRecord proc) {
2870         if (proc.executingServices.size() == 0 || proc.thread == null) {
2871             return;
2872         }
2873         long now = SystemClock.uptimeMillis();
2874         Message msg = mAm.mHandler.obtainMessage(
2875                 ActivityManagerService.SERVICE_TIMEOUT_MSG);
2876         msg.obj = proc;
2877         mAm.mHandler.sendMessageAtTime(msg,
2878                 proc.execServicesFg ? (now+SERVICE_TIMEOUT) : (now+ SERVICE_BACKGROUND_TIMEOUT));
2879     }
2880 
2881     /**
2882      * Prints a list of ServiceRecords (dumpsys activity services)
2883      */
collectServicesToDumpLocked(ItemMatcher matcher, String dumpPackage)2884     List<ServiceRecord> collectServicesToDumpLocked(ItemMatcher matcher, String dumpPackage) {
2885         final ArrayList<ServiceRecord> services = new ArrayList<>();
2886         final int[] users = mAm.mUserController.getUsers();
2887         for (int user : users) {
2888             ServiceMap smap = getServiceMap(user);
2889             if (smap.mServicesByName.size() > 0) {
2890                 for (int si=0; si<smap.mServicesByName.size(); si++) {
2891                     ServiceRecord r = smap.mServicesByName.valueAt(si);
2892                     if (!matcher.match(r, r.name)) {
2893                         continue;
2894                     }
2895                     if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
2896                         continue;
2897                     }
2898                     services.add(r);
2899                 }
2900             }
2901         }
2902 
2903         return services;
2904     }
2905 
2906     final class ServiceDumper {
2907         private final FileDescriptor fd;
2908         private final PrintWriter pw;
2909         private final String[] args;
2910         private final int opti;
2911         private final boolean dumpAll;
2912         private final String dumpPackage;
2913         private final ItemMatcher matcher;
2914         private final ArrayList<ServiceRecord> services = new ArrayList<>();
2915 
2916         private final long nowReal = SystemClock.elapsedRealtime();
2917 
2918         private boolean needSep = false;
2919         private boolean printedAnything = false;
2920         private boolean printed = false;
2921 
2922         /**
2923          * Note: do not call directly, use {@link #newServiceDumperLocked} instead (this
2924          * must be called with the lock held).
2925          */
ServiceDumper(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, String dumpPackage)2926         ServiceDumper(FileDescriptor fd, PrintWriter pw, String[] args,
2927                 int opti, boolean dumpAll, String dumpPackage) {
2928             this.fd = fd;
2929             this.pw = pw;
2930             this.args = args;
2931             this.opti = opti;
2932             this.dumpAll = dumpAll;
2933             this.dumpPackage = dumpPackage;
2934             matcher = new ItemMatcher();
2935             matcher.build(args, opti);
2936 
2937             final int[] users = mAm.mUserController.getUsers();
2938             for (int user : users) {
2939                 ServiceMap smap = getServiceMap(user);
2940                 if (smap.mServicesByName.size() > 0) {
2941                     for (int si=0; si<smap.mServicesByName.size(); si++) {
2942                         ServiceRecord r = smap.mServicesByName.valueAt(si);
2943                         if (!matcher.match(r, r.name)) {
2944                             continue;
2945                         }
2946                         if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
2947                             continue;
2948                         }
2949                         services.add(r);
2950                     }
2951                 }
2952             }
2953         }
2954 
dumpHeaderLocked()2955         private void dumpHeaderLocked() {
2956             pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)");
2957             if (mLastAnrDump != null) {
2958                 pw.println("  Last ANR service:");
2959                 pw.print(mLastAnrDump);
2960                 pw.println();
2961             }
2962         }
2963 
dumpLocked()2964         void dumpLocked() {
2965             dumpHeaderLocked();
2966 
2967             try {
2968                 int[] users = mAm.mUserController.getUsers();
2969                 for (int user : users) {
2970                     // Find the first service for this user.
2971                     int serviceIdx = 0;
2972                     while (serviceIdx < services.size() && services.get(serviceIdx).userId != user) {
2973                         serviceIdx++;
2974                     }
2975                     printed = false;
2976                     if (serviceIdx < services.size()) {
2977                         needSep = false;
2978                         while (serviceIdx < services.size()) {
2979                             ServiceRecord r = services.get(serviceIdx);
2980                             serviceIdx++;
2981                             if (r.userId != user) {
2982                                 break;
2983                             }
2984                             dumpServiceLocalLocked(r);
2985                         }
2986                         needSep |= printed;
2987                     }
2988 
2989                     dumpUserRemainsLocked(user);
2990                 }
2991             } catch (Exception e) {
2992                 Slog.w(TAG, "Exception in dumpServicesLocked", e);
2993             }
2994 
2995             dumpRemainsLocked();
2996         }
2997 
dumpWithClient()2998         void dumpWithClient() {
2999             synchronized(mAm) {
3000                 dumpHeaderLocked();
3001             }
3002 
3003             try {
3004                 int[] users = mAm.mUserController.getUsers();
3005                 for (int user : users) {
3006                     // Find the first service for this user.
3007                     int serviceIdx = 0;
3008                     while (serviceIdx < services.size() && services.get(serviceIdx).userId != user) {
3009                         serviceIdx++;
3010                     }
3011                     printed = false;
3012                     if (serviceIdx < services.size()) {
3013                         needSep = false;
3014                         while (serviceIdx < services.size()) {
3015                             ServiceRecord r = services.get(serviceIdx);
3016                             serviceIdx++;
3017                             if (r.userId != user) {
3018                                 break;
3019                             }
3020                             synchronized(mAm) {
3021                                 dumpServiceLocalLocked(r);
3022                             }
3023                             dumpServiceClient(r);
3024                         }
3025                         needSep |= printed;
3026                     }
3027 
3028                     synchronized(mAm) {
3029                         dumpUserRemainsLocked(user);
3030                     }
3031                 }
3032             } catch (Exception e) {
3033                 Slog.w(TAG, "Exception in dumpServicesLocked", e);
3034             }
3035 
3036             synchronized(mAm) {
3037                 dumpRemainsLocked();
3038             }
3039         }
3040 
dumpUserHeaderLocked(int user)3041         private void dumpUserHeaderLocked(int user) {
3042             if (!printed) {
3043                 if (printedAnything) {
3044                     pw.println();
3045                 }
3046                 pw.println("  User " + user + " active services:");
3047                 printed = true;
3048             }
3049             printedAnything = true;
3050             if (needSep) {
3051                 pw.println();
3052             }
3053         }
3054 
dumpServiceLocalLocked(ServiceRecord r)3055         private void dumpServiceLocalLocked(ServiceRecord r) {
3056             dumpUserHeaderLocked(r.userId);
3057             pw.print("  * ");
3058             pw.println(r);
3059             if (dumpAll) {
3060                 r.dump(pw, "    ");
3061                 needSep = true;
3062             } else {
3063                 pw.print("    app=");
3064                 pw.println(r.app);
3065                 pw.print("    created=");
3066                 TimeUtils.formatDuration(r.createTime, nowReal, pw);
3067                 pw.print(" started=");
3068                 pw.print(r.startRequested);
3069                 pw.print(" connections=");
3070                 pw.println(r.connections.size());
3071                 if (r.connections.size() > 0) {
3072                     pw.println("    Connections:");
3073                     for (int conni=0; conni<r.connections.size(); conni++) {
3074                         ArrayList<ConnectionRecord> clist = r.connections.valueAt(conni);
3075                         for (int i = 0; i < clist.size(); i++) {
3076                             ConnectionRecord conn = clist.get(i);
3077                             pw.print("      ");
3078                             pw.print(conn.binding.intent.intent.getIntent()
3079                                     .toShortString(false, false, false, false));
3080                             pw.print(" -> ");
3081                             ProcessRecord proc = conn.binding.client;
3082                             pw.println(proc != null ? proc.toShortString() : "null");
3083                         }
3084                     }
3085                 }
3086             }
3087         }
3088 
dumpServiceClient(ServiceRecord r)3089         private void dumpServiceClient(ServiceRecord r) {
3090             final ProcessRecord proc = r.app;
3091             if (proc == null) {
3092                 return;
3093             }
3094             final IApplicationThread thread = proc.thread;
3095             if (thread == null) {
3096                 return;
3097             }
3098             pw.println("    Client:");
3099             pw.flush();
3100             try {
3101                 TransferPipe tp = new TransferPipe();
3102                 try {
3103                     thread.dumpService(tp.getWriteFd().getFileDescriptor(), r, args);
3104                     tp.setBufferPrefix("      ");
3105                     // Short timeout, since blocking here can
3106                     // deadlock with the application.
3107                     tp.go(fd, 2000);
3108                 } finally {
3109                     tp.kill();
3110                 }
3111             } catch (IOException e) {
3112                 pw.println("      Failure while dumping the service: " + e);
3113             } catch (RemoteException e) {
3114                 pw.println("      Got a RemoteException while dumping the service");
3115             }
3116             needSep = true;
3117         }
3118 
dumpUserRemainsLocked(int user)3119         private void dumpUserRemainsLocked(int user) {
3120             ServiceMap smap = getServiceMap(user);
3121             printed = false;
3122             for (int si=0, SN=smap.mDelayedStartList.size(); si<SN; si++) {
3123                 ServiceRecord r = smap.mDelayedStartList.get(si);
3124                 if (!matcher.match(r, r.name)) {
3125                     continue;
3126                 }
3127                 if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
3128                     continue;
3129                 }
3130                 if (!printed) {
3131                     if (printedAnything) {
3132                         pw.println();
3133                     }
3134                     pw.println("  User " + user + " delayed start services:");
3135                     printed = true;
3136                 }
3137                 printedAnything = true;
3138                 pw.print("  * Delayed start "); pw.println(r);
3139             }
3140             printed = false;
3141             for (int si=0, SN=smap.mStartingBackground.size(); si<SN; si++) {
3142                 ServiceRecord r = smap.mStartingBackground.get(si);
3143                 if (!matcher.match(r, r.name)) {
3144                     continue;
3145                 }
3146                 if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
3147                     continue;
3148                 }
3149                 if (!printed) {
3150                     if (printedAnything) {
3151                         pw.println();
3152                     }
3153                     pw.println("  User " + user + " starting in background:");
3154                     printed = true;
3155                 }
3156                 printedAnything = true;
3157                 pw.print("  * Starting bg "); pw.println(r);
3158             }
3159         }
3160 
dumpRemainsLocked()3161         private void dumpRemainsLocked() {
3162             if (mPendingServices.size() > 0) {
3163                 printed = false;
3164                 for (int i=0; i<mPendingServices.size(); i++) {
3165                     ServiceRecord r = mPendingServices.get(i);
3166                     if (!matcher.match(r, r.name)) {
3167                         continue;
3168                     }
3169                     if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
3170                         continue;
3171                     }
3172                     printedAnything = true;
3173                     if (!printed) {
3174                         if (needSep) pw.println();
3175                         needSep = true;
3176                         pw.println("  Pending services:");
3177                         printed = true;
3178                     }
3179                     pw.print("  * Pending "); pw.println(r);
3180                     r.dump(pw, "    ");
3181                 }
3182                 needSep = true;
3183             }
3184 
3185             if (mRestartingServices.size() > 0) {
3186                 printed = false;
3187                 for (int i=0; i<mRestartingServices.size(); i++) {
3188                     ServiceRecord r = mRestartingServices.get(i);
3189                     if (!matcher.match(r, r.name)) {
3190                         continue;
3191                     }
3192                     if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
3193                         continue;
3194                     }
3195                     printedAnything = true;
3196                     if (!printed) {
3197                         if (needSep) pw.println();
3198                         needSep = true;
3199                         pw.println("  Restarting services:");
3200                         printed = true;
3201                     }
3202                     pw.print("  * Restarting "); pw.println(r);
3203                     r.dump(pw, "    ");
3204                 }
3205                 needSep = true;
3206             }
3207 
3208             if (mDestroyingServices.size() > 0) {
3209                 printed = false;
3210                 for (int i=0; i< mDestroyingServices.size(); i++) {
3211                     ServiceRecord r = mDestroyingServices.get(i);
3212                     if (!matcher.match(r, r.name)) {
3213                         continue;
3214                     }
3215                     if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
3216                         continue;
3217                     }
3218                     printedAnything = true;
3219                     if (!printed) {
3220                         if (needSep) pw.println();
3221                         needSep = true;
3222                         pw.println("  Destroying services:");
3223                         printed = true;
3224                     }
3225                     pw.print("  * Destroy "); pw.println(r);
3226                     r.dump(pw, "    ");
3227                 }
3228                 needSep = true;
3229             }
3230 
3231             if (dumpAll) {
3232                 printed = false;
3233                 for (int ic=0; ic<mServiceConnections.size(); ic++) {
3234                     ArrayList<ConnectionRecord> r = mServiceConnections.valueAt(ic);
3235                     for (int i=0; i<r.size(); i++) {
3236                         ConnectionRecord cr = r.get(i);
3237                         if (!matcher.match(cr.binding.service, cr.binding.service.name)) {
3238                             continue;
3239                         }
3240                         if (dumpPackage != null && (cr.binding.client == null
3241                                 || !dumpPackage.equals(cr.binding.client.info.packageName))) {
3242                             continue;
3243                         }
3244                         printedAnything = true;
3245                         if (!printed) {
3246                             if (needSep) pw.println();
3247                             needSep = true;
3248                             pw.println("  Connection bindings to services:");
3249                             printed = true;
3250                         }
3251                         pw.print("  * "); pw.println(cr);
3252                         cr.dump(pw, "    ");
3253                     }
3254                 }
3255             }
3256 
3257             if (!printedAnything) {
3258                 pw.println("  (nothing)");
3259             }
3260         }
3261     }
3262 
newServiceDumperLocked(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, String dumpPackage)3263     ServiceDumper newServiceDumperLocked(FileDescriptor fd, PrintWriter pw, String[] args,
3264             int opti, boolean dumpAll, String dumpPackage) {
3265         return new ServiceDumper(fd, pw, args, opti, dumpAll, dumpPackage);
3266     }
3267 
3268     /**
3269      * There are three ways to call this:
3270      *  - no service specified: dump all the services
3271      *  - a flattened component name that matched an existing service was specified as the
3272      *    first arg: dump that one service
3273      *  - the first arg isn't the flattened component name of an existing service:
3274      *    dump all services whose component contains the first arg as a substring
3275      */
dumpService(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll)3276     protected boolean dumpService(FileDescriptor fd, PrintWriter pw, String name, String[] args,
3277             int opti, boolean dumpAll) {
3278         ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>();
3279 
3280         synchronized (mAm) {
3281             int[] users = mAm.mUserController.getUsers();
3282             if ("all".equals(name)) {
3283                 for (int user : users) {
3284                     ServiceMap smap = mServiceMap.get(user);
3285                     if (smap == null) {
3286                         continue;
3287                     }
3288                     ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByName;
3289                     for (int i=0; i<alls.size(); i++) {
3290                         ServiceRecord r1 = alls.valueAt(i);
3291                         services.add(r1);
3292                     }
3293                 }
3294             } else {
3295                 ComponentName componentName = name != null
3296                         ? ComponentName.unflattenFromString(name) : null;
3297                 int objectId = 0;
3298                 if (componentName == null) {
3299                     // Not a '/' separated full component name; maybe an object ID?
3300                     try {
3301                         objectId = Integer.parseInt(name, 16);
3302                         name = null;
3303                         componentName = null;
3304                     } catch (RuntimeException e) {
3305                     }
3306                 }
3307 
3308                 for (int user : users) {
3309                     ServiceMap smap = mServiceMap.get(user);
3310                     if (smap == null) {
3311                         continue;
3312                     }
3313                     ArrayMap<ComponentName, ServiceRecord> alls = smap.mServicesByName;
3314                     for (int i=0; i<alls.size(); i++) {
3315                         ServiceRecord r1 = alls.valueAt(i);
3316                         if (componentName != null) {
3317                             if (r1.name.equals(componentName)) {
3318                                 services.add(r1);
3319                             }
3320                         } else if (name != null) {
3321                             if (r1.name.flattenToString().contains(name)) {
3322                                 services.add(r1);
3323                             }
3324                         } else if (System.identityHashCode(r1) == objectId) {
3325                             services.add(r1);
3326                         }
3327                     }
3328                 }
3329             }
3330         }
3331 
3332         if (services.size() <= 0) {
3333             return false;
3334         }
3335 
3336         boolean needSep = false;
3337         for (int i=0; i<services.size(); i++) {
3338             if (needSep) {
3339                 pw.println();
3340             }
3341             needSep = true;
3342             dumpService("", fd, pw, services.get(i), args, dumpAll);
3343         }
3344         return true;
3345     }
3346 
3347     /**
3348      * Invokes IApplicationThread.dumpService() on the thread of the specified service if
3349      * there is a thread associated with the service.
3350      */
dumpService(String prefix, FileDescriptor fd, PrintWriter pw, final ServiceRecord r, String[] args, boolean dumpAll)3351     private void dumpService(String prefix, FileDescriptor fd, PrintWriter pw,
3352             final ServiceRecord r, String[] args, boolean dumpAll) {
3353         String innerPrefix = prefix + "  ";
3354         synchronized (mAm) {
3355             pw.print(prefix); pw.print("SERVICE ");
3356                     pw.print(r.shortName); pw.print(" ");
3357                     pw.print(Integer.toHexString(System.identityHashCode(r)));
3358                     pw.print(" pid=");
3359                     if (r.app != null) pw.println(r.app.pid);
3360                     else pw.println("(not running)");
3361             if (dumpAll) {
3362                 r.dump(pw, innerPrefix);
3363             }
3364         }
3365         if (r.app != null && r.app.thread != null) {
3366             pw.print(prefix); pw.println("  Client:");
3367             pw.flush();
3368             try {
3369                 TransferPipe tp = new TransferPipe();
3370                 try {
3371                     r.app.thread.dumpService(tp.getWriteFd().getFileDescriptor(), r, args);
3372                     tp.setBufferPrefix(prefix + "    ");
3373                     tp.go(fd);
3374                 } finally {
3375                     tp.kill();
3376                 }
3377             } catch (IOException e) {
3378                 pw.println(prefix + "    Failure while dumping the service: " + e);
3379             } catch (RemoteException e) {
3380                 pw.println(prefix + "    Got a RemoteException while dumping the service");
3381             }
3382         }
3383     }
3384 }
3385