blob: dcdb3f3521c617d26a792794385b33f0baded640 [file] [log] [blame]
Eric Jeong38ae8212020-01-14 10:25:10 -08001/*
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
17package com.android.car.watchdog;
18
Eric Jeong01a28aa2020-03-27 16:43:19 -070019import static android.car.user.CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING;
20import static android.car.user.CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STOPPED;
Eric Jeongae2c04c2020-02-21 09:18:31 -080021
Eric Jeong09657562020-03-20 16:02:39 -070022import static com.android.car.CarLog.TAG_WATCHDOG;
Eric Jeong09657562020-03-20 16:02:39 -070023
24import android.annotation.NonNull;
Lakshman Annadoraid26098a2020-11-10 14:05:04 -080025import android.automotive.watchdog.internal.ICarWatchdogServiceForSystem;
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -080026import android.automotive.watchdog.internal.PackageInfo;
Lakshman Annadoraidd4a4e42021-02-19 14:22:06 -080027import android.automotive.watchdog.internal.PackageIoOveruseStats;
Lakshman Annadorai967b21e2020-10-30 09:35:29 -070028import android.automotive.watchdog.internal.PowerCycle;
29import android.automotive.watchdog.internal.StateType;
30import android.automotive.watchdog.internal.UserState;
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -080031import android.car.Car;
Eric Jeong27a178f2020-03-24 16:39:39 -070032import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
33import android.car.hardware.power.ICarPowerStateListener;
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -080034import android.car.watchdog.CarWatchdogManager;
Eric Jeong38ae8212020-01-14 10:25:10 -080035import android.car.watchdog.ICarWatchdogService;
Eric Jeong4e111e92020-06-23 19:50:55 -070036import android.car.watchdog.ICarWatchdogServiceCallback;
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -080037import android.car.watchdog.IResourceOveruseListener;
38import android.car.watchdog.PackageKillableState;
39import android.car.watchdog.ResourceOveruseConfiguration;
40import android.car.watchdog.ResourceOveruseStats;
Eric Jeong6df075f2020-03-11 16:12:23 -070041import android.car.watchdoglib.CarWatchdogDaemonHelper;
Eric Jeongae2c04c2020-02-21 09:18:31 -080042import android.content.Context;
Eric Jeong01a28aa2020-03-27 16:43:19 -070043import android.content.pm.UserInfo;
Eric Jeongae2c04c2020-02-21 09:18:31 -080044import android.os.RemoteException;
Eric Jeong01a28aa2020-03-27 16:43:19 -070045import android.os.UserHandle;
46import android.os.UserManager;
Lakshman Annadoraiec4d08a2021-04-30 08:29:10 -070047import android.util.ArraySet;
Felipe Leme176a5fd2021-01-20 15:48:33 -080048import android.util.IndentingPrintWriter;
Eric Jeongae2c04c2020-02-21 09:18:31 -080049
Eric Jeong27a178f2020-03-24 16:39:39 -070050import com.android.car.CarLocalServices;
Mayank Garg72c71d22021-02-03 23:54:45 -080051import com.android.car.CarLog;
Eric Jeong38ae8212020-01-14 10:25:10 -080052import com.android.car.CarServiceBase;
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -080053import com.android.car.ICarImpl;
Eric Jeongbc351e22020-07-31 13:54:17 -070054import com.android.car.power.CarPowerManagementService;
Eric Jeong01a28aa2020-03-27 16:43:19 -070055import com.android.car.user.CarUserService;
Eric Jeong0ee72812020-04-21 15:23:54 -070056import com.android.internal.annotations.VisibleForTesting;
Lakshman Annadoraie17cba72020-12-17 14:03:36 -080057import com.android.internal.util.ArrayUtils;
Lakshman Annadorai54e10542021-03-16 15:36:04 -070058import com.android.server.utils.Slogf;
Eric Jeong38ae8212020-01-14 10:25:10 -080059
Eric Jeong38ae8212020-01-14 10:25:10 -080060import java.lang.ref.WeakReference;
Eric Jeong01a28aa2020-03-27 16:43:19 -070061import java.util.List;
Eric Jeong38ae8212020-01-14 10:25:10 -080062
63/**
64 * Service to implement CarWatchdogManager API.
Eric Jeong38ae8212020-01-14 10:25:10 -080065 */
66public final class CarWatchdogService extends ICarWatchdogService.Stub implements CarServiceBase {
Lakshman Annadoraid7b8a032021-04-20 12:31:05 -070067 static final boolean DEBUG = false; // STOPSHIP if true
68 static final String TAG = CarLog.tagFor(CarWatchdogService.class);
Eric Jeong09657562020-03-20 16:02:39 -070069
Eric Jeongae2c04c2020-02-21 09:18:31 -080070 private final Context mContext;
Lakshman Annadoraid26098a2020-11-10 14:05:04 -080071 private final ICarWatchdogServiceForSystemImpl mWatchdogServiceForSystem;
Lakshman Annadorai5f1181b2021-04-01 16:03:07 -070072 private final PackageInfoHandler mPackageInfoHandler;
Lakshman Annadorai016127e2021-03-18 09:11:43 -070073 private final WatchdogProcessHandler mWatchdogProcessHandler;
74 private final WatchdogPerfHandler mWatchdogPerfHandler;
Eric Jeong09657562020-03-20 16:02:39 -070075 private final CarWatchdogDaemonHelper mCarWatchdogDaemonHelper;
Lakshman Annadorai8ee56ec2021-04-27 11:51:08 -070076 private final CarWatchdogDaemonHelper.OnConnectionChangeListener mConnectionListener;
Eric Jeong09657562020-03-20 16:02:39 -070077
Eric Jeong0ee72812020-04-21 15:23:54 -070078 public CarWatchdogService(Context context) {
Eric Jeongae2c04c2020-02-21 09:18:31 -080079 mContext = context;
Lakshman Annadorai5f1181b2021-04-01 16:03:07 -070080 mPackageInfoHandler = new PackageInfoHandler(mContext.getPackageManager());
Eric Jeong0ee72812020-04-21 15:23:54 -070081 mCarWatchdogDaemonHelper = new CarWatchdogDaemonHelper(TAG_WATCHDOG);
Lakshman Annadoraid26098a2020-11-10 14:05:04 -080082 mWatchdogServiceForSystem = new ICarWatchdogServiceForSystemImpl(this);
Lakshman Annadoraicf5f3a92021-04-02 15:26:16 -070083 mWatchdogProcessHandler = new WatchdogProcessHandler(mWatchdogServiceForSystem,
Lakshman Annadoraid7b8a032021-04-20 12:31:05 -070084 mCarWatchdogDaemonHelper);
Lakshman Annadoraicf5f3a92021-04-02 15:26:16 -070085 mWatchdogPerfHandler = new WatchdogPerfHandler(mContext, mCarWatchdogDaemonHelper,
Lakshman Annadoraid7b8a032021-04-20 12:31:05 -070086 mPackageInfoHandler);
Lakshman Annadorai8ee56ec2021-04-27 11:51:08 -070087 mConnectionListener = (isConnected) -> {
88 if (isConnected) {
89 registerToDaemon();
90 }
91 mWatchdogPerfHandler.onDaemonConnectionChange(isConnected);
92 };
Eric Jeong38ae8212020-01-14 10:25:10 -080093 }
94
95 @Override
96 public void init() {
Lakshman Annadorai016127e2021-03-18 09:11:43 -070097 mWatchdogProcessHandler.init();
Eric Jeong01a28aa2020-03-27 16:43:19 -070098 subscribePowerCycleChange();
99 subscribeUserStateChange();
Eric Jeong6df075f2020-03-11 16:12:23 -0700100 mCarWatchdogDaemonHelper.addOnConnectionChangeListener(mConnectionListener);
101 mCarWatchdogDaemonHelper.connect();
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700102 mWatchdogPerfHandler.init();
Eric Jeong09657562020-03-20 16:02:39 -0700103 if (DEBUG) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700104 Slogf.d(TAG, "CarWatchdogService is initialized");
Eric Jeong09657562020-03-20 16:02:39 -0700105 }
Eric Jeong38ae8212020-01-14 10:25:10 -0800106 }
107
108 @Override
109 public void release() {
Lakshman Annadoraicf5f3a92021-04-02 15:26:16 -0700110 mWatchdogPerfHandler.release();
Eric Jeong6df075f2020-03-11 16:12:23 -0700111 unregisterFromDaemon();
112 mCarWatchdogDaemonHelper.disconnect();
Eric Jeong38ae8212020-01-14 10:25:10 -0800113 }
114
115 @Override
Felipe Leme176a5fd2021-01-20 15:48:33 -0800116 public void dump(IndentingPrintWriter writer) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700117 writer.println("*CarWatchdogService*");
118 mWatchdogProcessHandler.dump(writer);
119 mWatchdogPerfHandler.dump(writer);
Eric Jeong38ae8212020-01-14 10:25:10 -0800120 }
121
Eric Jeong09657562020-03-20 16:02:39 -0700122 /**
Eric Jeong4e111e92020-06-23 19:50:55 -0700123 * Registers {@link android.car.watchdog.ICarWatchdogServiceCallback} to
Eric Jeong09657562020-03-20 16:02:39 -0700124 * {@link CarWatchdogService}.
125 */
Eric Jeong38ae8212020-01-14 10:25:10 -0800126 @Override
Eric Jeong4e111e92020-06-23 19:50:55 -0700127 public void registerClient(ICarWatchdogServiceCallback client, int timeout) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700128 mWatchdogProcessHandler.registerClient(client, timeout);
Eric Jeong38ae8212020-01-14 10:25:10 -0800129 }
130
Eric Jeong09657562020-03-20 16:02:39 -0700131 /**
Eric Jeong4e111e92020-06-23 19:50:55 -0700132 * Unregisters {@link android.car.watchdog.ICarWatchdogServiceCallback} from
Eric Jeong09657562020-03-20 16:02:39 -0700133 * {@link CarWatchdogService}.
134 */
Eric Jeong38ae8212020-01-14 10:25:10 -0800135 @Override
Eric Jeong4e111e92020-06-23 19:50:55 -0700136 public void unregisterClient(ICarWatchdogServiceCallback client) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700137 mWatchdogProcessHandler.unregisterClient(client);
Eric Jeong38ae8212020-01-14 10:25:10 -0800138 }
139
Eric Jeong09657562020-03-20 16:02:39 -0700140 /**
141 * Tells {@link CarWatchdogService} that the client is alive.
142 */
Eric Jeong38ae8212020-01-14 10:25:10 -0800143 @Override
Eric Jeong4e111e92020-06-23 19:50:55 -0700144 public void tellClientAlive(ICarWatchdogServiceCallback client, int sessionId) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700145 mWatchdogProcessHandler.tellClientAlive(client, sessionId);
146 }
147
148 @VisibleForTesting
149 protected int getClientCount(int timeout) {
150 return mWatchdogProcessHandler.getClientCount(timeout);
Eric Jeong38ae8212020-01-14 10:25:10 -0800151 }
152
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800153 /** Returns {@link android.car.watchdog.ResourceOveruseStats} for the calling package. */
154 @Override
155 @NonNull
156 public ResourceOveruseStats getResourceOveruseStats(
157 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag,
158 @CarWatchdogManager.StatsPeriod int maxStatsPeriod) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700159 return mWatchdogPerfHandler.getResourceOveruseStats(resourceOveruseFlag, maxStatsPeriod);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800160 }
161
162 /**
163 * Returns {@link android.car.watchdog.ResourceOveruseStats} for all packages for the maximum
164 * specified period, and the specified resource types with stats greater than or equal to the
165 * minimum specified stats.
166 */
167 @Override
168 @NonNull
169 public List<ResourceOveruseStats> getAllResourceOveruseStats(
170 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag,
171 @CarWatchdogManager.MinimumStatsFlag int minimumStatsFlag,
172 @CarWatchdogManager.StatsPeriod int maxStatsPeriod) {
173 ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700174 return mWatchdogPerfHandler.getAllResourceOveruseStats(resourceOveruseFlag,
175 minimumStatsFlag, maxStatsPeriod);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800176 }
177
178 /** Returns {@link android.car.watchdog.ResourceOveruseStats} for the specified user package. */
179 @Override
180 @NonNull
181 public ResourceOveruseStats getResourceOveruseStatsForUserPackage(
182 @NonNull String packageName, @NonNull UserHandle userHandle,
183 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag,
184 @CarWatchdogManager.StatsPeriod int maxStatsPeriod) {
185 ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700186 return mWatchdogPerfHandler.getResourceOveruseStatsForUserPackage(packageName, userHandle,
187 resourceOveruseFlag, maxStatsPeriod);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800188 }
189
190 /**
191 * Adds {@link android.car.watchdog.IResourceOveruseListener} for the calling package's resource
192 * overuse notifications.
193 */
194 @Override
195 public void addResourceOveruseListener(
196 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag,
197 @NonNull IResourceOveruseListener listener) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700198 mWatchdogPerfHandler.addResourceOveruseListener(resourceOveruseFlag, listener);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800199 }
200
201 /**
202 * Removes the previously added {@link android.car.watchdog.IResourceOveruseListener} for the
203 * calling package's resource overuse notifications.
204 */
205 @Override
206 public void removeResourceOveruseListener(@NonNull IResourceOveruseListener listener) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700207 mWatchdogPerfHandler.removeResourceOveruseListener(listener);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800208 }
209
210 /**
211 * Adds {@link android.car.watchdog.IResourceOveruseListener} for all packages' resource overuse
212 * notifications.
213 */
214 @Override
215 public void addResourceOveruseListenerForSystem(
216 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag,
217 @NonNull IResourceOveruseListener listener) {
218 ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700219 mWatchdogPerfHandler.addResourceOveruseListenerForSystem(resourceOveruseFlag, listener);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800220 }
221
222 /**
223 * Removes the previously added {@link android.car.watchdog.IResourceOveruseListener} for all
224 * packages' resource overuse notifications.
225 */
226 @Override
227 public void removeResourceOveruseListenerForSystem(@NonNull IResourceOveruseListener listener) {
228 ICarImpl.assertPermission(mContext, Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700229 mWatchdogPerfHandler.removeResourceOveruseListenerForSystem(listener);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800230 }
231
232 /** Sets whether or not a user package is killable on resource overuse. */
233 @Override
234 public void setKillablePackageAsUser(String packageName, UserHandle userHandle,
235 boolean isKillable) {
236 ICarImpl.assertPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700237 mWatchdogPerfHandler.setKillablePackageAsUser(packageName, userHandle, isKillable);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800238 }
239
240 /**
241 * Returns all {@link android.car.watchdog.PackageKillableState} on resource overuse for
242 * the specified user.
243 */
244 @Override
245 @NonNull
246 public List<PackageKillableState> getPackageKillableStatesAsUser(UserHandle userHandle) {
247 ICarImpl.assertPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700248 return mWatchdogPerfHandler.getPackageKillableStatesAsUser(userHandle);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800249 }
250
251 /**
252 * Sets {@link android.car.watchdog.ResourceOveruseConfiguration} for the specified resources.
253 */
254 @Override
Lakshman Annadorai8ee56ec2021-04-27 11:51:08 -0700255 @CarWatchdogManager.ReturnCode
256 public int setResourceOveruseConfigurations(
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800257 List<ResourceOveruseConfiguration> configurations,
258 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag) {
259 ICarImpl.assertPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG);
Lakshman Annadorai8ee56ec2021-04-27 11:51:08 -0700260 return mWatchdogPerfHandler.setResourceOveruseConfigurations(configurations,
261 resourceOveruseFlag);
Lakshman Annadoraiec1944b2021-03-03 16:18:34 -0800262 }
263
264 /** Returns the available {@link android.car.watchdog.ResourceOveruseConfiguration}. */
265 @Override
266 @NonNull
267 public List<ResourceOveruseConfiguration> getResourceOveruseConfigurations(
268 @CarWatchdogManager.ResourceOveruseFlag int resourceOveruseFlag) {
269 ICarImpl.assertAnyPermission(mContext, Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG,
270 Car.PERMISSION_COLLECT_CAR_WATCHDOG_METRICS);
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700271 return mWatchdogPerfHandler.getResourceOveruseConfigurations(resourceOveruseFlag);
Eric Jeong0ee72812020-04-21 15:23:54 -0700272 }
273
Eric Jeong6df075f2020-03-11 16:12:23 -0700274 private void registerToDaemon() {
Eric Jeongae2c04c2020-02-21 09:18:31 -0800275 try {
Lakshman Annadoraid26098a2020-11-10 14:05:04 -0800276 mCarWatchdogDaemonHelper.registerCarWatchdogService(mWatchdogServiceForSystem);
Eric Jeong09657562020-03-20 16:02:39 -0700277 if (DEBUG) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700278 Slogf.d(TAG, "CarWatchdogService registers to car watchdog daemon");
Eric Jeong09657562020-03-20 16:02:39 -0700279 }
Eric Jeong4825ca32020-04-13 18:07:44 -0700280 } catch (RemoteException | RuntimeException e) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700281 Slogf.w(TAG, "Cannot register to car watchdog daemon: %s", e);
Eric Jeong6df075f2020-03-11 16:12:23 -0700282 }
Eric Jeong01a28aa2020-03-27 16:43:19 -0700283 UserManager userManager = UserManager.get(mContext);
284 List<UserInfo> users = userManager.getUsers();
285 try {
286 // TODO(b/152780162): reduce the number of RPC calls(isUserRunning).
287 for (UserInfo info : users) {
288 int userState = userManager.isUserRunning(info.id)
289 ? UserState.USER_STATE_STARTED : UserState.USER_STATE_STOPPED;
290 mCarWatchdogDaemonHelper.notifySystemStateChange(StateType.USER_STATE, info.id,
291 userState);
292 if (userState == UserState.USER_STATE_STOPPED) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700293 mWatchdogProcessHandler.updateUserState(info.id, /*isStopped=*/true);
Eric Jeong01a28aa2020-03-27 16:43:19 -0700294 } else {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700295 mWatchdogProcessHandler.updateUserState(info.id, /*isStopped=*/false);
Eric Jeong01a28aa2020-03-27 16:43:19 -0700296 }
297 }
Eric Jeong4825ca32020-04-13 18:07:44 -0700298 } catch (RemoteException | RuntimeException e) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700299 Slogf.w(TAG, "Notifying system state change failed: %s", e);
Eric Jeong01a28aa2020-03-27 16:43:19 -0700300 }
Eric Jeong6df075f2020-03-11 16:12:23 -0700301 }
302
303 private void unregisterFromDaemon() {
304 try {
Lakshman Annadoraid26098a2020-11-10 14:05:04 -0800305 mCarWatchdogDaemonHelper.unregisterCarWatchdogService(mWatchdogServiceForSystem);
Eric Jeong09657562020-03-20 16:02:39 -0700306 if (DEBUG) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700307 Slogf.d(TAG, "CarWatchdogService unregisters from car watchdog daemon");
Eric Jeong09657562020-03-20 16:02:39 -0700308 }
Eric Jeong4825ca32020-04-13 18:07:44 -0700309 } catch (RemoteException | RuntimeException e) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700310 Slogf.w(TAG, "Cannot unregister from car watchdog daemon: %s", e);
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700311 }
312 }
313
Eric Jeong27a178f2020-03-24 16:39:39 -0700314 private void subscribePowerCycleChange() {
315 CarPowerManagementService powerService =
316 CarLocalServices.getService(CarPowerManagementService.class);
317 if (powerService == null) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700318 Slogf.w(TAG, "Cannot get CarPowerManagementService");
Eric Jeong27a178f2020-03-24 16:39:39 -0700319 return;
320 }
321 powerService.registerListener(new ICarPowerStateListener.Stub() {
322 @Override
323 public void onStateChanged(int state) {
324 int powerCycle;
325 switch (state) {
326 // SHUTDOWN_PREPARE covers suspend and shutdown.
327 case CarPowerStateListener.SHUTDOWN_PREPARE:
328 powerCycle = PowerCycle.POWER_CYCLE_SUSPEND;
329 break;
330 // ON covers resume.
331 case CarPowerStateListener.ON:
332 powerCycle = PowerCycle.POWER_CYCLE_RESUME;
333 // There might be outdated & incorrect info. We should reset them before
334 // starting to do health check.
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700335 mWatchdogProcessHandler.prepareHealthCheck();
Eric Jeong27a178f2020-03-24 16:39:39 -0700336 break;
337 default:
338 return;
339 }
340 try {
341 mCarWatchdogDaemonHelper.notifySystemStateChange(StateType.POWER_CYCLE,
342 powerCycle, /* arg2= */ -1);
Eric Jeong4825ca32020-04-13 18:07:44 -0700343 if (DEBUG) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700344 Slogf.d(TAG, "Notified car watchdog daemon a power cycle(%d)", powerCycle);
Eric Jeong4825ca32020-04-13 18:07:44 -0700345 }
346 } catch (RemoteException | RuntimeException e) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700347 Slogf.w(TAG, "Notifying system state change failed: %s", e);
Eric Jeong27a178f2020-03-24 16:39:39 -0700348 }
Eric Jeong27a178f2020-03-24 16:39:39 -0700349 }
350 });
351 }
352
Eric Jeong01a28aa2020-03-27 16:43:19 -0700353 private void subscribeUserStateChange() {
354 CarUserService userService = CarLocalServices.getService(CarUserService.class);
355 if (userService == null) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700356 Slogf.w(TAG, "Cannot get CarUserService");
Eric Jeong01a28aa2020-03-27 16:43:19 -0700357 return;
358 }
359 userService.addUserLifecycleListener((event) -> {
360 int userId = event.getUserHandle().getIdentifier();
361 int userState;
362 String userStateDesc;
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700363 switch (event.getEventType()) {
364 case USER_LIFECYCLE_EVENT_TYPE_STARTING:
365 mWatchdogProcessHandler.updateUserState(userId, /*isStopped=*/false);
366 userState = UserState.USER_STATE_STARTED;
367 userStateDesc = "STARTING";
368 break;
369 case USER_LIFECYCLE_EVENT_TYPE_STOPPED:
370 mWatchdogProcessHandler.updateUserState(userId, /*isStopped=*/true);
371 userState = UserState.USER_STATE_STOPPED;
372 userStateDesc = "STOPPING";
373 break;
374 default:
375 return;
Eric Jeong01a28aa2020-03-27 16:43:19 -0700376 }
377 try {
378 mCarWatchdogDaemonHelper.notifySystemStateChange(StateType.USER_STATE, userId,
379 userState);
Eric Jeong4825ca32020-04-13 18:07:44 -0700380 if (DEBUG) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700381 Slogf.d(TAG, "Notified car watchdog daemon user %d's user state, %s",
382 userId, userStateDesc);
Eric Jeong4825ca32020-04-13 18:07:44 -0700383 }
384 } catch (RemoteException | RuntimeException e) {
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700385 Slogf.w(TAG, "Notifying system state change failed: %s", e);
Eric Jeong01a28aa2020-03-27 16:43:19 -0700386 }
Eric Jeong01a28aa2020-03-27 16:43:19 -0700387 });
388 }
389
Lakshman Annadoraid26098a2020-11-10 14:05:04 -0800390 private static final class ICarWatchdogServiceForSystemImpl
391 extends ICarWatchdogServiceForSystem.Stub {
Eric Jeong38ae8212020-01-14 10:25:10 -0800392 private final WeakReference<CarWatchdogService> mService;
393
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700394 ICarWatchdogServiceForSystemImpl(CarWatchdogService service) {
Eric Jeong38ae8212020-01-14 10:25:10 -0800395 mService = new WeakReference<>(service);
396 }
397
398 @Override
399 public void checkIfAlive(int sessionId, int timeout) {
Eric Jeongae2c04c2020-02-21 09:18:31 -0800400 CarWatchdogService service = mService.get();
401 if (service == null) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700402 Slogf.w(TAG, "CarWatchdogService is not available");
Eric Jeongae2c04c2020-02-21 09:18:31 -0800403 return;
404 }
Lakshman Annadorai016127e2021-03-18 09:11:43 -0700405 service.mWatchdogProcessHandler.postHealthCheckMessage(sessionId);
Eric Jeong09657562020-03-20 16:02:39 -0700406 }
Jeongik Cha1d04bdd2020-04-08 22:19:52 +0900407
408 @Override
Eric Jeong515009b2020-04-10 17:23:56 -0700409 public void prepareProcessTermination() {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700410 Slogf.w(TAG, "CarWatchdogService is about to be killed by car watchdog daemon");
Eric Jeong515009b2020-04-10 17:23:56 -0700411 }
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800412
413 @Override
Lakshman Annadoraie17cba72020-12-17 14:03:36 -0800414 public List<PackageInfo> getPackageInfosForUids(
415 int[] uids, List<String> vendorPackagePrefixes) {
416 if (ArrayUtils.isEmpty(uids)) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700417 Slogf.w(TAG, "UID list is empty");
Lakshman Annadoraie17cba72020-12-17 14:03:36 -0800418 return null;
419 }
420 CarWatchdogService service = mService.get();
421 if (service == null) {
Lakshman Annadorai54e10542021-03-16 15:36:04 -0700422 Slogf.w(TAG, "CarWatchdogService is not available");
Lakshman Annadoraie17cba72020-12-17 14:03:36 -0800423 return null;
424 }
Lakshman Annadorai5f1181b2021-04-01 16:03:07 -0700425 return service.mPackageInfoHandler.getPackageInfosForUids(uids, vendorPackagePrefixes);
Lakshman Annadorai8dfeeaf2020-12-15 14:10:53 -0800426 }
Lakshman Annadoraidd4a4e42021-02-19 14:22:06 -0800427
428 @Override
Lakshman Annadorai9ed47322021-03-11 16:09:28 -0800429 public void latestIoOveruseStats(List<PackageIoOveruseStats> packageIoOveruseStats) {
Lakshman Annadoraicf5f3a92021-04-02 15:26:16 -0700430 if (packageIoOveruseStats.isEmpty()) {
431 Slogf.w(TAG, "Latest I/O overuse stats is empty");
432 return;
433 }
434 CarWatchdogService service = mService.get();
435 if (service == null) {
436 Slogf.w(TAG, "CarWatchdogService is not available");
437 return;
438 }
439 service.mWatchdogPerfHandler.latestIoOveruseStats(packageIoOveruseStats);
Lakshman Annadoraidd4a4e42021-02-19 14:22:06 -0800440 }
Lakshman Annadoraiec4d08a2021-04-30 08:29:10 -0700441
442 @Override
443 public void resetResourceOveruseStats(List<String> packageNames) {
444 if (packageNames.isEmpty()) {
445 Slogf.w(TAG, "Provided an empty package name to reset resource overuse stats");
446 return;
447 }
448 CarWatchdogService service = mService.get();
449 if (service == null) {
450 Slogf.w(TAG, "CarWatchdogService is not available");
451 return;
452 }
453 service.mWatchdogPerfHandler.resetResourceOveruseStats(new ArraySet<>(packageNames));
454 }
Eric Jeong09657562020-03-20 16:02:39 -0700455 }
Eric Jeong38ae8212020-01-14 10:25:10 -0800456}