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