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