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