ServiceRecord.java revision eaa0718780a29df8fbe42c59beecee5557fdf785
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.BatteryStatsImpl; 20d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandlerimport com.android.server.NotificationManagerService; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.INotificationManager; 23d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.Notification; 24d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.NotificationManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ServiceInfo; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 31d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.os.RemoteException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 338a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 341ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.util.TimeUtils; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 3939792d2262352ae775091876d5488d2412a2ff92Dianne Hackbornimport java.util.HashSet; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A running application service. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ServiceRecord extends Binder { 4739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of delivery attempts before giving up. 4839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DELIVERY_COUNT = 3; 4939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 5039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of times it can fail during execution before giving up. 5139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DONE_EXECUTING_COUNT = 6; 5239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 53b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final ActivityManagerService ams; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl.Uid.Pkg.Serv stats; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ComponentName name; // service component. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String shortName; // name.flattenToShortString(). 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Intent.FilterComparison intent; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // original intent used to find service. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ServiceInfo serviceInfo; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all information about the service. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo appInfo; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // information about service's app. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String packageName; // the package implementing intent's component 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String processName; // process where this component wants to run 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String permission;// permission needed to access service 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String baseDir; // where activity source (resources etc) located 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String resDir; // where public activity source (public resources etc) located 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String dataDir; // where activity data should go 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean exported; // from ServiceInfo.exported 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Runnable restarter; // used to schedule retries of starting the service 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long createTime; // when this service was created 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Intent.FilterComparison, IntentBindRecord> bindings 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new HashMap<Intent.FilterComparison, IntentBindRecord>(); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All active bindings to the service. 7543d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn final HashMap<IBinder, ArrayList<ConnectionRecord>> connections 7643d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn = new HashMap<IBinder, ArrayList<ConnectionRecord>>(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder -> ConnectionRecord of all bound clients 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn ProcessRecord app; // where this service is running or null. 80d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn boolean isForeground; // is service currently in foreground mode? 81d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn int foregroundId; // Notification ID of last foreground req. 82d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn Notification foregroundNoti; // Notification record of foreground state. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long lastActivity; // last time there was some activity on the service. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startRequested; // someone explicitly called start? 85f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean stopIfKilled; // last onStart() said to stop if service killed? 86f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean callStart; // last onStart() has asked to alway be called on restart. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lastStartId; // identifier of most recent start request. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int executeNesting; // number of outstanding operations keeping foreground. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long executingStart; // start time of last execute request. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int crashCount; // number of times proc has crashed with service running 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int totalRestartCount; // number of times we have had to restart. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int restartCount; // number of restarts performed in a row. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartDelay; // delay until next restart attempt. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartTime; // time of last restart. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long nextRestartTime; // time when restartDelay will expire. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 97f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; // caching of toString 98f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 997e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn static class StartItem { 10039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ServiceRecord sr; 10139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final int id; 10239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final Intent intent; 10339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final int targetPermissionUid; 10439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn long deliveredTime; 10539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int deliveryCount; 10639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int doneExecutingCount; 1077e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner uriPermissions; 10839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 10939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn String stringName; // caching of toString 11039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 11139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn StartItem(ServiceRecord _sr, int _id, Intent _intent, int _targetPermissionUid) { 11239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sr = _sr; 11339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn id = _id; 11439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn intent = _intent; 11539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn targetPermissionUid = _targetPermissionUid; 11639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 11739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1187e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner getUriPermissionsLocked() { 1197e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions == null) { 1207e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = new UriPermissionOwner(sr.ams, this); 12139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1227e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn return uriPermissions; 12339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 12439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1257e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn void removeUriPermissionsLocked() { 1267e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions != null) { 1277e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions.removeUriPermissionsLocked(); 1287e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = null; 12939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 13039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 13139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 13239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public String toString() { 13339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (stringName != null) { 13439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName; 13539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 13639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn StringBuilder sb = new StringBuilder(128); 13739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sb.append("ServiceRecord{") 13839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(sr))) 13939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(' ').append(sr.shortName) 14039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" StartItem ") 14139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 14239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" id=").append(id).append('}'); 14339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName = sb.toString(); 14439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 14739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> deliveredStarts = new ArrayList<StartItem>(); 14839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments which been delivered. 14939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> pendingStarts = new ArrayList<StartItem>(); 15039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments that haven't yet been delivered. 15139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 152f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn void dumpStartList(PrintWriter pw, String prefix, List<StartItem> list, long now) { 153f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = list.size(); 154f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 155f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = list.get(i); 156f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.print("#"); pw.print(i); 157f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" id="); pw.print(si.id); 1581ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (now != 0) { 1591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" dur="); 1601ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(si.deliveredTime, now, pw); 1611ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 162f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.deliveryCount != 0) { 163f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dc="); pw.print(si.deliveryCount); 164f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 165f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.doneExecutingCount != 0) { 166f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dxc="); pw.print(si.doneExecutingCount); 167f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 16839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(""); 16939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print(" intent="); 170f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.intent != null) pw.println(si.intent.toString()); 171f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn else pw.println("null"); 17239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (si.targetPermissionUid >= 0) { 17339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print(" targetPermissionUid="); 17439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(si.targetPermissionUid); 17539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1767e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions != null) { 1777e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions.readUriPermissions != null) { 1787e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.print(prefix); pw.print(" readUriPermissions="); 1797e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.println(si.uriPermissions.readUriPermissions); 1807e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn } 1817e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions.writeUriPermissions != null) { 1827e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.print(prefix); pw.print(" writeUriPermissions="); 1837e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.println(si.uriPermissions.writeUriPermissions); 1847e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn } 18539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 186f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 187f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 188f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 1901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("intent={"); 1911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(intent.getIntent().toShortString(true, false)); 1921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 1931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("packageName="); pw.println(packageName); 1941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("processName="); pw.println(processName); 1951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (permission != null) { 1961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("permission="); pw.println(permission); 1971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 198fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn long now = SystemClock.uptimeMillis(); 1991ebccf531d1049853b3b0630035434619682c016Dianne Hackborn long nowReal = SystemClock.elapsedRealtime(); 2001ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(prefix); pw.print("baseDir="); pw.println(baseDir); 2011ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (!resDir.equals(baseDir)) pw.print(prefix); pw.print("resDir="); pw.println(resDir); 2021ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(prefix); pw.print("dataDir="); pw.println(dataDir); 2031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("app="); pw.println(app); 204d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (isForeground || foregroundId != 0) { 205d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("isForeground="); pw.print(isForeground); 206d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundId="); pw.print(foregroundId); 207d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundNoti="); pw.println(foregroundNoti); 208d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 2099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.print("createTime="); 2101ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(createTime, nowReal, pw); 2111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" lastActivity="); 2121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(lastActivity, now, pw); 2131ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.println(""); 2141ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(prefix); pw.print(" executingStart="); 2151ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(executingStart, now, pw); 2161ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" restartTime="); 2171ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartTime, now, pw); 2181ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.println(""); 219d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (startRequested || lastStartId != 0) { 220d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("startRequested="); pw.print(startRequested); 221f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" stopIfKilled="); pw.print(stopIfKilled); 222f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" callStart="); pw.print(callStart); 223d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" lastStartId="); pw.println(lastStartId); 224d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 225d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (executeNesting != 0 || crashCount != 0 || restartCount != 0 226d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn || restartDelay != 0 || nextRestartTime != 0) { 227d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("executeNesting="); pw.print(executeNesting); 228d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" restartCount="); pw.print(restartCount); 2291ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" restartDelay="); 2301ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartDelay, now, pw); 2311ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" nextRestartTime="); 2321ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(nextRestartTime, now, pw); 233d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" crashCount="); pw.println(crashCount); 234d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 235f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (deliveredStarts.size() > 0) { 236f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Delivered Starts:"); 2371ebccf531d1049853b3b0630035434619682c016Dianne Hackborn dumpStartList(pw, prefix, deliveredStarts, now); 238f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 239f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (pendingStarts.size() > 0) { 240f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Pending Starts:"); 241f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn dumpStartList(pw, prefix, pendingStarts, 0); 242f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bindings.size() > 0) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<IntentBindRecord> it = bindings.values().iterator(); 245f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Bindings:"); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it.hasNext()) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentBindRecord b = it.next(); 2481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("* IntentBindRecord{"); 2491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(b))); 2501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println("}:"); 2511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn b.dumpInService(pw, prefix + " "); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.size() > 0) { 2551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println("All Connections:"); 25643d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn Iterator<ArrayList<ConnectionRecord>> it = connections.values().iterator(); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it.hasNext()) { 25843d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn ArrayList<ConnectionRecord> c = it.next(); 25943d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn for (int i=0; i<c.size(); i++) { 26043d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn pw.print(prefix); pw.print(" "); pw.println(c.get(i)); 26143d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 266b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ServiceRecord(ActivityManagerService ams, 267b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FilterComparison intent, ServiceInfo sInfo, Runnable restarter) { 269b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn this.ams = ams; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.stats = servStats; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.name = name; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shortName = name.flattenToShortString(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.intent = intent; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serviceInfo = sInfo; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = sInfo.applicationInfo; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = sInfo.applicationInfo.packageName; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processName = sInfo.processName; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = sInfo.permission; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project baseDir = sInfo.applicationInfo.sourceDir; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resDir = sInfo.applicationInfo.publicSourceDir; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dataDir = sInfo.applicationInfo.dataDir; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exported = sInfo.exported; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.restarter = restarter; 2849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn createTime = SystemClock.elapsedRealtime(); 2859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn lastActivity = SystemClock.uptimeMillis(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AppBindRecord retrieveAppBindingLocked(Intent intent, 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessRecord app) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FilterComparison filter = new Intent.FilterComparison(intent); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentBindRecord i = bindings.get(filter); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = new IntentBindRecord(this, filter); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindings.put(filter, i); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppBindRecord a = i.apps.get(app); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = new AppBindRecord(this, i, app); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.apps.put(app, a); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resetRestartCounter() { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartCount = 0; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartDelay = 0; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartTime = 0; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 311f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn public StartItem findDeliveredStart(int id, boolean remove) { 312f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = deliveredStarts.size(); 313f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 314f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = deliveredStarts.get(i); 315f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.id == id) { 316f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (remove) deliveredStarts.remove(i); 317f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return si; 318f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 319f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 320f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 321f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return null; 322f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 323f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 324d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void postNotification() { 325d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appUid = appInfo.uid; 326d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appPid = app.pid; 327d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0 && foregroundNoti != null) { 328b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 329b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 330b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 331b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 332b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final Notification localForegroundNoti = foregroundNoti; 333b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 334b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 335d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler NotificationManagerService nm = 336d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler (NotificationManagerService) NotificationManager.getService(); 337d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler if (nm == null) { 338b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 339b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 340b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 341b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn int[] outId = new int[1]; 342d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler nm.enqueueNotificationInternal(localPackageName, appUid, appPid, 343d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler null, localForegroundId, localForegroundNoti, outId); 34434fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 3458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(ActivityManagerService.TAG, 3469e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn "Error showing notification for service", e); 3479e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // If it gave us a garbage notification, it doesn't 3489e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // get to be foreground. 3499e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn ams.setServiceForeground(name, ServiceRecord.this, 350eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato 0, null, true); 351eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato ams.crashApplication(appUid, appPid, localPackageName, 352eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato "Bad notification for startForeground: " + e); 353b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 354d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 355b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 356d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 357d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 358d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn 359d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void cancelNotification() { 360d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0) { 361b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 362b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 363b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 364b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 365b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 366b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 367b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn INotificationManager inm = NotificationManager.getService(); 368b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn if (inm == null) { 369b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 370b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 371b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 372b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn inm.cancelNotification(localPackageName, localForegroundId); 37334fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 3748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(ActivityManagerService.TAG, 3759e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn "Error canceling notification for service", e); 376b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } catch (RemoteException e) { 377b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 378d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 379b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 380d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 381d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 382d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn 38339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public void clearDeliveredStartsLocked() { 38439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=deliveredStarts.size()-1; i>=0; i--) { 38539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.get(i).removeUriPermissionsLocked(); 38639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 38739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.clear(); 38839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 38939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 391f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 392f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 393f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 394f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 3951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("ServiceRecord{") 3961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 3971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(' ').append(shortName).append('}'); 398f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 401