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