19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport com.android.internal.app.ProcessStats; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.BatteryStatsImpl; 21182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport com.android.server.LocalServices; 22182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport com.android.server.notification.NotificationManagerInternal; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.INotificationManager; 25d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.Notification; 26d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.NotificationManager; 27390517be2d60dd6e6264150c190c372d89bb331aDianne Hackbornimport android.app.PendingIntent; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 290c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackbornimport android.content.Context; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 32742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.PackageManager; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ServiceInfo; 34390517be2d60dd6e6264150c190c372d89bb331aDianne Hackbornimport android.net.Uri; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 37d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.os.RemoteException; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 39f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 40390517be2d60dd6e6264150c190c372d89bb331aDianne Hackbornimport android.provider.Settings; 41390517be2d60dd6e6264150c190c372d89bb331aDianne Hackbornimport android.util.ArrayMap; 428a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 431ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.util.TimeUtils; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 488a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkeyimport java.util.Objects; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A running application service. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 53be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class ServiceRecord extends Binder { 5439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of delivery attempts before giving up. 5539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DELIVERY_COUNT = 3; 5639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 5739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of times it can fail during execution before giving up. 5839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DONE_EXECUTING_COUNT = 6; 5939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 60b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final ActivityManagerService ams; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl.Uid.Pkg.Serv stats; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ComponentName name; // service component. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String shortName; // name.flattenToShortString(). 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Intent.FilterComparison intent; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // original intent used to find service. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ServiceInfo serviceInfo; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all information about the service. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo appInfo; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // information about service's app. 70742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final int userId; // user that this service is running as 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String packageName; // the package implementing intent's component 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String processName; // process where this component wants to run 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String permission;// permission needed to access service 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean exported; // from ServiceInfo.exported 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Runnable restarter; // used to schedule retries of starting the service 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long createTime; // when this service was created 77390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn final ArrayMap<Intent.FilterComparison, IntentBindRecord> bindings 78390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn = new ArrayMap<Intent.FilterComparison, IntentBindRecord>(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All active bindings to the service. 80390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn final ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections 81390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn = new ArrayMap<IBinder, ArrayList<ConnectionRecord>>(); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder -> ConnectionRecord of all bound clients 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 84d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn ProcessRecord app; // where this service is running or null. 85a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn ProcessRecord isolatedProc; // keep track of isolated process, if requested 86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessStats.ServiceState tracker; // tracking service execution, may be null 87daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ProcessStats.ServiceState restartTracker; // tracking service restart 889210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn boolean delayed; // are we waiting to start this service in the background? 89d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn boolean isForeground; // is service currently in foreground mode? 90d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn int foregroundId; // Notification ID of last foreground req. 91d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn Notification foregroundNoti; // Notification record of foreground state. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long lastActivity; // last time there was some activity on the service. 939210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn long startingBgTimeout; // time at which we scheduled this for a delayed start. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startRequested; // someone explicitly called start? 959210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn boolean delayedStop; // service has been stopped but is in a delayed start? 96f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean stopIfKilled; // last onStart() said to stop if service killed? 97f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean callStart; // last onStart() has asked to alway be called on restart. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int executeNesting; // number of outstanding operations keeping foreground. 99bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn boolean executeFg; // should we be executing in the foreground? 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long executingStart; // start time of last execute request. 101bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn boolean createdFromFg; // was this service last created due to a foreground process call? 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int crashCount; // number of times proc has crashed with service running 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int totalRestartCount; // number of times we have had to restart. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int restartCount; // number of restarts performed in a row. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartDelay; // delay until next restart attempt. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartTime; // time of last restart. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long nextRestartTime; // time when restartDelay will expire. 108455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn boolean destroying; // set when we have started destroying the service 10966c4a824b9b11a47c7bd1bf858d92fe207409ab9Craig Mautner long destroyTime; // time at which destory was initiated. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; // caching of toString 112f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 1130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private int lastStartId; // identifier of most recent start request. 1140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1157e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn static class StartItem { 11639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ServiceRecord sr; 1170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final boolean taskRemoved; 11839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final int id; 11939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final Intent intent; 12021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn final ActivityManagerService.NeededUriGrants neededGrants; 12139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn long deliveredTime; 12239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int deliveryCount; 12339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int doneExecutingCount; 1247e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner uriPermissions; 12539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 12639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn String stringName; // caching of toString 12739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn StartItem(ServiceRecord _sr, boolean _taskRemoved, int _id, Intent _intent, 12921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn ActivityManagerService.NeededUriGrants _neededGrants) { 13039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sr = _sr; 1310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn taskRemoved = _taskRemoved; 13239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn id = _id; 13339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn intent = _intent; 13421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn neededGrants = _neededGrants; 13539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 13639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1377e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner getUriPermissionsLocked() { 1387e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions == null) { 1397e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = new UriPermissionOwner(sr.ams, this); 14039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1417e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn return uriPermissions; 14239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1447e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn void removeUriPermissionsLocked() { 1457e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions != null) { 1467e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions.removeUriPermissionsLocked(); 1477e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = null; 14839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 15039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 15139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public String toString() { 15239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (stringName != null) { 15339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName; 15439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 15539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn StringBuilder sb = new StringBuilder(128); 15639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sb.append("ServiceRecord{") 15739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(sr))) 15839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(' ').append(sr.shortName) 15939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" StartItem ") 16039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 16139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" id=").append(id).append('}'); 16239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName = sb.toString(); 16339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 16439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 16539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 16639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> deliveredStarts = new ArrayList<StartItem>(); 16739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments which been delivered. 16839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> pendingStarts = new ArrayList<StartItem>(); 16939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments that haven't yet been delivered. 17039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 171f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn void dumpStartList(PrintWriter pw, String prefix, List<StartItem> list, long now) { 172f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = list.size(); 173f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 174f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = list.get(i); 175f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.print("#"); pw.print(i); 176f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" id="); pw.print(si.id); 1771ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (now != 0) { 1781ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" dur="); 1791ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(si.deliveredTime, now, pw); 1801ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 181f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.deliveryCount != 0) { 182f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dc="); pw.print(si.deliveryCount); 183f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 184f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.doneExecutingCount != 0) { 185f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dxc="); pw.print(si.doneExecutingCount); 186f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 18739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(""); 18839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print(" intent="); 189f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.intent != null) pw.println(si.intent.toString()); 190f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn else pw.println("null"); 19121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn if (si.neededGrants != null) { 19221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.print(prefix); pw.print(" neededGrants="); 19321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.println(si.neededGrants); 19439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1957e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions != null) { 196846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey si.uriPermissions.dump(pw, prefix); 19739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 198f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 199f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 200f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 2021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("intent={"); 20321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.print(intent.getIntent().toShortString(false, true, false, true)); 2041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 2051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("packageName="); pw.println(packageName); 2061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("processName="); pw.println(processName); 2071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (permission != null) { 2081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("permission="); pw.println(permission); 2091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 210fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn long now = SystemClock.uptimeMillis(); 2111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn long nowReal = SystemClock.elapsedRealtime(); 2128a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (appInfo != null) { 2138a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey pw.print(prefix); pw.print("baseDir="); pw.println(appInfo.sourceDir); 2148a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (!Objects.equals(appInfo.sourceDir, appInfo.publicSourceDir)) { 2158a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey pw.print(prefix); pw.print("resDir="); pw.println(appInfo.publicSourceDir); 2168a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 2178a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey pw.print(prefix); pw.print("dataDir="); pw.println(appInfo.dataDir); 218a301fe61c8573c06be754d5788a84d19188ee2d3Marco Nelissen } 2191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("app="); pw.println(app); 220a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn if (isolatedProc != null) { 221a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn pw.print(prefix); pw.print("isolatedProc="); pw.println(isolatedProc); 222a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn } 2239210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn if (delayed) { 2249210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(prefix); pw.print("delayed="); pw.println(delayed); 2259210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn } 226d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (isForeground || foregroundId != 0) { 227d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("isForeground="); pw.print(isForeground); 228d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundId="); pw.print(foregroundId); 229d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundNoti="); pw.println(foregroundNoti); 230d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 2319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.print("createTime="); 2321ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(createTime, nowReal, pw); 2339210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(" startingBgTimeout="); 2349210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn TimeUtils.formatDuration(startingBgTimeout, now, pw); 235bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.println(); 2369210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(prefix); pw.print("lastActivity="); 2379210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn TimeUtils.formatDuration(lastActivity, now, pw); 2389210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(" restartTime="); 2391ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartTime, now, pw); 240bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(" createdFromFg="); pw.println(createdFromFg); 2419210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn if (startRequested || delayedStop || lastStartId != 0) { 242d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("startRequested="); pw.print(startRequested); 2439210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(" delayedStop="); pw.print(delayedStop); 244f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" stopIfKilled="); pw.print(stopIfKilled); 245f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" callStart="); pw.print(callStart); 246d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" lastStartId="); pw.println(lastStartId); 247d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 248bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn if (executeNesting != 0) { 249d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("executeNesting="); pw.print(executeNesting); 250bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(" executeFg="); pw.print(executeFg); 251bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(" executingStart="); 252bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn TimeUtils.formatDuration(executingStart, now, pw); 2532be00933163bb2bfa6b43cf2e1ddde7c284c7c4cDianne Hackborn pw.println(); 254bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn } 255455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn if (destroying || destroyTime != 0) { 256455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn pw.print(prefix); pw.print("destroying="); pw.print(destroying); 257455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn pw.print(" destroyTime="); 258455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn TimeUtils.formatDuration(destroyTime, now, pw); 259455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn pw.println(); 26066c4a824b9b11a47c7bd1bf858d92fe207409ab9Craig Mautner } 261bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn if (crashCount != 0 || restartCount != 0 262bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn || restartDelay != 0 || nextRestartTime != 0) { 263bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(prefix); pw.print("restartCount="); pw.print(restartCount); 2641ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" restartDelay="); 2651ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartDelay, now, pw); 2661ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" nextRestartTime="); 2671ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(nextRestartTime, now, pw); 268d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" crashCount="); pw.println(crashCount); 269d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 270f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (deliveredStarts.size() > 0) { 271f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Delivered Starts:"); 2721ebccf531d1049853b3b0630035434619682c016Dianne Hackborn dumpStartList(pw, prefix, deliveredStarts, now); 273f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 274f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (pendingStarts.size() > 0) { 275f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Pending Starts:"); 276f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn dumpStartList(pw, prefix, pendingStarts, 0); 277f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bindings.size() > 0) { 279f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Bindings:"); 280390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn for (int i=0; i<bindings.size(); i++) { 281390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn IntentBindRecord b = bindings.valueAt(i); 2821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("* IntentBindRecord{"); 2831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(b))); 2840c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn if ((b.collectFlags()&Context.BIND_AUTO_CREATE) != 0) { 2850c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn pw.append(" CREATE"); 2860c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn } 2871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println("}:"); 2881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn b.dumpInService(pw, prefix + " "); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.size() > 0) { 2921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println("All Connections:"); 293390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn for (int conni=0; conni<connections.size(); conni++) { 294390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn ArrayList<ConnectionRecord> c = connections.valueAt(conni); 29543d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn for (int i=0; i<c.size(); i++) { 29643d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn pw.print(prefix); pw.print(" "); pw.println(c.get(i)); 29743d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 302b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ServiceRecord(ActivityManagerService ams, 303b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, 304bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, 305bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn Runnable restarter) { 306b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn this.ams = ams; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.stats = servStats; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.name = name; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shortName = name.flattenToShortString(); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.intent = intent; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serviceInfo = sInfo; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = sInfo.applicationInfo; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = sInfo.applicationInfo.packageName; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processName = sInfo.processName; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = sInfo.permission; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exported = sInfo.exported; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.restarter = restarter; 3189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn createTime = SystemClock.elapsedRealtime(); 3199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn lastActivity = SystemClock.uptimeMillis(); 320f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn userId = UserHandle.getUserId(appInfo.uid); 321bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn createdFromFg = callerIsFg; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessStats.ServiceState getTracker() { 325bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn if (tracker != null) { 326bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn return tracker; 327bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn } 328bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { 329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn tracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName, 3308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.applicationInfo.uid, serviceInfo.applicationInfo.versionCode, 3318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.processName, serviceInfo.name); 332164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn tracker.applyNewOwner(this); 333bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn } 334bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn return tracker; 335bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn } 336bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn 337164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public void forceClearTracker() { 338164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (tracker != null) { 339878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn tracker.clearCurrentOwner(this, true); 340164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn tracker = null; 341164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 342164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 343164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn 344daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn public void makeRestarting(int memFactor, long now) { 345daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (restartTracker == null) { 346daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { 347daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn restartTracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName, 3488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.applicationInfo.uid, serviceInfo.applicationInfo.versionCode, 3498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.processName, serviceInfo.name); 350daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 351daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (restartTracker == null) { 352daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn return; 353daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 354daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 355daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn restartTracker.setRestarting(true, memFactor, now); 356daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 357daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AppBindRecord retrieveAppBindingLocked(Intent intent, 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessRecord app) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FilterComparison filter = new Intent.FilterComparison(intent); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentBindRecord i = bindings.get(filter); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = new IntentBindRecord(this, filter); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindings.put(filter, i); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppBindRecord a = i.apps.get(app); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = new AppBindRecord(this, i, app); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.apps.put(app, a); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn public boolean hasAutoCreateConnections() { 37691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn // XXX should probably keep a count of the number of auto-create 37791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn // connections directly in the service. 37891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn for (int conni=connections.size()-1; conni>=0; conni--) { 37991268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn ArrayList<ConnectionRecord> cr = connections.valueAt(conni); 38091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn for (int i=0; i<cr.size(); i++) { 38191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn if ((cr.get(i).flags&Context.BIND_AUTO_CREATE) != 0) { 38291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn return true; 38391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 38491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 38591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 38691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn return false; 38791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 38891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resetRestartCounter() { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartCount = 0; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartDelay = 0; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartTime = 0; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 395f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn public StartItem findDeliveredStart(int id, boolean remove) { 396f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = deliveredStarts.size(); 397f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 398f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = deliveredStarts.get(i); 399f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.id == id) { 400f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (remove) deliveredStarts.remove(i); 401f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return si; 402f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 403f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 404f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 405f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return null; 406f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 407f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 4080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public int getLastStartId() { 4090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return lastStartId; 4100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 4110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 4120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public int makeNextStartId() { 4130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastStartId++; 4140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastStartId < 1) { 4150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastStartId = 1; 4160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 4170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return lastStartId; 4180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 4190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 420d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void postNotification() { 421d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appUid = appInfo.uid; 422d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appPid = app.pid; 423d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0 && foregroundNoti != null) { 424b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 425b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 426b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 427b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 428b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final Notification localForegroundNoti = foregroundNoti; 429b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 430b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 431182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski NotificationManagerInternal nm = LocalServices.getService( 432182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski NotificationManagerInternal.class); 433d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler if (nm == null) { 434b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 435b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 436b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 437ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn if (localForegroundNoti.icon == 0) { 4382ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // It is not correct for the caller to supply a notification 4392ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // icon, but this used to be able to slip through, so for 4402ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // those dirty apps give it the app's icon. 441ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn localForegroundNoti.icon = appInfo.icon; 44291fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler 44391fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler // Do not allow apps to present a sneaky invisible content view either. 444ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn localForegroundNoti.contentView = null; 445ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn localForegroundNoti.bigContentView = null; 44691fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler CharSequence appName = appInfo.loadLabel( 44791fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ams.mContext.getPackageManager()); 44891fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler if (appName == null) { 44991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appName = appInfo.packageName; 45091fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler } 45191fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler Context ctx = null; 45291fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler try { 45391fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ctx = ams.mContext.createPackageContext( 45491fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appInfo.packageName, 0); 45591fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler Intent runningIntent = new Intent( 45691fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 45791fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler runningIntent.setData(Uri.fromParts("package", 45891fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appInfo.packageName, null)); 45991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler PendingIntent pi = PendingIntent.getActivity(ams.mContext, 0, 46091fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler runningIntent, PendingIntent.FLAG_UPDATE_CURRENT); 461255dd04271088590fedc46c8e22b2fd4ab142d39Selim Cinek localForegroundNoti.color = ams.mContext.getResources().getColor( 462255dd04271088590fedc46c8e22b2fd4ab142d39Selim Cinek com.android.internal 463255dd04271088590fedc46c8e22b2fd4ab142d39Selim Cinek .R.color.system_notification_accent_color); 464ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn localForegroundNoti.setLatestEventInfo(ctx, 46591fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ams.mContext.getString( 46691fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler com.android.internal.R.string 46791fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler .app_running_notification_title, 46891fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appName), 46991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ams.mContext.getString( 47091fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler com.android.internal.R.string 47191fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler .app_running_notification_text, 47291fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appName), 47391fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler pi); 47491fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler } catch (PackageManager.NameNotFoundException e) { 475ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn localForegroundNoti.icon = 0; 4762ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 4772ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 478ca92a4c38f8b4763cd72690091b3a5bbbd7c973aDianne Hackborn if (localForegroundNoti.icon == 0) { 479282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // Notifications whose icon is 0 are defined to not show 480282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // a notification, silently ignoring it. We don't want to 481282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // just ignore it, we want to prevent the service from 482282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // being foreground. 483282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn throw new RuntimeException("icon must be non-zero"); 484282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn } 485b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn int[] outId = new int[1]; 486182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski nm.enqueueNotification(localPackageName, localPackageName, 487f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn appUid, appPid, null, localForegroundId, localForegroundNoti, 488f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn outId, userId); 48934fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 4908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(ActivityManagerService.TAG, 4919e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn "Error showing notification for service", e); 4929e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // If it gave us a garbage notification, it doesn't 4939e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // get to be foreground. 4949e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn ams.setServiceForeground(name, ServiceRecord.this, 495eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato 0, null, true); 496eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato ams.crashApplication(appUid, appPid, localPackageName, 497eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato "Bad notification for startForeground: " + e); 498b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 499d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 500b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 501d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 502d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 503d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn 504d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void cancelNotification() { 505d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0) { 506b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 507b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 508b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 509b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 510b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 511b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 512b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn INotificationManager inm = NotificationManager.getService(); 513b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn if (inm == null) { 514b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 515b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 516b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 5174120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn inm.cancelNotificationWithTag(localPackageName, null, 5184120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn localForegroundId, userId); 51934fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 5208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(ActivityManagerService.TAG, 5219e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn "Error canceling notification for service", e); 522b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } catch (RemoteException e) { 523b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 524d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 525b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 526d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 527d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 528365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer 529365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer public void stripForegroundServiceFlagFromNotification() { 530365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer if (foregroundId == 0) { 531365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer return; 532365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 533365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer 534365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer final int localForegroundId = foregroundId; 535365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer final int localUserId = userId; 536365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer final String localPackageName = packageName; 537365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer 538365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer // Do asynchronous communication with notification manager to 539365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer // avoid deadlocks. 540365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer ams.mHandler.post(new Runnable() { 541365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer @Override 542365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer public void run() { 543365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer NotificationManagerInternal nmi = LocalServices.getService( 544365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer NotificationManagerInternal.class); 545365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer if (nmi == null) { 546365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer return; 547365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 548365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer nmi.removeForegroundServiceFlagFromNotification(localPackageName, localForegroundId, 549365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer localUserId); 550365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 551365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer }); 552365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 553d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn 55439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public void clearDeliveredStartsLocked() { 55539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=deliveredStarts.size()-1; i>=0; i--) { 55639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.get(i).removeUriPermissionsLocked(); 55739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 55839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.clear(); 55939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 56039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 562f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 563f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 564f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 565f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 5661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("ServiceRecord{") 5671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 568b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn .append(" u").append(userId) 5691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(' ').append(shortName).append('}'); 570f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 573