Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2020 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package com.android.car.watchdog; |
| 18 | |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 19 | import static android.car.user.CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING; |
| 20 | import static android.car.user.CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STOPPED; |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 21 | |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 22 | import static com.android.car.CarLog.TAG_WATCHDOG; |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 23 | |
| 24 | import android.annotation.NonNull; |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 25 | import android.automotive.watchdog.internal.GarageMode; |
Lakshman Annadorai | d26098a | 2020-11-10 14:05:04 -0800 | [diff] [blame] | 26 | import android.automotive.watchdog.internal.ICarWatchdogServiceForSystem; |
Lakshman Annadorai | 8dfeeaf | 2020-12-15 14:10:53 -0800 | [diff] [blame] | 27 | import android.automotive.watchdog.internal.PackageInfo; |
Lakshman Annadorai | dd4a4e4 | 2021-02-19 14:22:06 -0800 | [diff] [blame] | 28 | import android.automotive.watchdog.internal.PackageIoOveruseStats; |
Lakshman Annadorai | 967b21e | 2020-10-30 09:35:29 -0700 | [diff] [blame] | 29 | import android.automotive.watchdog.internal.PowerCycle; |
| 30 | import android.automotive.watchdog.internal.StateType; |
Lakshman Annadorai | 03cbd1f | 2021-10-08 18:39:10 +0000 | [diff] [blame] | 31 | import android.automotive.watchdog.internal.UserPackageIoUsageStats; |
Lakshman Annadorai | 967b21e | 2020-10-30 09:35:29 -0700 | [diff] [blame] | 32 | import android.automotive.watchdog.internal.UserState; |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 33 | import android.car.Car; |
Eric Jeong | 27a178f | 2020-03-24 16:39:39 -0700 | [diff] [blame] | 34 | import android.car.hardware.power.CarPowerManager.CarPowerStateListener; |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 35 | import android.car.hardware.power.CarPowerPolicy; |
| 36 | import android.car.hardware.power.CarPowerPolicyFilter; |
| 37 | import android.car.hardware.power.ICarPowerPolicyListener; |
Eric Jeong | 27a178f | 2020-03-24 16:39:39 -0700 | [diff] [blame] | 38 | import android.car.hardware.power.ICarPowerStateListener; |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 39 | import android.car.hardware.power.PowerComponent; |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 40 | import android.car.watchdog.CarWatchdogManager; |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 41 | import android.car.watchdog.ICarWatchdogService; |
Eric Jeong | 4e111e9 | 2020-06-23 19:50:55 -0700 | [diff] [blame] | 42 | import android.car.watchdog.ICarWatchdogServiceCallback; |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 43 | import android.car.watchdog.IResourceOveruseListener; |
| 44 | import android.car.watchdog.PackageKillableState; |
| 45 | import android.car.watchdog.ResourceOveruseConfiguration; |
| 46 | import android.car.watchdog.ResourceOveruseStats; |
Eric Jeong | 6df075f | 2020-03-11 16:12:23 -0700 | [diff] [blame] | 47 | import android.car.watchdoglib.CarWatchdogDaemonHelper; |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 48 | import android.content.BroadcastReceiver; |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 49 | import android.content.Context; |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 50 | import android.content.Intent; |
| 51 | import android.content.IntentFilter; |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 52 | import android.content.pm.UserInfo; |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 53 | import android.os.RemoteException; |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 54 | import android.os.UserHandle; |
| 55 | import android.os.UserManager; |
Lakshman Annadorai | ec4d08a | 2021-04-30 08:29:10 -0700 | [diff] [blame] | 56 | import android.util.ArraySet; |
Felipe Leme | 176a5fd | 2021-01-20 15:48:33 -0800 | [diff] [blame] | 57 | import android.util.IndentingPrintWriter; |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 58 | |
Eric Jeong | 27a178f | 2020-03-24 16:39:39 -0700 | [diff] [blame] | 59 | import com.android.car.CarLocalServices; |
Mayank Garg | 72c71d2 | 2021-02-03 23:54:45 -0800 | [diff] [blame] | 60 | import com.android.car.CarLog; |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 61 | import com.android.car.CarServiceBase; |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 62 | import com.android.car.CarServiceUtils; |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 63 | import com.android.car.ICarImpl; |
Eric Jeong | bc351e2 | 2020-07-31 13:54:17 -0700 | [diff] [blame] | 64 | import com.android.car.power.CarPowerManagementService; |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 65 | import com.android.car.user.CarUserService; |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 66 | import com.android.internal.annotations.GuardedBy; |
Eric Jeong | 0ee7281 | 2020-04-21 15:23:54 -0700 | [diff] [blame] | 67 | import com.android.internal.annotations.VisibleForTesting; |
Lakshman Annadorai | e17cba7 | 2020-12-17 14:03:36 -0800 | [diff] [blame] | 68 | import com.android.internal.util.ArrayUtils; |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 69 | import com.android.server.utils.Slogf; |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 70 | |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 71 | import java.lang.ref.WeakReference; |
Lakshman Annadorai | 282c3ce | 2021-08-17 09:08:27 -0700 | [diff] [blame] | 72 | import java.time.Instant; |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 73 | import java.util.List; |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 74 | |
| 75 | /** |
| 76 | * Service to implement CarWatchdogManager API. |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 77 | */ |
| 78 | public final class CarWatchdogService extends ICarWatchdogService.Stub implements CarServiceBase { |
Lakshman Annadorai | d7b8a03 | 2021-04-20 12:31:05 -0700 | [diff] [blame] | 79 | static final boolean DEBUG = false; // STOPSHIP if true |
| 80 | static final String TAG = CarLog.tagFor(CarWatchdogService.class); |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 81 | static final String ACTION_GARAGE_MODE_ON = |
| 82 | "com.android.server.jobscheduler.GARAGE_MODE_ON"; |
| 83 | static final String ACTION_GARAGE_MODE_OFF = |
| 84 | "com.android.server.jobscheduler.GARAGE_MODE_OFF"; |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 85 | static final int MISSING_ARG_VALUE = -1; |
Lakshman Annadorai | 282c3ce | 2021-08-17 09:08:27 -0700 | [diff] [blame] | 86 | static final TimeSourceInterface SYSTEM_INSTANCE = new TimeSourceInterface() { |
| 87 | @Override |
| 88 | public Instant now() { |
| 89 | return Instant.now(); |
| 90 | } |
| 91 | |
| 92 | @Override |
| 93 | public String toString() { |
| 94 | return "System time instance"; |
| 95 | } |
| 96 | }; |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 97 | |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 98 | private final Context mContext; |
Lakshman Annadorai | d26098a | 2020-11-10 14:05:04 -0800 | [diff] [blame] | 99 | private final ICarWatchdogServiceForSystemImpl mWatchdogServiceForSystem; |
Lakshman Annadorai | 5f1181b | 2021-04-01 16:03:07 -0700 | [diff] [blame] | 100 | private final PackageInfoHandler mPackageInfoHandler; |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 101 | private final WatchdogStorage mWatchdogStorage; |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 102 | private final WatchdogProcessHandler mWatchdogProcessHandler; |
| 103 | private final WatchdogPerfHandler mWatchdogPerfHandler; |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 104 | private final CarWatchdogDaemonHelper mCarWatchdogDaemonHelper; |
Lakshman Annadorai | 8ee56ec | 2021-04-27 11:51:08 -0700 | [diff] [blame] | 105 | private final CarWatchdogDaemonHelper.OnConnectionChangeListener mConnectionListener; |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 106 | /* |
| 107 | * TODO(b/192481350): Listen for GarageMode change notification rather than depending on the |
| 108 | * system_server broadcast when the CarService internal API for listening GarageMode change is |
| 109 | * implemented. |
| 110 | */ |
| 111 | private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { |
| 112 | @Override |
| 113 | public void onReceive(Context context, Intent intent) { |
| 114 | final String action = intent.getAction(); |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 115 | switch (action) { |
| 116 | case ACTION_GARAGE_MODE_ON: |
| 117 | case ACTION_GARAGE_MODE_OFF: |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 118 | int garageMode; |
| 119 | synchronized (mLock) { |
| 120 | garageMode = mCurrentGarageMode = action.equals(ACTION_GARAGE_MODE_ON) |
| 121 | ? GarageMode.GARAGE_MODE_ON : GarageMode.GARAGE_MODE_OFF; |
| 122 | } |
Lakshman Annadorai | 678feda | 2021-10-25 16:23:46 -0700 | [diff] [blame] | 123 | mWatchdogPerfHandler.onGarageModeChange(garageMode); |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 124 | if (garageMode == GarageMode.GARAGE_MODE_ON) { |
| 125 | mWatchdogStorage.shrinkDatabase(); |
| 126 | } |
| 127 | notifyGarageModeChange(garageMode); |
| 128 | return; |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 129 | case Intent.ACTION_USER_REMOVED: |
| 130 | UserHandle user = intent.getParcelableExtra(Intent.EXTRA_USER); |
| 131 | mWatchdogPerfHandler.deleteUser(user.getIdentifier()); |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 132 | return; |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 133 | } |
| 134 | } |
| 135 | }; |
| 136 | |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 137 | private final ICarPowerStateListener mCarPowerStateListener = |
| 138 | new ICarPowerStateListener.Stub() { |
| 139 | @Override |
| 140 | public void onStateChanged(int state) { |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 141 | CarPowerManagementService powerService = |
| 142 | CarLocalServices.getService(CarPowerManagementService.class); |
| 143 | if (powerService == null) { |
| 144 | return; |
| 145 | } |
| 146 | int powerCycle = carPowerStateToPowerCycle(powerService.getPowerState()); |
| 147 | switch (powerCycle) { |
| 148 | case PowerCycle.POWER_CYCLE_SHUTDOWN_ENTER: |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 149 | mWatchdogPerfHandler.writeToDatabase(); |
| 150 | break; |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 151 | // ON covers resume. |
| 152 | case PowerCycle.POWER_CYCLE_RESUME: |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 153 | // There might be outdated & incorrect info. We should reset them before |
| 154 | // starting to do health check. |
| 155 | mWatchdogProcessHandler.prepareHealthCheck(); |
| 156 | break; |
| 157 | default: |
| 158 | return; |
| 159 | } |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 160 | notifyPowerCycleChange(powerCycle); |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 161 | } |
| 162 | }; |
| 163 | |
| 164 | private final ICarPowerPolicyListener mCarDisplayPowerPolicyListener = |
| 165 | new ICarPowerPolicyListener.Stub() { |
| 166 | @Override |
| 167 | public void onPolicyChanged(CarPowerPolicy appliedPolicy, |
| 168 | CarPowerPolicy accumulatedPolicy) { |
Lakshman Annadorai | 0441613 | 2021-10-18 16:35:34 +0000 | [diff] [blame] | 169 | boolean isDisplayEnabled = |
| 170 | appliedPolicy.isComponentEnabled(PowerComponent.DISPLAY); |
| 171 | boolean didStateChange = false; |
| 172 | synchronized (mLock) { |
| 173 | didStateChange = mIsDisplayEnabled != isDisplayEnabled; |
| 174 | mIsDisplayEnabled = isDisplayEnabled; |
| 175 | } |
| 176 | if (didStateChange) { |
| 177 | mWatchdogPerfHandler.onDisplayStateChanged(isDisplayEnabled); |
| 178 | } |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 179 | } |
| 180 | }; |
| 181 | |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 182 | private final Object mLock = new Object(); |
| 183 | @GuardedBy("mLock") |
| 184 | private boolean mReadyToRespond; |
| 185 | @GuardedBy("mLock") |
| 186 | private boolean mIsConnected; |
Lakshman Annadorai | 0441613 | 2021-10-18 16:35:34 +0000 | [diff] [blame] | 187 | @GuardedBy("mLock") |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 188 | private @GarageMode int mCurrentGarageMode; |
| 189 | @GuardedBy("mLock") |
Lakshman Annadorai | 0441613 | 2021-10-18 16:35:34 +0000 | [diff] [blame] | 190 | private boolean mIsDisplayEnabled; |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 191 | |
Eric Jeong | 0ee7281 | 2020-04-21 15:23:54 -0700 | [diff] [blame] | 192 | public CarWatchdogService(Context context) { |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 193 | this(context, new WatchdogStorage(context)); |
| 194 | } |
| 195 | |
| 196 | @VisibleForTesting |
| 197 | CarWatchdogService(Context context, WatchdogStorage watchdogStorage) { |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 198 | mContext = context; |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 199 | mWatchdogStorage = watchdogStorage; |
Lakshman Annadorai | 5f1181b | 2021-04-01 16:03:07 -0700 | [diff] [blame] | 200 | mPackageInfoHandler = new PackageInfoHandler(mContext.getPackageManager()); |
Eric Jeong | 0ee7281 | 2020-04-21 15:23:54 -0700 | [diff] [blame] | 201 | mCarWatchdogDaemonHelper = new CarWatchdogDaemonHelper(TAG_WATCHDOG); |
Lakshman Annadorai | d26098a | 2020-11-10 14:05:04 -0800 | [diff] [blame] | 202 | mWatchdogServiceForSystem = new ICarWatchdogServiceForSystemImpl(this); |
Lakshman Annadorai | cf5f3a9 | 2021-04-02 15:26:16 -0700 | [diff] [blame] | 203 | mWatchdogProcessHandler = new WatchdogProcessHandler(mWatchdogServiceForSystem, |
Lakshman Annadorai | d7b8a03 | 2021-04-20 12:31:05 -0700 | [diff] [blame] | 204 | mCarWatchdogDaemonHelper); |
Lakshman Annadorai | cf5f3a9 | 2021-04-02 15:26:16 -0700 | [diff] [blame] | 205 | mWatchdogPerfHandler = new WatchdogPerfHandler(mContext, mCarWatchdogDaemonHelper, |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 206 | mPackageInfoHandler, mWatchdogStorage); |
Lakshman Annadorai | 8ee56ec | 2021-04-27 11:51:08 -0700 | [diff] [blame] | 207 | mConnectionListener = (isConnected) -> { |
Lakshman Annadorai | 8ee56ec | 2021-04-27 11:51:08 -0700 | [diff] [blame] | 208 | mWatchdogPerfHandler.onDaemonConnectionChange(isConnected); |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 209 | synchronized (mLock) { |
| 210 | mIsConnected = isConnected; |
| 211 | } |
| 212 | registerToDaemon(); |
Lakshman Annadorai | 8ee56ec | 2021-04-27 11:51:08 -0700 | [diff] [blame] | 213 | }; |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 214 | mCurrentGarageMode = GarageMode.GARAGE_MODE_OFF; |
Lakshman Annadorai | 0441613 | 2021-10-18 16:35:34 +0000 | [diff] [blame] | 215 | mIsDisplayEnabled = true; |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 216 | } |
| 217 | |
| 218 | @Override |
| 219 | public void init() { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 220 | mWatchdogProcessHandler.init(); |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 221 | mWatchdogPerfHandler.init(); |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 222 | subscribePowerManagementService(); |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 223 | subscribeUserStateChange(); |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 224 | subscribeBroadcastReceiver(); |
Eric Jeong | 6df075f | 2020-03-11 16:12:23 -0700 | [diff] [blame] | 225 | mCarWatchdogDaemonHelper.addOnConnectionChangeListener(mConnectionListener); |
| 226 | mCarWatchdogDaemonHelper.connect(); |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 227 | // To make sure the main handler is ready for responding to car watchdog daemon, registering |
| 228 | // to the daemon is done through the main handler. Once the registration is completed, we |
| 229 | // can assume that the main handler is not too busy handling other stuffs. |
| 230 | postRegisterToDaemonMessage(); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 231 | if (DEBUG) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 232 | Slogf.d(TAG, "CarWatchdogService is initialized"); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 233 | } |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 234 | } |
| 235 | |
| 236 | @Override |
| 237 | public void release() { |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 238 | mContext.unregisterReceiver(mBroadcastReceiver); |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 239 | unsubscribePowerManagementService(); |
| 240 | mWatchdogPerfHandler.release(); |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 241 | mWatchdogStorage.release(); |
Eric Jeong | 6df075f | 2020-03-11 16:12:23 -0700 | [diff] [blame] | 242 | unregisterFromDaemon(); |
| 243 | mCarWatchdogDaemonHelper.disconnect(); |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 244 | } |
| 245 | |
| 246 | @Override |
Felipe Leme | 176a5fd | 2021-01-20 15:48:33 -0800 | [diff] [blame] | 247 | public void dump(IndentingPrintWriter writer) { |
Lakshman Annadorai | 593672d | 2021-10-21 17:00:43 -0700 | [diff] [blame] | 248 | writer.println("*" + getClass().getSimpleName() + "*"); |
| 249 | writer.increaseIndent(); |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 250 | synchronized (mLock) { |
| 251 | writer.println("Current garage mode: " + toGarageModeString(mCurrentGarageMode)); |
| 252 | } |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 253 | mWatchdogProcessHandler.dump(writer); |
| 254 | mWatchdogPerfHandler.dump(writer); |
Lakshman Annadorai | 593672d | 2021-10-21 17:00:43 -0700 | [diff] [blame] | 255 | writer.decreaseIndent(); |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 256 | } |
| 257 | |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 258 | /** |
Eric Jeong | 4e111e9 | 2020-06-23 19:50:55 -0700 | [diff] [blame] | 259 | * Registers {@link android.car.watchdog.ICarWatchdogServiceCallback} to |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 260 | * {@link CarWatchdogService}. |
| 261 | */ |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 262 | @Override |
Eric Jeong | 4e111e9 | 2020-06-23 19:50:55 -0700 | [diff] [blame] | 263 | public void registerClient(ICarWatchdogServiceCallback client, int timeout) { |
Jahdiel Alvarez | 4537c08 | 2021-05-25 21:34:20 +0000 | [diff] [blame] | 264 | ICarImpl.assertPermission(mContext, Car.PERMISSION_USE_CAR_WATCHDOG); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 265 | mWatchdogProcessHandler.registerClient(client, timeout); |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 266 | } |
| 267 | |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 268 | /** |
Eric Jeong | 4e111e9 | 2020-06-23 19:50:55 -0700 | [diff] [blame] | 269 | * Unregisters {@link android.car.watchdog.ICarWatchdogServiceCallback} from |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 270 | * {@link CarWatchdogService}. |
| 271 | */ |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 272 | @Override |
Eric Jeong | 4e111e9 | 2020-06-23 19:50:55 -0700 | [diff] [blame] | 273 | public void unregisterClient(ICarWatchdogServiceCallback client) { |
Jahdiel Alvarez | 4537c08 | 2021-05-25 21:34:20 +0000 | [diff] [blame] | 274 | ICarImpl.assertPermission(mContext, Car.PERMISSION_USE_CAR_WATCHDOG); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 275 | mWatchdogProcessHandler.unregisterClient(client); |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 276 | } |
| 277 | |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 278 | /** |
| 279 | * Tells {@link CarWatchdogService} that the client is alive. |
| 280 | */ |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 281 | @Override |
Eric Jeong | 4e111e9 | 2020-06-23 19:50:55 -0700 | [diff] [blame] | 282 | public void tellClientAlive(ICarWatchdogServiceCallback client, int sessionId) { |
Jahdiel Alvarez | 4537c08 | 2021-05-25 21:34:20 +0000 | [diff] [blame] | 283 | ICarImpl.assertPermission(mContext, Car.PERMISSION_USE_CAR_WATCHDOG); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 284 | mWatchdogProcessHandler.tellClientAlive(client, sessionId); |
| 285 | } |
| 286 | |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 287 | /** Returns {@link android.car.watchdog.ResourceOveruseStats} for the calling package. */ |
| 288 | @Override |
| 289 | @NonNull |
| 290 | public ResourceOveruseStats getResourceOveruseStats( |
| 291 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag, |
| 292 | @CarWatchdogManager.StatsPeriod int maxStatsPeriod) { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 293 | return mWatchdogPerfHandler.getResourceOveruseStats(resourceOveruseFlag, maxStatsPeriod); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 294 | } |
| 295 | |
| 296 | /** |
| 297 | * Returns {@link android.car.watchdog.ResourceOveruseStats} for all packages for the maximum |
| 298 | * specified period, and the specified resource types with stats greater than or equal to the |
| 299 | * minimum specified stats. |
| 300 | */ |
| 301 | @Override |
| 302 | @NonNull |
| 303 | public List<ResourceOveruseStats> getAllResourceOveruseStats( |
| 304 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag, |
| 305 | @CarWatchdogManager.MinimumStatsFlag int minimumStatsFlag, |
| 306 | @CarWatchdogManager.StatsPeriod int maxStatsPeriod) { |
| 307 | ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 308 | return mWatchdogPerfHandler.getAllResourceOveruseStats(resourceOveruseFlag, |
| 309 | minimumStatsFlag, maxStatsPeriod); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 310 | } |
| 311 | |
| 312 | /** Returns {@link android.car.watchdog.ResourceOveruseStats} for the specified user package. */ |
| 313 | @Override |
| 314 | @NonNull |
| 315 | public ResourceOveruseStats getResourceOveruseStatsForUserPackage( |
| 316 | @NonNull String packageName, @NonNull UserHandle userHandle, |
| 317 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag, |
| 318 | @CarWatchdogManager.StatsPeriod int maxStatsPeriod) { |
| 319 | ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 320 | return mWatchdogPerfHandler.getResourceOveruseStatsForUserPackage(packageName, userHandle, |
| 321 | resourceOveruseFlag, maxStatsPeriod); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 322 | } |
| 323 | |
| 324 | /** |
| 325 | * Adds {@link android.car.watchdog.IResourceOveruseListener} for the calling package's resource |
| 326 | * overuse notifications. |
| 327 | */ |
| 328 | @Override |
| 329 | public void addResourceOveruseListener( |
| 330 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag, |
| 331 | @NonNull IResourceOveruseListener listener) { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 332 | mWatchdogPerfHandler.addResourceOveruseListener(resourceOveruseFlag, listener); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 333 | } |
| 334 | |
| 335 | /** |
| 336 | * Removes the previously added {@link android.car.watchdog.IResourceOveruseListener} for the |
| 337 | * calling package's resource overuse notifications. |
| 338 | */ |
| 339 | @Override |
| 340 | public void removeResourceOveruseListener(@NonNull IResourceOveruseListener listener) { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 341 | mWatchdogPerfHandler.removeResourceOveruseListener(listener); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 342 | } |
| 343 | |
| 344 | /** |
| 345 | * Adds {@link android.car.watchdog.IResourceOveruseListener} for all packages' resource overuse |
| 346 | * notifications. |
| 347 | */ |
| 348 | @Override |
| 349 | public void addResourceOveruseListenerForSystem( |
| 350 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag, |
| 351 | @NonNull IResourceOveruseListener listener) { |
| 352 | ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 353 | mWatchdogPerfHandler.addResourceOveruseListenerForSystem(resourceOveruseFlag, listener); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 354 | } |
| 355 | |
| 356 | /** |
| 357 | * Removes the previously added {@link android.car.watchdog.IResourceOveruseListener} for all |
| 358 | * packages' resource overuse notifications. |
| 359 | */ |
| 360 | @Override |
| 361 | public void removeResourceOveruseListenerForSystem(@NonNull IResourceOveruseListener listener) { |
| 362 | ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 363 | mWatchdogPerfHandler.removeResourceOveruseListenerForSystem(listener); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 364 | } |
| 365 | |
| 366 | /** Sets whether or not a user package is killable on resource overuse. */ |
| 367 | @Override |
| 368 | public void setKillablePackageAsUser(String packageName, UserHandle userHandle, |
| 369 | boolean isKillable) { |
| 370 | ICarImpl.assertPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 371 | mWatchdogPerfHandler.setKillablePackageAsUser(packageName, userHandle, isKillable); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 372 | } |
| 373 | |
| 374 | /** |
| 375 | * Returns all {@link android.car.watchdog.PackageKillableState} on resource overuse for |
| 376 | * the specified user. |
| 377 | */ |
| 378 | @Override |
| 379 | @NonNull |
| 380 | public List<PackageKillableState> getPackageKillableStatesAsUser(UserHandle userHandle) { |
| 381 | ICarImpl.assertPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 382 | return mWatchdogPerfHandler.getPackageKillableStatesAsUser(userHandle); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 383 | } |
| 384 | |
| 385 | /** |
| 386 | * Sets {@link android.car.watchdog.ResourceOveruseConfiguration} for the specified resources. |
| 387 | */ |
| 388 | @Override |
Lakshman Annadorai | 8ee56ec | 2021-04-27 11:51:08 -0700 | [diff] [blame] | 389 | @CarWatchdogManager.ReturnCode |
| 390 | public int setResourceOveruseConfigurations( |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 391 | List<ResourceOveruseConfiguration> configurations, |
Lakshman Annadorai | 94323ff | 2021-04-29 12:14:34 -0700 | [diff] [blame] | 392 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag) |
| 393 | throws RemoteException { |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 394 | ICarImpl.assertPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG); |
Lakshman Annadorai | 8ee56ec | 2021-04-27 11:51:08 -0700 | [diff] [blame] | 395 | return mWatchdogPerfHandler.setResourceOveruseConfigurations(configurations, |
| 396 | resourceOveruseFlag); |
Lakshman Annadorai | ec1944b | 2021-03-03 16:18:34 -0800 | [diff] [blame] | 397 | } |
| 398 | |
| 399 | /** Returns the available {@link android.car.watchdog.ResourceOveruseConfiguration}. */ |
| 400 | @Override |
| 401 | @NonNull |
| 402 | public List<ResourceOveruseConfiguration> getResourceOveruseConfigurations( |
| 403 | @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag) { |
| 404 | ICarImpl.assertAnyPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG, |
| 405 | Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 406 | return mWatchdogPerfHandler.getResourceOveruseConfigurations(resourceOveruseFlag); |
Eric Jeong | 0ee7281 | 2020-04-21 15:23:54 -0700 | [diff] [blame] | 407 | } |
| 408 | |
Jahdiel Alvarez | c29893b | 2021-07-12 21:31:01 +0000 | [diff] [blame] | 409 | /** |
| 410 | * Enables/disables the watchdog daemon client health check process. |
| 411 | */ |
| 412 | public void controlProcessHealthCheck(boolean disable) { |
| 413 | ICarImpl.assertPermission(mContext, Car.PERMISSION_USE_CAR_WATCHDOG); |
| 414 | mWatchdogProcessHandler.controlProcessHealthCheck(disable); |
| 415 | } |
| 416 | |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 417 | @VisibleForTesting |
| 418 | int getClientCount(int timeout) { |
| 419 | return mWatchdogProcessHandler.getClientCount(timeout); |
| 420 | } |
| 421 | |
| 422 | @VisibleForTesting |
| 423 | void setTimeSource(TimeSourceInterface timeSource) { |
| 424 | mWatchdogPerfHandler.setTimeSource(timeSource); |
| 425 | } |
| 426 | |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 427 | @VisibleForTesting |
| 428 | void setOveruseHandlingDelay(long millis) { |
| 429 | mWatchdogPerfHandler.setOveruseHandlingDelay(millis); |
| 430 | } |
| 431 | |
| 432 | @VisibleForTesting |
| 433 | void setRecurringOveruseThreshold(int threshold) { |
| 434 | mWatchdogPerfHandler.setRecurringOveruseThreshold(threshold); |
| 435 | } |
| 436 | |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 437 | private void notifyAllUserStates() { |
| 438 | UserManager userManager = UserManager.get(mContext); |
| 439 | List<UserInfo> users = userManager.getUsers(); |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 440 | try { |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 441 | // TODO(b/152780162): reduce the number of RPC calls(isUserRunning). |
| 442 | for (int i = 0; i < users.size(); ++i) { |
| 443 | UserInfo info = users.get(i); |
| 444 | int userState = userManager.isUserRunning(info.id) |
| 445 | ? UserState.USER_STATE_STARTED |
| 446 | : UserState.USER_STATE_STOPPED; |
| 447 | mCarWatchdogDaemonHelper.notifySystemStateChange(StateType.USER_STATE, info.id, |
| 448 | userState); |
| 449 | mWatchdogProcessHandler.updateUserState(info.id, |
| 450 | userState == UserState.USER_STATE_STOPPED); |
| 451 | } |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 452 | if (DEBUG) { |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 453 | Slogf.d(TAG, "Notified car watchdog daemon of user states"); |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 454 | } |
| 455 | } catch (RemoteException | RuntimeException e) { |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 456 | Slogf.w(TAG, "Notifying latest user states failed: %s", e); |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 457 | } |
| 458 | } |
| 459 | |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 460 | private void notifyPowerCycleChange(@PowerCycle int powerCycle) { |
| 461 | if (powerCycle == PowerCycle.NUM_POWER_CYLES) { |
| 462 | Slogf.e(TAG, "Skipping notifying invalid power cycle (%d)", powerCycle); |
| 463 | return; |
| 464 | } |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 465 | try { |
| 466 | mCarWatchdogDaemonHelper.notifySystemStateChange( |
| 467 | StateType.POWER_CYCLE, powerCycle, MISSING_ARG_VALUE); |
| 468 | if (DEBUG) { |
| 469 | Slogf.d(TAG, "Notified car watchdog daemon of power cycle(%d)", powerCycle); |
| 470 | } |
| 471 | } catch (RemoteException | RuntimeException e) { |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 472 | Slogf.w(TAG, e, "Notifying power cycle change to %d failed", powerCycle); |
| 473 | } |
| 474 | } |
| 475 | |
| 476 | private void notifyGarageModeChange(@GarageMode int garageMode) { |
| 477 | try { |
| 478 | mCarWatchdogDaemonHelper.notifySystemStateChange( |
| 479 | StateType.GARAGE_MODE, garageMode, MISSING_ARG_VALUE); |
| 480 | if (DEBUG) { |
| 481 | Slogf.d(TAG, "Notified car watchdog daemon of garage mode(%d)", garageMode); |
| 482 | } |
| 483 | } catch (RemoteException | RuntimeException e) { |
| 484 | Slogf.w(TAG, e, "Notifying garage mode change to %d failed", garageMode); |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 485 | } |
| 486 | } |
| 487 | |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 488 | private void postRegisterToDaemonMessage() { |
| 489 | CarServiceUtils.runOnMain(() -> { |
| 490 | synchronized (mLock) { |
| 491 | mReadyToRespond = true; |
| 492 | } |
| 493 | registerToDaemon(); |
| 494 | }); |
| 495 | } |
| 496 | |
Eric Jeong | 6df075f | 2020-03-11 16:12:23 -0700 | [diff] [blame] | 497 | private void registerToDaemon() { |
Eric Jeong | 7e48170 | 2021-05-14 11:14:06 -0700 | [diff] [blame] | 498 | synchronized (mLock) { |
| 499 | if (!mIsConnected || !mReadyToRespond) { |
| 500 | return; |
| 501 | } |
| 502 | } |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 503 | try { |
Lakshman Annadorai | d26098a | 2020-11-10 14:05:04 -0800 | [diff] [blame] | 504 | mCarWatchdogDaemonHelper.registerCarWatchdogService(mWatchdogServiceForSystem); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 505 | if (DEBUG) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 506 | Slogf.d(TAG, "CarWatchdogService registers to car watchdog daemon"); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 507 | } |
Eric Jeong | 4825ca3 | 2020-04-13 18:07:44 -0700 | [diff] [blame] | 508 | } catch (RemoteException | RuntimeException e) { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 509 | Slogf.w(TAG, "Cannot register to car watchdog daemon: %s", e); |
Eric Jeong | 6df075f | 2020-03-11 16:12:23 -0700 | [diff] [blame] | 510 | } |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 511 | notifyAllUserStates(); |
| 512 | CarPowerManagementService powerService = |
| 513 | CarLocalServices.getService(CarPowerManagementService.class); |
| 514 | if (powerService != null) { |
| 515 | int powerState = powerService.getPowerState(); |
| 516 | int powerCycle = carPowerStateToPowerCycle(powerState); |
| 517 | if (powerCycle != PowerCycle.NUM_POWER_CYLES) { |
| 518 | notifyPowerCycleChange(powerCycle); |
| 519 | } else { |
| 520 | Slogf.i(TAG, "Skipping notifying %d power state", powerState); |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 521 | } |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 522 | } |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 523 | int garageMode; |
| 524 | synchronized (mLock) { |
| 525 | // To avoid race condition, fetch {@link mCurrentGarageMode} just before |
| 526 | // the {@link notifyGarageModeChange} call. For instance, if {@code mCurrentGarageMode} |
| 527 | // changes before the above {@link notifyPowerCycleChange} call returns, |
| 528 | // the {@link garageMode}'s value will be out of date. |
| 529 | garageMode = mCurrentGarageMode; |
| 530 | } |
| 531 | notifyGarageModeChange(garageMode); |
Eric Jeong | 6df075f | 2020-03-11 16:12:23 -0700 | [diff] [blame] | 532 | } |
| 533 | |
| 534 | private void unregisterFromDaemon() { |
| 535 | try { |
Lakshman Annadorai | d26098a | 2020-11-10 14:05:04 -0800 | [diff] [blame] | 536 | mCarWatchdogDaemonHelper.unregisterCarWatchdogService(mWatchdogServiceForSystem); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 537 | if (DEBUG) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 538 | Slogf.d(TAG, "CarWatchdogService unregisters from car watchdog daemon"); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 539 | } |
Eric Jeong | 4825ca3 | 2020-04-13 18:07:44 -0700 | [diff] [blame] | 540 | } catch (RemoteException | RuntimeException e) { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 541 | Slogf.w(TAG, "Cannot unregister from car watchdog daemon: %s", e); |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 542 | } |
| 543 | } |
| 544 | |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 545 | private void subscribePowerManagementService() { |
Eric Jeong | 27a178f | 2020-03-24 16:39:39 -0700 | [diff] [blame] | 546 | CarPowerManagementService powerService = |
| 547 | CarLocalServices.getService(CarPowerManagementService.class); |
| 548 | if (powerService == null) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 549 | Slogf.w(TAG, "Cannot get CarPowerManagementService"); |
Eric Jeong | 27a178f | 2020-03-24 16:39:39 -0700 | [diff] [blame] | 550 | return; |
| 551 | } |
Lakshman Annadorai | 64d0e1f | 2021-10-06 12:19:41 -0700 | [diff] [blame] | 552 | powerService.registerListener(mCarPowerStateListener); |
| 553 | powerService.addPowerPolicyListener( |
| 554 | new CarPowerPolicyFilter.Builder().setComponents(PowerComponent.DISPLAY).build(), |
| 555 | mCarDisplayPowerPolicyListener); |
| 556 | } |
| 557 | |
| 558 | private void unsubscribePowerManagementService() { |
| 559 | CarPowerManagementService powerService = |
| 560 | CarLocalServices.getService(CarPowerManagementService.class); |
| 561 | if (powerService == null) { |
| 562 | Slogf.w(TAG, "Cannot get CarPowerManagementService"); |
| 563 | return; |
| 564 | } |
| 565 | powerService.unregisterListener(mCarPowerStateListener); |
| 566 | powerService.removePowerPolicyListener(mCarDisplayPowerPolicyListener); |
Eric Jeong | 27a178f | 2020-03-24 16:39:39 -0700 | [diff] [blame] | 567 | } |
| 568 | |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 569 | private void subscribeUserStateChange() { |
| 570 | CarUserService userService = CarLocalServices.getService(CarUserService.class); |
| 571 | if (userService == null) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 572 | Slogf.w(TAG, "Cannot get CarUserService"); |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 573 | return; |
| 574 | } |
| 575 | userService.addUserLifecycleListener((event) -> { |
| 576 | int userId = event.getUserHandle().getIdentifier(); |
| 577 | int userState; |
| 578 | String userStateDesc; |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 579 | switch (event.getEventType()) { |
| 580 | case USER_LIFECYCLE_EVENT_TYPE_STARTING: |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 581 | mWatchdogProcessHandler.updateUserState(userId, /*isStopped=*/ false); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 582 | userState = UserState.USER_STATE_STARTED; |
| 583 | userStateDesc = "STARTING"; |
| 584 | break; |
| 585 | case USER_LIFECYCLE_EVENT_TYPE_STOPPED: |
Lakshman Annadorai | 0d3b199 | 2021-08-17 09:11:24 -0700 | [diff] [blame] | 586 | mWatchdogProcessHandler.updateUserState(userId, /*isStopped=*/ true); |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 587 | userState = UserState.USER_STATE_STOPPED; |
| 588 | userStateDesc = "STOPPING"; |
| 589 | break; |
| 590 | default: |
| 591 | return; |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 592 | } |
| 593 | try { |
| 594 | mCarWatchdogDaemonHelper.notifySystemStateChange(StateType.USER_STATE, userId, |
| 595 | userState); |
Eric Jeong | 4825ca3 | 2020-04-13 18:07:44 -0700 | [diff] [blame] | 596 | if (DEBUG) { |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 597 | Slogf.d(TAG, "Notified car watchdog daemon user %d's user state, %s", |
| 598 | userId, userStateDesc); |
Eric Jeong | 4825ca3 | 2020-04-13 18:07:44 -0700 | [diff] [blame] | 599 | } |
| 600 | } catch (RemoteException | RuntimeException e) { |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 601 | Slogf.w(TAG, "Notifying user state change failed: %s", e); |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 602 | } |
Eric Jeong | 01a28aa | 2020-03-27 16:43:19 -0700 | [diff] [blame] | 603 | }); |
| 604 | } |
| 605 | |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 606 | private void subscribeBroadcastReceiver() { |
| 607 | IntentFilter filter = new IntentFilter(); |
| 608 | filter.addAction(ACTION_GARAGE_MODE_ON); |
| 609 | filter.addAction(ACTION_GARAGE_MODE_OFF); |
Jahdiel Alvarez | 9de7aa5 | 2021-09-10 04:39:23 +0000 | [diff] [blame] | 610 | filter.addAction(Intent.ACTION_USER_REMOVED); |
Lakshman Annadorai | 8a67df1 | 2021-06-29 19:33:37 -0700 | [diff] [blame] | 611 | |
| 612 | mContext.registerReceiverForAllUsers(mBroadcastReceiver, filter, null, null); |
| 613 | } |
| 614 | |
Lakshman Annadorai | 42185d8 | 2021-10-15 23:55:14 +0000 | [diff] [blame] | 615 | private static @PowerCycle int carPowerStateToPowerCycle(int powerState) { |
| 616 | switch (powerState) { |
| 617 | // SHUTDOWN_PREPARE covers suspend and shutdown. |
| 618 | case CarPowerStateListener.SHUTDOWN_PREPARE: |
| 619 | return PowerCycle.POWER_CYCLE_SHUTDOWN_PREPARE; |
| 620 | case CarPowerStateListener.SHUTDOWN_ENTER: |
| 621 | case CarPowerStateListener.SUSPEND_ENTER: |
| 622 | return PowerCycle.POWER_CYCLE_SHUTDOWN_ENTER; |
| 623 | // ON covers resume. |
| 624 | case CarPowerStateListener.ON: |
| 625 | return PowerCycle.POWER_CYCLE_RESUME; |
| 626 | } |
| 627 | return PowerCycle.NUM_POWER_CYLES; |
| 628 | } |
| 629 | |
| 630 | private static String toGarageModeString(@GarageMode int garageMode) { |
| 631 | switch (garageMode) { |
| 632 | case GarageMode.GARAGE_MODE_OFF: |
| 633 | return "GARAGE_MODE_OFF"; |
| 634 | case GarageMode.GARAGE_MODE_ON: |
| 635 | return "GARAGE_MODE_ON"; |
| 636 | } |
| 637 | return "INVALID"; |
| 638 | } |
Jahdiel Alvarez | 8bf64ce | 2021-07-21 01:03:42 +0000 | [diff] [blame] | 639 | |
Lakshman Annadorai | d26098a | 2020-11-10 14:05:04 -0800 | [diff] [blame] | 640 | private static final class ICarWatchdogServiceForSystemImpl |
| 641 | extends ICarWatchdogServiceForSystem.Stub { |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 642 | private final WeakReference<CarWatchdogService> mService; |
| 643 | |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 644 | ICarWatchdogServiceForSystemImpl(CarWatchdogService service) { |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 645 | mService = new WeakReference<>(service); |
| 646 | } |
| 647 | |
| 648 | @Override |
| 649 | public void checkIfAlive(int sessionId, int timeout) { |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 650 | CarWatchdogService service = mService.get(); |
| 651 | if (service == null) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 652 | Slogf.w(TAG, "CarWatchdogService is not available"); |
Eric Jeong | ae2c04c | 2020-02-21 09:18:31 -0800 | [diff] [blame] | 653 | return; |
| 654 | } |
Lakshman Annadorai | 016127e | 2021-03-18 09:11:43 -0700 | [diff] [blame] | 655 | service.mWatchdogProcessHandler.postHealthCheckMessage(sessionId); |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 656 | } |
Jeongik Cha | 1d04bdd | 2020-04-08 22:19:52 +0900 | [diff] [blame] | 657 | |
| 658 | @Override |
Eric Jeong | 515009b | 2020-04-10 17:23:56 -0700 | [diff] [blame] | 659 | public void prepareProcessTermination() { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 660 | Slogf.w(TAG, "CarWatchdogService is about to be killed by car watchdog daemon"); |
Eric Jeong | 515009b | 2020-04-10 17:23:56 -0700 | [diff] [blame] | 661 | } |
Lakshman Annadorai | 8dfeeaf | 2020-12-15 14:10:53 -0800 | [diff] [blame] | 662 | |
| 663 | @Override |
Lakshman Annadorai | e17cba7 | 2020-12-17 14:03:36 -0800 | [diff] [blame] | 664 | public List<PackageInfo> getPackageInfosForUids( |
| 665 | int[] uids, List<String> vendorPackagePrefixes) { |
| 666 | if (ArrayUtils.isEmpty(uids)) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 667 | Slogf.w(TAG, "UID list is empty"); |
Lakshman Annadorai | e17cba7 | 2020-12-17 14:03:36 -0800 | [diff] [blame] | 668 | return null; |
| 669 | } |
| 670 | CarWatchdogService service = mService.get(); |
| 671 | if (service == null) { |
Lakshman Annadorai | 54e1054 | 2021-03-16 15:36:04 -0700 | [diff] [blame] | 672 | Slogf.w(TAG, "CarWatchdogService is not available"); |
Lakshman Annadorai | e17cba7 | 2020-12-17 14:03:36 -0800 | [diff] [blame] | 673 | return null; |
| 674 | } |
Lakshman Annadorai | 5f1181b | 2021-04-01 16:03:07 -0700 | [diff] [blame] | 675 | return service.mPackageInfoHandler.getPackageInfosForUids(uids, vendorPackagePrefixes); |
Lakshman Annadorai | 8dfeeaf | 2020-12-15 14:10:53 -0800 | [diff] [blame] | 676 | } |
Lakshman Annadorai | dd4a4e4 | 2021-02-19 14:22:06 -0800 | [diff] [blame] | 677 | |
| 678 | @Override |
Lakshman Annadorai | 9ed4732 | 2021-03-11 16:09:28 -0800 | [diff] [blame] | 679 | public void latestIoOveruseStats(List<PackageIoOveruseStats> packageIoOveruseStats) { |
Lakshman Annadorai | cf5f3a9 | 2021-04-02 15:26:16 -0700 | [diff] [blame] | 680 | if (packageIoOveruseStats.isEmpty()) { |
| 681 | Slogf.w(TAG, "Latest I/O overuse stats is empty"); |
| 682 | return; |
| 683 | } |
| 684 | CarWatchdogService service = mService.get(); |
| 685 | if (service == null) { |
| 686 | Slogf.w(TAG, "CarWatchdogService is not available"); |
| 687 | return; |
| 688 | } |
| 689 | service.mWatchdogPerfHandler.latestIoOveruseStats(packageIoOveruseStats); |
Lakshman Annadorai | dd4a4e4 | 2021-02-19 14:22:06 -0800 | [diff] [blame] | 690 | } |
Lakshman Annadorai | ec4d08a | 2021-04-30 08:29:10 -0700 | [diff] [blame] | 691 | |
| 692 | @Override |
| 693 | public void resetResourceOveruseStats(List<String> packageNames) { |
| 694 | if (packageNames.isEmpty()) { |
| 695 | Slogf.w(TAG, "Provided an empty package name to reset resource overuse stats"); |
| 696 | return; |
| 697 | } |
| 698 | CarWatchdogService service = mService.get(); |
| 699 | if (service == null) { |
| 700 | Slogf.w(TAG, "CarWatchdogService is not available"); |
| 701 | return; |
| 702 | } |
| 703 | service.mWatchdogPerfHandler.resetResourceOveruseStats(new ArraySet<>(packageNames)); |
| 704 | } |
Lakshman Annadorai | 03cbd1f | 2021-10-08 18:39:10 +0000 | [diff] [blame] | 705 | |
| 706 | @Override |
| 707 | public List<UserPackageIoUsageStats> getTodayIoUsageStats() { |
| 708 | CarWatchdogService service = mService.get(); |
| 709 | if (service == null) { |
| 710 | Slogf.w(TAG, "CarWatchdogService is not available"); |
| 711 | return null; |
| 712 | } |
| 713 | return service.mWatchdogPerfHandler.getTodayIoUsageStats(); |
| 714 | } |
Eric Jeong | 0965756 | 2020-03-20 16:02:39 -0700 | [diff] [blame] | 715 | } |
Eric Jeong | 38ae821 | 2020-01-14 10:25:10 -0800 | [diff] [blame] | 716 | } |