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 194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ServiceState; 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; 365a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynoldsimport android.os.Build; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 38d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.os.RemoteException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 40f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 41390517be2d60dd6e6264150c190c372d89bb331aDianne Hackbornimport android.provider.Settings; 42390517be2d60dd6e6264150c190c372d89bb331aDianne Hackbornimport android.util.ArrayMap; 438a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 441ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.util.TimeUtils; 456b51414154e621a073e898835d9ffaa671c862d8Yi Jinimport android.util.proto.ProtoOutputStream; 466b51414154e621a073e898835d9ffaa671c862d8Yi Jinimport android.util.proto.ProtoUtils; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 518a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkeyimport java.util.Objects; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; 54e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; 55e23149f1555303940d212b742707518b7f9f84abWale Ogunwale 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A running application service. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 590b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukifinal class ServiceRecord extends Binder implements ComponentName.WithComponentName { 60e23149f1555303940d212b742707518b7f9f84abWale Ogunwale private static final String TAG = TAG_WITH_CLASS_NAME ? "ServiceRecord" : TAG_AM; 61e23149f1555303940d212b742707518b7f9f84abWale Ogunwale 6239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of delivery attempts before giving up. 6339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DELIVERY_COUNT = 3; 6439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 6539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of times it can fail during execution before giving up. 6639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DONE_EXECUTING_COUNT = 6; 6739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 68b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final ActivityManagerService ams; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl.Uid.Pkg.Serv stats; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ComponentName name; // service component. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String shortName; // name.flattenToShortString(). 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Intent.FilterComparison intent; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // original intent used to find service. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ServiceInfo serviceInfo; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all information about the service. 76cc269d93b5d2bf2dc566f969e8d49cc525ec8864Fyodor Kupolov ApplicationInfo appInfo; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // information about service's app. 78742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final int userId; // user that this service is running as 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String packageName; // the package implementing intent's component 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String processName; // process where this component wants to run 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String permission;// permission needed to access service 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean exported; // from ServiceInfo.exported 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Runnable restarter; // used to schedule retries of starting the service 846b51414154e621a073e898835d9ffaa671c862d8Yi Jin final long createRealTime; // when this service was created 85390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn final ArrayMap<Intent.FilterComparison, IntentBindRecord> bindings 86390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn = new ArrayMap<Intent.FilterComparison, IntentBindRecord>(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All active bindings to the service. 88390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn final ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections 89390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn = new ArrayMap<IBinder, ArrayList<ConnectionRecord>>(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder -> ConnectionRecord of all bound clients 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 92d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn ProcessRecord app; // where this service is running or null. 93a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn ProcessRecord isolatedProc; // keep track of isolated process, if requested 944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState tracker; // tracking service execution, may be null 954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState restartTracker; // tracking service restart 96a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn boolean whitelistManager; // any bindings to this service have BIND_ALLOW_WHITELIST_MANAGEMENT? 979210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn boolean delayed; // are we waiting to start this service in the background? 9808992ac57e973d6bf32693725ebb341a481e5944Christopher Tate boolean fgRequired; // is the service required to go foreground after starting? 9908992ac57e973d6bf32693725ebb341a481e5944Christopher Tate boolean fgWaiting; // is a timeout for going foreground already scheduled? 100d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn boolean isForeground; // is service currently in foreground mode? 101d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn int foregroundId; // Notification ID of last foreground req. 102d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn Notification foregroundNoti; // Notification record of foreground state. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long lastActivity; // last time there was some activity on the service. 1049210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn long startingBgTimeout; // time at which we scheduled this for a delayed start. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startRequested; // someone explicitly called start? 1069210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn boolean delayedStop; // service has been stopped but is in a delayed start? 107f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean stopIfKilled; // last onStart() said to stop if service killed? 1086b51414154e621a073e898835d9ffaa671c862d8Yi Jin boolean callStart; // last onStart() has asked to always be called on restart. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int executeNesting; // number of outstanding operations keeping foreground. 110bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn boolean executeFg; // should we be executing in the foreground? 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long executingStart; // start time of last execute request. 112bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn boolean createdFromFg; // was this service last created due to a foreground process call? 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int crashCount; // number of times proc has crashed with service running 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int totalRestartCount; // number of times we have had to restart. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int restartCount; // number of restarts performed in a row. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartDelay; // delay until next restart attempt. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartTime; // time of last restart. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long nextRestartTime; // time when restartDelay will expire. 119455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn boolean destroying; // set when we have started destroying the service 12066c4a824b9b11a47c7bd1bf858d92fe207409ab9Craig Mautner long destroyTime; // time at which destory was initiated. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 122f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; // caching of toString 123af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 1240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private int lastStartId; // identifier of most recent start request. 1250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1267e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn static class StartItem { 12739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ServiceRecord sr; 1280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final boolean taskRemoved; 12939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final int id; 13051b3aaccfe7f8d7a97fb1218c40a37428f26a6a1Todd Kennedy final int callingId; 13139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final Intent intent; 13221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn final ActivityManagerService.NeededUriGrants neededGrants; 13339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn long deliveredTime; 13439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int deliveryCount; 13539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int doneExecutingCount; 1367e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner uriPermissions; 13739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 13839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn String stringName; // caching of toString 13939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn StartItem(ServiceRecord _sr, boolean _taskRemoved, int _id, Intent _intent, 14151b3aaccfe7f8d7a97fb1218c40a37428f26a6a1Todd Kennedy ActivityManagerService.NeededUriGrants _neededGrants, int _callingId) { 14239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sr = _sr; 1430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn taskRemoved = _taskRemoved; 14439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn id = _id; 14539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn intent = _intent; 14621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn neededGrants = _neededGrants; 14751b3aaccfe7f8d7a97fb1218c40a37428f26a6a1Todd Kennedy callingId = _callingId; 14839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1507e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner getUriPermissionsLocked() { 1517e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions == null) { 1527e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = new UriPermissionOwner(sr.ams, this); 15339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1547e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn return uriPermissions; 15539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 15639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1577e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn void removeUriPermissionsLocked() { 1587e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions != null) { 1597e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions.removeUriPermissionsLocked(); 1607e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = null; 16139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 16239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 16339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1646b51414154e621a073e898835d9ffaa671c862d8Yi Jin public void writeToProto(ProtoOutputStream proto, long fieldId, long now) { 1656b51414154e621a073e898835d9ffaa671c862d8Yi Jin long token = proto.start(fieldId); 166163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin proto.write(ServiceRecordProto.StartItem.ID, id); 1676b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, 168163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin ServiceRecordProto.StartItem.DURATION, deliveredTime, now); 169163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin proto.write(ServiceRecordProto.StartItem.DELIVERY_COUNT, deliveryCount); 170163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin proto.write(ServiceRecordProto.StartItem.DONE_EXECUTING_COUNT, doneExecutingCount); 1716b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (intent != null) { 172163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin intent.writeToProto(proto, ServiceRecordProto.StartItem.INTENT, true, true, 1736b51414154e621a073e898835d9ffaa671c862d8Yi Jin true, false); 1746b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 1756b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (neededGrants != null) { 176163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin neededGrants.writeToProto(proto, ServiceRecordProto.StartItem.NEEDED_GRANTS); 1776b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 1786b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (uriPermissions != null) { 179163967fe8ef994a69a48b6940deb7cad0fcdec37Yi Jin uriPermissions.writeToProto(proto, ServiceRecordProto.StartItem.URI_PERMISSIONS); 1806b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 1816b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(token); 1826b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 1836b51414154e621a073e898835d9ffaa671c862d8Yi Jin 18439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public String toString() { 18539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (stringName != null) { 18639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName; 18739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 18839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn StringBuilder sb = new StringBuilder(128); 18939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sb.append("ServiceRecord{") 19039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(sr))) 19139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(' ').append(sr.shortName) 19239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" StartItem ") 19339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 19439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" id=").append(id).append('}'); 19539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName = sb.toString(); 19639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 19739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 19839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 19939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> deliveredStarts = new ArrayList<StartItem>(); 20039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments which been delivered. 20139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> pendingStarts = new ArrayList<StartItem>(); 20239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments that haven't yet been delivered. 20339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 204f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn void dumpStartList(PrintWriter pw, String prefix, List<StartItem> list, long now) { 205f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = list.size(); 206f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 207f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = list.get(i); 208f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.print("#"); pw.print(i); 209f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" id="); pw.print(si.id); 2101ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (now != 0) { 2111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" dur="); 2121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(si.deliveredTime, now, pw); 2131ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 214f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.deliveryCount != 0) { 215f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dc="); pw.print(si.deliveryCount); 216f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 217f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.doneExecutingCount != 0) { 218f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dxc="); pw.print(si.doneExecutingCount); 219f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 22039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(""); 22139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print(" intent="); 222f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.intent != null) pw.println(si.intent.toString()); 223f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn else pw.println("null"); 22421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn if (si.neededGrants != null) { 22521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.print(prefix); pw.print(" neededGrants="); 22621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.println(si.neededGrants); 22739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 2287e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions != null) { 229846318a3250fa95f47a9decfbffb05a31dbd0006Jeff Sharkey si.uriPermissions.dump(pw, prefix); 23039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 231f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 232f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 233af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 2346b51414154e621a073e898835d9ffaa671c862d8Yi Jin void writeToProto(ProtoOutputStream proto, long fieldId) { 2356b51414154e621a073e898835d9ffaa671c862d8Yi Jin long token = proto.start(fieldId); 2366b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.SHORT_NAME, this.shortName); 2376b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.IS_RUNNING, app != null); 2386b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (app != null) { 2396b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.PID, app.pid); 2406b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2416b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (intent != null) { 2426b51414154e621a073e898835d9ffaa671c862d8Yi Jin intent.getIntent().writeToProto(proto, ServiceRecordProto.INTENT, false, true, false, 2436b51414154e621a073e898835d9ffaa671c862d8Yi Jin true); 2446b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2456b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.PACKAGE_NAME, packageName); 2466b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.PROCESS_NAME, processName); 2476b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.PERMISSION, permission); 2486b51414154e621a073e898835d9ffaa671c862d8Yi Jin 2496b51414154e621a073e898835d9ffaa671c862d8Yi Jin long now = SystemClock.uptimeMillis(); 2506b51414154e621a073e898835d9ffaa671c862d8Yi Jin long nowReal = SystemClock.elapsedRealtime(); 2516b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (appInfo != null) { 2526b51414154e621a073e898835d9ffaa671c862d8Yi Jin long appInfoToken = proto.start(ServiceRecordProto.APPINFO); 2536b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.AppInfo.BASE_DIR, appInfo.sourceDir); 2546b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (!Objects.equals(appInfo.sourceDir, appInfo.publicSourceDir)) { 2556b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.AppInfo.RES_DIR, appInfo.publicSourceDir); 2566b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2576b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.AppInfo.DATA_DIR, appInfo.dataDir); 2586b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(appInfoToken); 2596b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2606b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (app != null) { 2616b51414154e621a073e898835d9ffaa671c862d8Yi Jin app.writeToProto(proto, ServiceRecordProto.APP); 2626b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2636b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (isolatedProc != null) { 2646b51414154e621a073e898835d9ffaa671c862d8Yi Jin isolatedProc.writeToProto(proto, ServiceRecordProto.ISOLATED_PROC); 2656b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2666b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.WHITELIST_MANAGER, whitelistManager); 2676b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.DELAYED, delayed); 2686b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (isForeground || foregroundId != 0) { 2696b51414154e621a073e898835d9ffaa671c862d8Yi Jin long fgToken = proto.start(ServiceRecordProto.FOREGROUND); 2706b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Foreground.ID, foregroundId); 2716b51414154e621a073e898835d9ffaa671c862d8Yi Jin foregroundNoti.writeToProto(proto, ServiceRecordProto.Foreground.NOTIFICATION); 2726b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(fgToken); 2736b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2746b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, ServiceRecordProto.CREATE_REAL_TIME, createRealTime, nowReal); 2756b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, 2766b51414154e621a073e898835d9ffaa671c862d8Yi Jin ServiceRecordProto.STARTING_BG_TIMEOUT, startingBgTimeout, now); 2776b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, ServiceRecordProto.LAST_ACTIVITY_TIME, lastActivity, now); 2786b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, ServiceRecordProto.RESTART_TIME, restartTime, now); 2796b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.CREATED_FROM_FG, createdFromFg); 2806b51414154e621a073e898835d9ffaa671c862d8Yi Jin 2816b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (startRequested || delayedStop || lastStartId != 0) { 2826b51414154e621a073e898835d9ffaa671c862d8Yi Jin long startToken = proto.start(ServiceRecordProto.START); 2836b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Start.START_REQUESTED, startRequested); 2846b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Start.DELAYED_STOP, delayedStop); 2856b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Start.STOP_IF_KILLED, stopIfKilled); 2866b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Start.LAST_START_ID, lastStartId); 2876b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(startToken); 2886b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2896b51414154e621a073e898835d9ffaa671c862d8Yi Jin 2906b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (executeNesting != 0) { 2916b51414154e621a073e898835d9ffaa671c862d8Yi Jin long executNestingToken = proto.start(ServiceRecordProto.EXECUTE); 2926b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.ExecuteNesting.EXECUTE_NESTING, executeNesting); 2936b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.ExecuteNesting.EXECUTE_FG, executeFg); 2946b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, 2956b51414154e621a073e898835d9ffaa671c862d8Yi Jin ServiceRecordProto.ExecuteNesting.EXECUTING_START, executingStart, now); 2966b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(executNestingToken); 2976b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 2986b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (destroying || destroyTime != 0) { 2996b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, ServiceRecordProto.DESTORY_TIME, destroyTime, now); 3006b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3016b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (crashCount != 0 || restartCount != 0 || restartDelay != 0 || nextRestartTime != 0) { 3026b51414154e621a073e898835d9ffaa671c862d8Yi Jin long crashToken = proto.start(ServiceRecordProto.CRASH); 3036b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Crash.RESTART_COUNT, restartCount); 3046b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, ServiceRecordProto.Crash.RESTART_DELAY, restartDelay, now); 3056b51414154e621a073e898835d9ffaa671c862d8Yi Jin ProtoUtils.toDuration(proto, 3066b51414154e621a073e898835d9ffaa671c862d8Yi Jin ServiceRecordProto.Crash.NEXT_RESTART_TIME, nextRestartTime, now); 3076b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.write(ServiceRecordProto.Crash.CRASH_COUNT, crashCount); 3086b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(crashToken); 3096b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3106b51414154e621a073e898835d9ffaa671c862d8Yi Jin 3116b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (deliveredStarts.size() > 0) { 3126b51414154e621a073e898835d9ffaa671c862d8Yi Jin final int N = deliveredStarts.size(); 3136b51414154e621a073e898835d9ffaa671c862d8Yi Jin for (int i = 0; i < N; i++) { 3146b51414154e621a073e898835d9ffaa671c862d8Yi Jin deliveredStarts.get(i).writeToProto(proto, 3156b51414154e621a073e898835d9ffaa671c862d8Yi Jin ServiceRecordProto.DELIVERED_STARTS, now); 3166b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3176b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3186b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (pendingStarts.size() > 0) { 3196b51414154e621a073e898835d9ffaa671c862d8Yi Jin final int N = pendingStarts.size(); 3206b51414154e621a073e898835d9ffaa671c862d8Yi Jin for (int i = 0; i < N; i++) { 3216b51414154e621a073e898835d9ffaa671c862d8Yi Jin pendingStarts.get(i).writeToProto(proto, ServiceRecordProto.PENDING_STARTS, now); 3226b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3236b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3246b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (bindings.size() > 0) { 3256b51414154e621a073e898835d9ffaa671c862d8Yi Jin final int N = bindings.size(); 3266b51414154e621a073e898835d9ffaa671c862d8Yi Jin for (int i=0; i<N; i++) { 3276b51414154e621a073e898835d9ffaa671c862d8Yi Jin IntentBindRecord b = bindings.valueAt(i); 3286b51414154e621a073e898835d9ffaa671c862d8Yi Jin b.writeToProto(proto, ServiceRecordProto.BINDINGS); 3296b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3306b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3316b51414154e621a073e898835d9ffaa671c862d8Yi Jin if (connections.size() > 0) { 3326b51414154e621a073e898835d9ffaa671c862d8Yi Jin final int N = connections.size(); 3336b51414154e621a073e898835d9ffaa671c862d8Yi Jin for (int conni=0; conni<N; conni++) { 3346b51414154e621a073e898835d9ffaa671c862d8Yi Jin ArrayList<ConnectionRecord> c = connections.valueAt(conni); 3356b51414154e621a073e898835d9ffaa671c862d8Yi Jin for (int i=0; i<c.size(); i++) { 3366b51414154e621a073e898835d9ffaa671c862d8Yi Jin c.get(i).writeToProto(proto, ServiceRecordProto.CONNECTIONS); 3376b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3386b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3396b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3406b51414154e621a073e898835d9ffaa671c862d8Yi Jin proto.end(token); 3416b51414154e621a073e898835d9ffaa671c862d8Yi Jin } 3426b51414154e621a073e898835d9ffaa671c862d8Yi Jin 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 3441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("intent={"); 34521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.print(intent.getIntent().toShortString(false, true, false, true)); 3461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 3471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("packageName="); pw.println(packageName); 3481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("processName="); pw.println(processName); 3491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (permission != null) { 3501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("permission="); pw.println(permission); 3511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 352fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn long now = SystemClock.uptimeMillis(); 3531ebccf531d1049853b3b0630035434619682c016Dianne Hackborn long nowReal = SystemClock.elapsedRealtime(); 3548a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (appInfo != null) { 3558a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey pw.print(prefix); pw.print("baseDir="); pw.println(appInfo.sourceDir); 3568a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (!Objects.equals(appInfo.sourceDir, appInfo.publicSourceDir)) { 3578a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey pw.print(prefix); pw.print("resDir="); pw.println(appInfo.publicSourceDir); 3588a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 3598a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey pw.print(prefix); pw.print("dataDir="); pw.println(appInfo.dataDir); 360a301fe61c8573c06be754d5788a84d19188ee2d3Marco Nelissen } 3611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("app="); pw.println(app); 362a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn if (isolatedProc != null) { 363a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn pw.print(prefix); pw.print("isolatedProc="); pw.println(isolatedProc); 364a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn } 365a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn if (whitelistManager) { 366a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn pw.print(prefix); pw.print("whitelistManager="); pw.println(whitelistManager); 367a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn } 3689210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn if (delayed) { 3699210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(prefix); pw.print("delayed="); pw.println(delayed); 3709210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn } 371d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (isForeground || foregroundId != 0) { 372d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("isForeground="); pw.print(isForeground); 373d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundId="); pw.print(foregroundId); 374d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundNoti="); pw.println(foregroundNoti); 375d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 3769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.print("createTime="); 3776b51414154e621a073e898835d9ffaa671c862d8Yi Jin TimeUtils.formatDuration(createRealTime, nowReal, pw); 3789210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(" startingBgTimeout="); 3799210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn TimeUtils.formatDuration(startingBgTimeout, now, pw); 380bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.println(); 3819210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(prefix); pw.print("lastActivity="); 3829210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn TimeUtils.formatDuration(lastActivity, now, pw); 3839210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(" restartTime="); 3841ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartTime, now, pw); 385bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(" createdFromFg="); pw.println(createdFromFg); 3869210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn if (startRequested || delayedStop || lastStartId != 0) { 387d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("startRequested="); pw.print(startRequested); 3889210bc85545f31973c957b5179e6a82d05f473c6Dianne Hackborn pw.print(" delayedStop="); pw.print(delayedStop); 389f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" stopIfKilled="); pw.print(stopIfKilled); 390f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" callStart="); pw.print(callStart); 391d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" lastStartId="); pw.println(lastStartId); 392d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 393bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn if (executeNesting != 0) { 394d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("executeNesting="); pw.print(executeNesting); 395bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(" executeFg="); pw.print(executeFg); 396bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(" executingStart="); 397bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn TimeUtils.formatDuration(executingStart, now, pw); 3982be00933163bb2bfa6b43cf2e1ddde7c284c7c4cDianne Hackborn pw.println(); 399bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn } 400455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn if (destroying || destroyTime != 0) { 401455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn pw.print(prefix); pw.print("destroying="); pw.print(destroying); 402455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn pw.print(" destroyTime="); 403455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn TimeUtils.formatDuration(destroyTime, now, pw); 404455625e298204a27d3958eb56ff155f27562eec8Dianne Hackborn pw.println(); 40566c4a824b9b11a47c7bd1bf858d92fe207409ab9Craig Mautner } 406bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn if (crashCount != 0 || restartCount != 0 407bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn || restartDelay != 0 || nextRestartTime != 0) { 408bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn pw.print(prefix); pw.print("restartCount="); pw.print(restartCount); 4091ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" restartDelay="); 4101ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartDelay, now, pw); 4111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" nextRestartTime="); 4121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(nextRestartTime, now, pw); 413d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" crashCount="); pw.println(crashCount); 414d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 415f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (deliveredStarts.size() > 0) { 416f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Delivered Starts:"); 4171ebccf531d1049853b3b0630035434619682c016Dianne Hackborn dumpStartList(pw, prefix, deliveredStarts, now); 418f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 419f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (pendingStarts.size() > 0) { 420f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Pending Starts:"); 421f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn dumpStartList(pw, prefix, pendingStarts, 0); 422f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bindings.size() > 0) { 424f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Bindings:"); 425390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn for (int i=0; i<bindings.size(); i++) { 426390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn IntentBindRecord b = bindings.valueAt(i); 4271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("* IntentBindRecord{"); 4281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(b))); 4290c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn if ((b.collectFlags()&Context.BIND_AUTO_CREATE) != 0) { 4300c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn pw.append(" CREATE"); 4310c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn } 4321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println("}:"); 4331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn b.dumpInService(pw, prefix + " "); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.size() > 0) { 4371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println("All Connections:"); 438390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn for (int conni=0; conni<connections.size(); conni++) { 439390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn ArrayList<ConnectionRecord> c = connections.valueAt(conni); 44043d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn for (int i=0; i<c.size(); i++) { 44143d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn pw.print(prefix); pw.print(" "); pw.println(c.get(i)); 44243d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 447b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ServiceRecord(ActivityManagerService ams, 448b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, 449bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, 450bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn Runnable restarter) { 451b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn this.ams = ams; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.stats = servStats; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.name = name; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shortName = name.flattenToShortString(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.intent = intent; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serviceInfo = sInfo; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = sInfo.applicationInfo; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = sInfo.applicationInfo.packageName; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processName = sInfo.processName; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = sInfo.permission; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exported = sInfo.exported; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.restarter = restarter; 4636b51414154e621a073e898835d9ffaa671c862d8Yi Jin createRealTime = SystemClock.elapsedRealtime(); 4649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn lastActivity = SystemClock.uptimeMillis(); 465f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn userId = UserHandle.getUserId(appInfo.uid); 466bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn createdFromFg = callerIsFg; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ServiceState getTracker() { 470bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn if (tracker != null) { 471bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn return tracker; 472bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn } 473bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { 474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn tracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName, 4758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.applicationInfo.uid, serviceInfo.applicationInfo.versionCode, 4768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.processName, serviceInfo.name); 477164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn tracker.applyNewOwner(this); 478bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn } 479bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn return tracker; 480bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn } 481bd754f44cd8a39bd2298e0d6496c50b79162fb90Dianne Hackborn 482164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public void forceClearTracker() { 483164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (tracker != null) { 484878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn tracker.clearCurrentOwner(this, true); 485164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn tracker = null; 486164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 487164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 488164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn 489daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn public void makeRestarting(int memFactor, long now) { 490daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (restartTracker == null) { 491daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { 492daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn restartTracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName, 4938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.applicationInfo.uid, serviceInfo.applicationInfo.versionCode, 4948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serviceInfo.processName, serviceInfo.name); 495daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 496daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (restartTracker == null) { 497daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn return; 498daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 499daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 500daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn restartTracker.setRestarting(true, memFactor, now); 501daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 502daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AppBindRecord retrieveAppBindingLocked(Intent intent, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessRecord app) { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FilterComparison filter = new Intent.FilterComparison(intent); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentBindRecord i = bindings.get(filter); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = new IntentBindRecord(this, filter); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindings.put(filter, i); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppBindRecord a = i.apps.get(app); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = new AppBindRecord(this, i, app); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.apps.put(app, a); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn public boolean hasAutoCreateConnections() { 52191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn // XXX should probably keep a count of the number of auto-create 52291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn // connections directly in the service. 52391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn for (int conni=connections.size()-1; conni>=0; conni--) { 52491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn ArrayList<ConnectionRecord> cr = connections.valueAt(conni); 52591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn for (int i=0; i<cr.size(); i++) { 52691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn if ((cr.get(i).flags&Context.BIND_AUTO_CREATE) != 0) { 52791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn return true; 52891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 52991268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 53091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 53191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn return false; 53291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn } 53391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn 534a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn public void updateWhitelistManager() { 535a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn whitelistManager = false; 536a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn for (int conni=connections.size()-1; conni>=0; conni--) { 537a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn ArrayList<ConnectionRecord> cr = connections.valueAt(conni); 538a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn for (int i=0; i<cr.size(); i++) { 539a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn if ((cr.get(i).flags&Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0) { 540a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn whitelistManager = true; 541a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn return; 542a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn } 543a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn } 544a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn } 545a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn } 546a590d2be935ef502943a1e6615500aa10e67c85aDianne Hackborn 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resetRestartCounter() { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartCount = 0; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartDelay = 0; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartTime = 0; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 552af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 55342ecdf3dc13361148ae6b37a4bd70967a31e2793Dianne Hackborn public StartItem findDeliveredStart(int id, boolean taskRemoved, boolean remove) { 554f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = deliveredStarts.size(); 555f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 556f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = deliveredStarts.get(i); 55742ecdf3dc13361148ae6b37a4bd70967a31e2793Dianne Hackborn if (si.id == id && si.taskRemoved == taskRemoved) { 558f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (remove) deliveredStarts.remove(i); 559f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return si; 560f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 561f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 562af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 563f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return null; 564f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 565af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 5660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public int getLastStartId() { 5670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return lastStartId; 5680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 5690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 5700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public int makeNextStartId() { 5710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastStartId++; 5720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastStartId < 1) { 5730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastStartId = 1; 5740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 5750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return lastStartId; 5760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 5770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 578d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void postNotification() { 579d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appUid = appInfo.uid; 580d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appPid = app.pid; 581d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0 && foregroundNoti != null) { 582b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 583b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 584b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 585b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 586d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler final Notification _foregroundNoti = foregroundNoti; 587b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 588b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 589182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski NotificationManagerInternal nm = LocalServices.getService( 590182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski NotificationManagerInternal.class); 591d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler if (nm == null) { 592b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 593b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 594d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler Notification localForegroundNoti = _foregroundNoti; 595b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 596d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler if (localForegroundNoti.getSmallIcon() == null) { 597e2c1f9b78b0df6d1ce945c7b5083aad190a61585Wang Le // It is not correct for the caller to not supply a notification 5982ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // icon, but this used to be able to slip through, so for 599d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler // those dirty apps we will create a notification clearly 600d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler // blaming the app. 6014e78706f439d318ae7a78927d98f734351a89f64Dan Sandler Slog.v(TAG, "Attempted to start a foreground service (" 6024e78706f439d318ae7a78927d98f734351a89f64Dan Sandler + name 6034e78706f439d318ae7a78927d98f734351a89f64Dan Sandler + ") with a broken notification (no icon: " 6044e78706f439d318ae7a78927d98f734351a89f64Dan Sandler + localForegroundNoti 6054e78706f439d318ae7a78927d98f734351a89f64Dan Sandler + ")"); 60691fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler 60791fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler CharSequence appName = appInfo.loadLabel( 60891fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ams.mContext.getPackageManager()); 60991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler if (appName == null) { 61091fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appName = appInfo.packageName; 61191fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler } 61291fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler Context ctx = null; 61391fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler try { 614e2c1f9b78b0df6d1ce945c7b5083aad190a61585Wang Le ctx = ams.mContext.createPackageContextAsUser( 615e2c1f9b78b0df6d1ce945c7b5083aad190a61585Wang Le appInfo.packageName, 0, new UserHandle(userId)); 616d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler 617af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch Notification.Builder notiBuilder = new Notification.Builder(ctx, 618bad42976009ffb61010136ed8055f9e0f6d2e416Julia Reynolds localForegroundNoti.getChannelId()); 619d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler 620d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler // it's ugly, but it clearly identifies the app 621d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler notiBuilder.setSmallIcon(appInfo.icon); 622d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler 6234e78706f439d318ae7a78927d98f734351a89f64Dan Sandler // mark as foreground 6244e78706f439d318ae7a78927d98f734351a89f64Dan Sandler notiBuilder.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true); 6254e78706f439d318ae7a78927d98f734351a89f64Dan Sandler 62691fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler Intent runningIntent = new Intent( 62791fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 62891fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler runningIntent.setData(Uri.fromParts("package", 62991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler appInfo.packageName, null)); 630279544c35ae50c2e06b1d5559ff31e86a93e5a21luozhanwei PendingIntent pi = PendingIntent.getActivityAsUser(ams.mContext, 0, 631279544c35ae50c2e06b1d5559ff31e86a93e5a21luozhanwei runningIntent, PendingIntent.FLAG_UPDATE_CURRENT, null, 632279544c35ae50c2e06b1d5559ff31e86a93e5a21luozhanwei UserHandle.of(userId)); 633d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler notiBuilder.setColor(ams.mContext.getColor( 634255dd04271088590fedc46c8e22b2fd4ab142d39Selim Cinek com.android.internal 635d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler .R.color.system_notification_accent_color)); 636d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler notiBuilder.setContentTitle( 63791fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ams.mContext.getString( 63891fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler com.android.internal.R.string 63991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler .app_running_notification_title, 640d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler appName)); 641d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler notiBuilder.setContentText( 64291fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler ams.mContext.getString( 64391fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler com.android.internal.R.string 64491fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler .app_running_notification_text, 645d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler appName)); 646d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler notiBuilder.setContentIntent(pi); 647d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler 648d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler localForegroundNoti = notiBuilder.build(); 64991fe8455d66ef4ac000ba3ba0fb043dd1fbaee49Daniel Sandler } catch (PackageManager.NameNotFoundException e) { 6502ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 6512ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 6525a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds if (nm.getNotificationChannel(localPackageName, appUid, 653f3de8aa2cd72a4acd24d26ca0f807fd9d3b528ebJulia Reynolds localForegroundNoti.getChannelId()) == null) { 6545a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds int targetSdkVersion = Build.VERSION_CODES.O_MR1; 6555a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds try { 6565a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds final ApplicationInfo applicationInfo = 6575a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds ams.mContext.getPackageManager().getApplicationInfoAsUser( 6585a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds appInfo.packageName, 0, userId); 6595a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds targetSdkVersion = applicationInfo.targetSdkVersion; 6605a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds } catch (PackageManager.NameNotFoundException e) { 6615a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds } 6625a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds if (targetSdkVersion >= Build.VERSION_CODES.O_MR1) { 6635a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds throw new RuntimeException( 6645a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds "invalid channel for service notification: " 6655a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds + foregroundNoti); 6665a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds } 6675a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds } 6685a4399a34cd73d80041348463fd6e9d5954f77efJulia Reynolds if (localForegroundNoti.getSmallIcon() == null) { 669282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // Notifications whose icon is 0 are defined to not show 670282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // a notification, silently ignoring it. We don't want to 671282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // just ignore it, we want to prevent the service from 672282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // being foreground. 673d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler throw new RuntimeException("invalid service notification: " 674d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler + foregroundNoti); 675282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn } 676182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski nm.enqueueNotification(localPackageName, localPackageName, 677f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn appUid, appPid, null, localForegroundId, localForegroundNoti, 678fea6f7b799225f6f0211d7114c779183adbf7b6bJulia Reynolds userId); 6794e78706f439d318ae7a78927d98f734351a89f64Dan Sandler 6804e78706f439d318ae7a78927d98f734351a89f64Dan Sandler foregroundNoti = localForegroundNoti; // save it for amending next time 68134fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 682e23149f1555303940d212b742707518b7f9f84abWale Ogunwale Slog.w(TAG, "Error showing notification for service", e); 6839e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // If it gave us a garbage notification, it doesn't 6849e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // get to be foreground. 6859e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn ams.setServiceForeground(name, ServiceRecord.this, 68667324c990c4fbad238119a4667341d5618b2bea2Dianne Hackborn 0, null, 0); 6878aa8fe128992f7e47ecbc8588027eaec82012f3aChristopher Tate ams.crashApplication(appUid, appPid, localPackageName, -1, 688eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato "Bad notification for startForeground: " + e); 689b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 690d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 691b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 692d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 693d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 694af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 695d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void cancelNotification() { 6960ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn // Do asynchronous communication with notification manager to 6970ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn // avoid deadlocks. 6980ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn final String localPackageName = packageName; 6990ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn final int localForegroundId = foregroundId; 7000ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn ams.mHandler.post(new Runnable() { 7010ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn public void run() { 7020ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn INotificationManager inm = NotificationManager.getService(); 7030ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn if (inm == null) { 7040ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn return; 705d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 7060ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn try { 7070ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn inm.cancelNotificationWithTag(localPackageName, null, 7080ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn localForegroundId, userId); 7090ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn } catch (RuntimeException e) { 7100ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn Slog.w(TAG, "Error canceling notification for service", e); 7110ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn } catch (RemoteException e) { 7120ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn } 7130ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn } 7140ba4c710c6f8805175bde2dbd85d7d8788a15ee0Dianne Hackborn }); 715d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 716365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer 717365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer public void stripForegroundServiceFlagFromNotification() { 718365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer if (foregroundId == 0) { 719365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer return; 720365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 721365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer 722365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer final int localForegroundId = foregroundId; 723365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer final int localUserId = userId; 724365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer final String localPackageName = packageName; 725365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer 726365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer // Do asynchronous communication with notification manager to 727365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer // avoid deadlocks. 728365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer ams.mHandler.post(new Runnable() { 729365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer @Override 730365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer public void run() { 731365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer NotificationManagerInternal nmi = LocalServices.getService( 732365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer NotificationManagerInternal.class); 733365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer if (nmi == null) { 734365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer return; 735365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 736365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer nmi.removeForegroundServiceFlagFromNotification(localPackageName, localForegroundId, 737365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer localUserId); 738365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 739365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer }); 740365e4c38d58d38bb61d1fdd870346f2f594825fdChristoph Studer } 741af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch 74239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public void clearDeliveredStartsLocked() { 74339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=deliveredStarts.size()-1; i>=0; i--) { 74439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.get(i).removeUriPermissionsLocked(); 74539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 74639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.clear(); 74739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 74839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 750f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 751f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 752f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 753f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 7541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("ServiceRecord{") 7551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 756b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn .append(" u").append(userId) 7571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(' ').append(shortName).append('}'); 758f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7600b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki 7610b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki public ComponentName getComponentName() { 7620b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki return name; 7630b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 765