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