blob: 0d96468761befbf53c00abc2487a0e7fcc263080 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006-2007 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.server.am;
18
Bookatzdb026a22018-01-10 19:01:56 -080019import android.app.ActivityManager;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -070020import android.bluetooth.BluetoothActivityEnergyInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021import android.content.Context;
Dianne Hackborne4a59512010-12-07 11:08:07 -080022import android.content.pm.ApplicationInfo;
Kenny Root3abd75b2011-09-29 11:00:41 -070023import android.content.pm.PackageManager;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -070024import android.net.wifi.WifiActivityEnergyInfo;
Makoto Onuki2eccd022017-11-01 13:44:23 -070025import android.os.PowerManager.ServiceType;
jackqdyulei455e90a2017-02-09 15:29:16 -080026import android.os.PowerSaveState;
Dianne Hackborn91268cf2013-06-13 19:06:50 -070027import android.os.BatteryStats;
David Chenc8a43242017-10-17 16:23:28 -070028import android.os.BatteryStatsInternal;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029import android.os.Binder;
Jeff Brown6f357d32014-01-15 20:40:55 -080030import android.os.Handler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080031import android.os.IBinder;
32import android.os.Parcel;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -070033import android.os.ParcelFileDescriptor;
Adam Lesinski9ae9cba2015-07-08 17:09:34 -070034import android.os.ParcelFormatException;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070035import android.os.PowerManagerInternal;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036import android.os.Process;
37import android.os.ServiceManager;
Dianne Hackborne5167ca2014-03-08 14:39:10 -080038import android.os.SystemClock;
Dianne Hackborncbfd23e2013-06-11 14:26:53 -070039import android.os.UserHandle;
Suprabh Shuklae6e723d2017-06-14 16:14:43 -070040import android.os.UserManagerInternal;
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -070041import android.os.WorkSource;
Narayan Kamath695cf722017-12-21 18:32:47 +000042import android.os.WorkSource.WorkChain;
Siddharth Raya1fd0572017-11-13 14:20:47 -080043import android.os.connectivity.CellularBatteryStats;
Siddharth Rayb50a6842017-12-14 15:15:28 -080044import android.os.connectivity.WifiBatteryStats;
Siddharth Ray78ccaf52017-12-23 16:16:21 -080045import android.os.connectivity.GpsBatteryStats;
Joe Onorato713fec82016-03-04 10:34:02 -080046import android.os.health.HealthStatsParceler;
47import android.os.health.HealthStatsWriter;
48import android.os.health.UidHealthStats;
Adam Lesinski06f46cb2015-06-23 13:42:53 -070049import android.telephony.DataConnectionRealTimeInfo;
Adam Lesinski21f76aa2016-01-25 12:27:06 -080050import android.telephony.ModemActivityInfo;
Wink Savillee9b06d72009-05-18 21:47:50 -070051import android.telephony.SignalStrength;
Dianne Hackborne4a59512010-12-07 11:08:07 -080052import android.telephony.TelephonyManager;
Joe Onorato8a9b2202010-02-26 18:56:32 -080053import android.util.Slog;
Amith Yamasani674c9bb2017-02-01 09:45:17 -080054
Amith Yamasani32dbefd2009-06-19 09:21:17 -070055import com.android.internal.app.IBatteryStats;
Dianne Hackbornd953c532014-08-16 18:17:38 -070056import com.android.internal.os.BatteryStatsHelper;
Amith Yamasani32dbefd2009-06-19 09:21:17 -070057import com.android.internal.os.BatteryStatsImpl;
Amith Yamasanie43530a2009-08-21 13:11:37 -070058import com.android.internal.os.PowerProfile;
Bookatz50df7112017-08-04 14:53:26 -070059import com.android.internal.os.RpmStats;
Jeff Sharkeyfe9a53b2017-03-31 14:08:23 -060060import com.android.internal.util.DumpUtils;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070061import com.android.server.LocalServices;
Chenjie Yu7ca2e822017-09-07 13:02:47 -070062import android.util.StatsLog;
Amith Yamasani32dbefd2009-06-19 09:21:17 -070063
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -070064import java.io.File;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080065import java.io.FileDescriptor;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -070066import java.io.IOException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080067import java.io.PrintWriter;
Adam Lesinski515702c2015-07-23 18:13:38 -070068import java.nio.ByteBuffer;
69import java.nio.CharBuffer;
70import java.nio.charset.CharsetDecoder;
71import java.nio.charset.CodingErrorAction;
72import java.nio.charset.StandardCharsets;
Narayan Kamath695cf722017-12-21 18:32:47 +000073import java.util.ArrayList;
Joe Onorato713fec82016-03-04 10:34:02 -080074import java.util.Arrays;
Dianne Hackborne4a59512010-12-07 11:08:07 -080075import java.util.List;
Adam Lesinskib3a1bad2017-05-26 11:50:40 -070076import java.util.concurrent.ExecutionException;
77import java.util.concurrent.Future;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078
79/**
80 * All information we are collecting about things that can happen that impact
81 * battery life.
82 */
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070083public final class BatteryStatsService extends IBatteryStats.Stub
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -070084 implements PowerManagerInternal.LowPowerModeListener,
85 BatteryStatsImpl.PlatformIdleStateCallback {
Dianne Hackbornc51cf032014-03-02 19:08:15 -080086 static final String TAG = "BatteryStatsService";
Joe Onorato82ba91d2017-04-27 16:18:05 -070087 static final boolean DBG = false;
Dianne Hackbornc51cf032014-03-02 19:08:15 -080088
Adam Lesinski010bf372016-04-11 12:18:18 -070089 private static IBatteryStats sService;
90
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080091 final BatteryStatsImpl mStats;
Suprabh Shuklae6e723d2017-06-14 16:14:43 -070092 private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
Adam Lesinskib3a1bad2017-05-26 11:50:40 -070093 private final Context mContext;
94 private final BatteryExternalStatsWorker mWorker;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -070095
Bookatz50df7112017-08-04 14:53:26 -070096 private native void getLowPowerStats(RpmStats rpmStats);
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -070097 private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
Ahmed ElArabawyd8b44112017-05-23 21:25:02 +000098 private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -070099 private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
100 .newDecoder()
101 .onMalformedInput(CodingErrorAction.REPLACE)
102 .onUnmappableCharacter(CodingErrorAction.REPLACE)
103 .replaceWith("?");
104 private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
105 private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
106 private static final int MAX_LOW_POWER_STATS_SIZE = 512;
107
Bookatz50df7112017-08-04 14:53:26 -0700108 /**
109 * Replaces the information in the given rpmStats with up-to-date information.
110 */
111 @Override
112 public void fillLowPowerStats(RpmStats rpmStats) {
113 if (DBG) Slog.d(TAG, "begin getLowPowerStats");
114 try {
115 getLowPowerStats(rpmStats);
116 } finally {
117 if (DBG) Slog.d(TAG, "end getLowPowerStats");
118 }
119 }
120
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -0700121 @Override
122 public String getPlatformLowPowerStats() {
Joe Onorato82ba91d2017-04-27 16:18:05 -0700123 if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
Adam Lesinskicd722082017-03-30 13:54:09 -0700124 try {
125 mUtf8BufferStat.clear();
126 mUtf16BufferStat.clear();
127 mDecoderStat.reset();
128 int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
129 if (bytesWritten < 0) {
130 return null;
131 } else if (bytesWritten == 0) {
132 return "Empty";
133 }
134 mUtf8BufferStat.limit(bytesWritten);
135 mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
136 mUtf16BufferStat.flip();
137 return mUtf16BufferStat.toString();
138 } finally {
Joe Onorato82ba91d2017-04-27 16:18:05 -0700139 if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -0700140 }
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -0700141 }
142
Ahmed ElArabawyd8b44112017-05-23 21:25:02 +0000143 @Override
144 public String getSubsystemLowPowerStats() {
Bookatz50df7112017-08-04 14:53:26 -0700145 if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats");
Ahmed ElArabawyd8b44112017-05-23 21:25:02 +0000146 try {
147 mUtf8BufferStat.clear();
148 mUtf16BufferStat.clear();
149 mDecoderStat.reset();
150 int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat);
151 if (bytesWritten < 0) {
152 return null;
153 } else if (bytesWritten == 0) {
154 return "Empty";
155 }
156 mUtf8BufferStat.limit(bytesWritten);
157 mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
158 mUtf16BufferStat.flip();
159 return mUtf16BufferStat.toString();
160 } finally {
Bookatz50df7112017-08-04 14:53:26 -0700161 if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats");
Ahmed ElArabawyd8b44112017-05-23 21:25:02 +0000162 }
163 }
164
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700165 BatteryStatsService(Context context, File systemDir, Handler handler) {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700166 // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700167 mContext = context;
Suprabh Shuklae6e723d2017-06-14 16:14:43 -0700168 mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
169 private UserManagerInternal umi;
170 @Override
171 public int[] getUserIds() {
172 if (umi == null) {
173 umi = LocalServices.getService(UserManagerInternal.class);
174 }
175 return (umi != null) ? umi.getUserIds() : null;
176 }
177 };
178 mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider);
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700179 mWorker = new BatteryExternalStatsWorker(context, mStats);
180 mStats.setExternalStatsSyncLocked(mWorker);
181 mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
182 com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
183 mStats.setPowerProfileLocked(new PowerProfile(context));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800184 }
Badhri Jagan Sridharan68cdf192016-04-03 21:57:15 -0700185
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700186 public void publish() {
David Chenc8a43242017-10-17 16:23:28 -0700187 LocalServices.addService(BatteryStatsInternal.class, new LocalService());
Adam Lesinski6832f392015-09-05 18:05:40 -0700188 ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
Jeff Brown2c43c332014-06-12 22:38:59 -0700189 }
190
Sudheer Shanka5c19b892018-01-05 17:25:46 -0800191 public void systemServicesReady() {
192 mStats.systemServicesReady(mContext);
193 }
194
David Chenc8a43242017-10-17 16:23:28 -0700195 private final class LocalService extends BatteryStatsInternal {
196 @Override
197 public String[] getWifiIfaces() {
198 return mStats.getWifiIfaces().clone();
199 }
200
201 @Override
202 public String[] getMobileIfaces() {
203 return mStats.getMobileIfaces().clone();
204 }
205 }
206
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700207 private static void awaitUninterruptibly(Future<?> future) {
208 while (true) {
209 try {
210 future.get();
211 return;
212 } catch (ExecutionException e) {
213 return;
214 } catch (InterruptedException e) {
215 // Keep looping
216 }
217 }
218 }
219
Sudheer Shankab2f83c12017-11-13 19:25:01 -0800220 private void syncStats(String reason, int flags) {
221 awaitUninterruptibly(mWorker.scheduleSync(reason, flags));
222 }
223
Jeff Brown2c43c332014-06-12 22:38:59 -0700224 /**
225 * At the time when the constructor runs, the power manager has not yet been
226 * initialized. So we initialize the low power observer later.
227 */
228 public void initPowerManagement() {
Adam Lesinski010bf372016-04-11 12:18:18 -0700229 final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
230 powerMgr.registerLowPowerModeObserver(this);
Adam Lesinski14ae39a2017-05-26 11:50:40 -0700231 synchronized (mStats) {
232 mStats.notePowerSaveModeLocked(
233 powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
234 .batterySaverEnabled);
235 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -0800236 (new WakeupReasonThread()).start();
Jeff Brown2c43c332014-06-12 22:38:59 -0700237 }
238
Dianne Hackborn55280a92009-05-07 15:53:46 -0700239 public void shutdown() {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800240 Slog.w("BatteryStats", "Writing battery stats before shutdown...");
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700241
Sudheer Shankab2f83c12017-11-13 19:25:01 -0800242 syncStats("shutdown", BatteryExternalStatsWorker.UPDATE_ALL);
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700243
Dianne Hackborn55280a92009-05-07 15:53:46 -0700244 synchronized (mStats) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700245 mStats.shutdownLocked();
Dianne Hackborn55280a92009-05-07 15:53:46 -0700246 }
Adam Lesinski20b84df2016-04-19 17:33:33 -0700247
248 // Shutdown the thread we made.
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700249 mWorker.shutdown();
Dianne Hackborn55280a92009-05-07 15:53:46 -0700250 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -0700251
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800252 public static IBatteryStats getService() {
253 if (sService != null) {
254 return sService;
255 }
Dianne Hackborn91268cf2013-06-13 19:06:50 -0700256 IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800257 sService = asInterface(b);
258 return sService;
259 }
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700260
261 @Override
jackqdyulei455e90a2017-02-09 15:29:16 -0800262 public int getServiceType() {
263 return ServiceType.BATTERY_STATS;
264 }
265
266 @Override
267 public void onLowPowerModeChanged(PowerSaveState result) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700268 synchronized (mStats) {
Adam Lesinski14ae39a2017-05-26 11:50:40 -0700269 mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700270 }
271 }
272
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800273 /**
274 * @return the current statistics object, which may be modified
275 * to reflect events that affect battery usage. You must lock the
276 * stats object before doing anything with it.
277 */
278 public BatteryStatsImpl getActiveStatistics() {
279 return mStats;
280 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700281
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700282 /**
283 * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
284 * object to update with the latest info, then write to disk.
285 */
286 public void scheduleWriteToDisk() {
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700287 mWorker.scheduleWrite();
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700288 }
289
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700290 // These are for direct use by the activity manager...
291
Adam Lesinskib83ffee2015-05-12 14:43:47 -0700292 /**
293 * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
294 */
295 void removeUid(int uid) {
296 synchronized (mStats) {
297 mStats.removeUidStatsLocked(uid);
298 }
299 }
300
Suprabh Shuklae6e723d2017-06-14 16:14:43 -0700301 void onCleanupUser(int userId) {
302 synchronized (mStats) {
303 mStats.onCleanupUserLocked(userId);
304 }
305 }
306
307 void onUserRemoved(int userId) {
308 synchronized (mStats) {
309 mStats.onUserRemovedLocked(userId);
310 }
311 }
312
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700313 void addIsolatedUid(int isolatedUid, int appUid) {
314 synchronized (mStats) {
315 mStats.addIsolatedUidLocked(isolatedUid, appUid);
316 }
317 }
318
319 void removeIsolatedUid(int isolatedUid, int appUid) {
320 synchronized (mStats) {
Adam Lesinski61db88f2015-07-01 15:05:07 -0700321 mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700322 }
323 }
324
325 void noteProcessStart(String name, int uid) {
326 synchronized (mStats) {
327 mStats.noteProcessStartLocked(name, uid);
Bookatzc1a050a2017-10-10 15:49:28 -0700328 // TODO: decide where this should be and use a constant instead of a literal.
329 StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 1);
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700330 }
331 }
332
Dianne Hackborn1e01d162014-12-04 17:46:42 -0800333 void noteProcessCrash(String name, int uid) {
334 synchronized (mStats) {
335 mStats.noteProcessCrashLocked(name, uid);
Bookatzc1a050a2017-10-10 15:49:28 -0700336 // TODO: decide where this should be and use a constant instead of a literal.
337 StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 2);
Dianne Hackborn1e01d162014-12-04 17:46:42 -0800338 }
339 }
340
341 void noteProcessAnr(String name, int uid) {
342 synchronized (mStats) {
343 mStats.noteProcessAnrLocked(name, uid);
Bookatzc1a050a2017-10-10 15:49:28 -0700344 // TODO: decide where this should be and use a constant instead of a literal.
345 StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 3);
Dianne Hackborn1e01d162014-12-04 17:46:42 -0800346 }
347 }
348
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700349 void noteProcessFinish(String name, int uid) {
350 synchronized (mStats) {
351 mStats.noteProcessFinishLocked(name, uid);
Bookatzc1a050a2017-10-10 15:49:28 -0700352 // TODO: decide where this should be and use a constant instead of a literal.
353 StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 0);
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700354 }
355 }
356
Bookatzdb026a22018-01-10 19:01:56 -0800357 /** @param state Process state from ActivityManager.java. */
Dianne Hackborna8d10942015-11-19 17:55:19 -0800358 void noteUidProcessState(int uid, int state) {
359 synchronized (mStats) {
Yao Chend54f9dd2017-10-17 17:37:48 +0000360 // TODO: remove this once we figure out properly where and how
Bookatzdb026a22018-01-10 19:01:56 -0800361 StatsLog.write(StatsLog.UID_PROCESS_STATE_CHANGED, uid,
362 ActivityManager.processStateAmToProto(state));
Yao Chend54f9dd2017-10-17 17:37:48 +0000363
Dianne Hackborna8d10942015-11-19 17:55:19 -0800364 mStats.noteUidProcessStateLocked(uid, state);
365 }
366 }
367
Dianne Hackborn2f1993e2014-09-26 11:28:01 -0700368 // Public interface...
369
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370 public byte[] getStatistics() {
371 mContext.enforceCallingPermission(
372 android.Manifest.permission.BATTERY_STATS, null);
Joe Onorato8a9b2202010-02-26 18:56:32 -0800373 //Slog.i("foo", "SENDING BATTERY INFO:");
374 //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800375 Parcel out = Parcel.obtain();
Sudheer Shankab2f83c12017-11-13 19:25:01 -0800376 syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700377 synchronized (mStats) {
378 mStats.writeToParcel(out, 0);
379 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800380 byte[] data = out.marshall();
381 out.recycle();
382 return data;
383 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700384
385 public ParcelFileDescriptor getStatisticsStream() {
386 mContext.enforceCallingPermission(
387 android.Manifest.permission.BATTERY_STATS, null);
388 //Slog.i("foo", "SENDING BATTERY INFO:");
389 //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
390 Parcel out = Parcel.obtain();
Sudheer Shankab2f83c12017-11-13 19:25:01 -0800391 syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700392 synchronized (mStats) {
393 mStats.writeToParcel(out, 0);
394 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700395 byte[] data = out.marshall();
396 out.recycle();
397 try {
398 return ParcelFileDescriptor.fromData(data, "battery-stats");
399 } catch (IOException e) {
400 Slog.w(TAG, "Unable to create shared memory", e);
401 return null;
402 }
403 }
404
Dianne Hackborn4870e9d2015-04-08 16:55:47 -0700405 public boolean isCharging() {
406 synchronized (mStats) {
407 return mStats.isCharging();
408 }
409 }
410
Dianne Hackbornab5c0ea2014-04-29 14:53:32 -0700411 public long computeBatteryTimeRemaining() {
412 synchronized (mStats) {
413 long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
414 return time >= 0 ? (time/1000) : time;
415 }
416 }
417
418 public long computeChargeTimeRemaining() {
419 synchronized (mStats) {
420 long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
421 return time >= 0 ? (time/1000) : time;
422 }
423 }
424
Dianne Hackborn099bc622014-01-22 13:39:16 -0800425 public void noteEvent(int code, String name, int uid) {
426 enforceCallingPermission();
427 synchronized (mStats) {
428 mStats.noteEventLocked(code, name, uid);
429 }
430 }
431
Dianne Hackbornfdb19562014-07-11 16:03:36 -0700432 public void noteSyncStart(String name, int uid) {
433 enforceCallingPermission();
434 synchronized (mStats) {
435 mStats.noteSyncStartLocked(name, uid);
436 }
437 }
438
439 public void noteSyncFinish(String name, int uid) {
440 enforceCallingPermission();
441 synchronized (mStats) {
442 mStats.noteSyncFinishLocked(name, uid);
443 }
444 }
445
446 public void noteJobStart(String name, int uid) {
447 enforceCallingPermission();
448 synchronized (mStats) {
449 mStats.noteJobStartLocked(name, uid);
450 }
451 }
452
Dianne Hackborn94326cb2017-06-28 16:17:20 -0700453 public void noteJobFinish(String name, int uid, int stopReason) {
Dianne Hackbornfdb19562014-07-11 16:03:36 -0700454 enforceCallingPermission();
455 synchronized (mStats) {
Dianne Hackborn94326cb2017-06-28 16:17:20 -0700456 mStats.noteJobFinishLocked(name, uid, stopReason);
Dianne Hackbornfdb19562014-07-11 16:03:36 -0700457 }
458 }
459
Narayan Kamath695cf722017-12-21 18:32:47 +0000460 public void noteWakupAlarm(String name, int uid, WorkSource workSource, String tag) {
Dianne Hackborn1e383822015-04-10 14:02:33 -0700461 enforceCallingPermission();
462 synchronized (mStats) {
Narayan Kamath695cf722017-12-21 18:32:47 +0000463 mStats.noteWakupAlarmLocked(name, uid, workSource, tag);
Dianne Hackborn1e383822015-04-10 14:02:33 -0700464 }
465 }
466
Narayan Kamath695cf722017-12-21 18:32:47 +0000467 public void noteAlarmStart(String name, WorkSource workSource, int uid) {
Dianne Hackborn1e383822015-04-10 14:02:33 -0700468 enforceCallingPermission();
469 synchronized (mStats) {
Narayan Kamath695cf722017-12-21 18:32:47 +0000470 mStats.noteAlarmStartLocked(name, workSource, uid);
471 }
472 }
473
474 public void noteAlarmFinish(String name, WorkSource workSource, int uid) {
475 enforceCallingPermission();
476 synchronized (mStats) {
477 mStats.noteAlarmFinishLocked(name, workSource, uid);
Dianne Hackborn1e383822015-04-10 14:02:33 -0700478 }
479 }
480
Dianne Hackborna1f1a3c2014-02-24 18:12:28 -0800481 public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
Dianne Hackborn3d658bf2014-02-05 13:38:56 -0800482 boolean unimportantForLogging) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800483 enforceCallingPermission();
484 synchronized (mStats) {
Narayan Kamath81822022017-12-08 11:56:01 +0000485 mStats.noteStartWakeLocked(uid, pid, null, name, historyName, type,
486 unimportantForLogging, SystemClock.elapsedRealtime(),
487 SystemClock.uptimeMillis());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800488 }
489 }
490
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700491 public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800492 enforceCallingPermission();
493 synchronized (mStats) {
Narayan Kamath81822022017-12-08 11:56:01 +0000494 mStats.noteStopWakeLocked(uid, pid, null, name, historyName, type,
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700495 SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800496 }
497 }
498
Dianne Hackborna1f1a3c2014-02-24 18:12:28 -0800499 public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
500 String historyName, int type, boolean unimportantForLogging) {
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700501 enforceCallingPermission();
502 synchronized (mStats) {
Dianne Hackborna1f1a3c2014-02-24 18:12:28 -0800503 mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
504 type, unimportantForLogging);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700505 }
506 }
507
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700508 public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
509 String historyName, int type, WorkSource newWs, int newPid, String newName,
Dianne Hackborne5167ca2014-03-08 14:39:10 -0800510 String newHistoryName, int newType, boolean newUnimportantForLogging) {
511 enforceCallingPermission();
512 synchronized (mStats) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700513 mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
Dianne Hackborne5167ca2014-03-08 14:39:10 -0800514 newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
515 }
516 }
517
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700518 public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
519 int type) {
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700520 enforceCallingPermission();
521 synchronized (mStats) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700522 mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700523 }
524 }
525
Narayan Kamath96a92562018-01-02 18:57:17 +0000526 @Override
Dianne Hackbornd0db6f02016-07-18 14:14:20 -0700527 public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
528 enforceCallingPermission();
529 synchronized (mStats) {
530 mStats.noteLongPartialWakelockStart(name, historyName, uid);
531 }
532 }
533
Narayan Kamath96a92562018-01-02 18:57:17 +0000534 @Override
535 public void noteLongPartialWakelockStartFromSource(String name, String historyName,
536 WorkSource workSource) {
537 enforceCallingPermission();
538 synchronized (mStats) {
539 mStats.noteLongPartialWakelockStartFromSource(name, historyName, workSource);
540 }
541 }
542
543 @Override
Dianne Hackbornd0db6f02016-07-18 14:14:20 -0700544 public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
545 enforceCallingPermission();
546 synchronized (mStats) {
547 mStats.noteLongPartialWakelockFinish(name, historyName, uid);
548 }
549 }
550
Narayan Kamath96a92562018-01-02 18:57:17 +0000551 @Override
552 public void noteLongPartialWakelockFinishFromSource(String name, String historyName,
553 WorkSource workSource) {
554 enforceCallingPermission();
555 synchronized (mStats) {
556 mStats.noteLongPartialWakelockFinishFromSource(name, historyName, workSource);
557 }
558 }
559
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800560 public void noteStartSensor(int uid, int sensor) {
561 enforceCallingPermission();
562 synchronized (mStats) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -0700563 mStats.noteStartSensorLocked(uid, sensor);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800564 }
565 }
Chenjie Yu29fb1f72017-09-13 12:18:50 -0700566
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800567 public void noteStopSensor(int uid, int sensor) {
568 enforceCallingPermission();
569 synchronized (mStats) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -0700570 mStats.noteStopSensorLocked(uid, sensor);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800571 }
572 }
Chenjie Yu29fb1f72017-09-13 12:18:50 -0700573
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800574 public void noteVibratorOn(int uid, long durationMillis) {
575 enforceCallingPermission();
576 synchronized (mStats) {
577 mStats.noteVibratorOnLocked(uid, durationMillis);
578 }
579 }
580
581 public void noteVibratorOff(int uid) {
582 enforceCallingPermission();
583 synchronized (mStats) {
584 mStats.noteVibratorOffLocked(uid);
585 }
586 }
587
Narayan Kamath32684dd2018-01-08 17:32:51 +0000588 @Override
589 public void noteGpsChanged(WorkSource oldWs, WorkSource newWs) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800590 enforceCallingPermission();
591 synchronized (mStats) {
Narayan Kamath32684dd2018-01-08 17:32:51 +0000592 mStats.noteGpsChangedLocked(oldWs, newWs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800593 }
594 }
Chenjie Yu29fb1f72017-09-13 12:18:50 -0700595
Siddharth Ray78ccaf52017-12-23 16:16:21 -0800596 public void noteGpsSignalQuality(int signalLevel) {
597 synchronized (mStats) {
598 mStats.noteGpsSignalQualityLocked(signalLevel);
599 }
600 }
601
Jeff Browne95c3cd2014-05-02 16:59:26 -0700602 public void noteScreenState(int state) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800603 enforceCallingPermission();
Joe Onorato82ba91d2017-04-27 16:18:05 -0700604 if (DBG) Slog.d(TAG, "begin noteScreenState");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800605 synchronized (mStats) {
Joe Onorato93194532017-10-16 22:41:28 +0000606 // TODO: remove this once we figure out properly where and how
Yao Chend54f9dd2017-10-17 17:37:48 +0000607 StatsLog.write(StatsLog.SCREEN_STATE_CHANGED, state);
608
609 mStats.noteScreenStateLocked(state);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800610 }
Joe Onorato82ba91d2017-04-27 16:18:05 -0700611 if (DBG) Slog.d(TAG, "end noteScreenState");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800612 }
Chenjie Yu29fb1f72017-09-13 12:18:50 -0700613
Dianne Hackborn617f8772009-03-31 15:04:46 -0700614 public void noteScreenBrightness(int brightness) {
615 enforceCallingPermission();
616 synchronized (mStats) {
Bookatzc1a050a2017-10-10 15:49:28 -0700617 StatsLog.write(StatsLog.SCREEN_BRIGHTNESS_CHANGED, brightness);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700618 mStats.noteScreenBrightnessLocked(brightness);
619 }
620 }
yroe03583e2017-09-20 22:51:26 -0700621
Dianne Hackborn617f8772009-03-31 15:04:46 -0700622 public void noteUserActivity(int uid, int event) {
623 enforceCallingPermission();
624 synchronized (mStats) {
625 mStats.noteUserActivityLocked(uid, event);
626 }
627 }
yroe03583e2017-09-20 22:51:26 -0700628
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700629 public void noteWakeUp(String reason, int reasonUid) {
630 enforceCallingPermission();
631 synchronized (mStats) {
632 mStats.noteWakeUpLocked(reason, reasonUid);
633 }
634 }
635
Jeff Browne95c3cd2014-05-02 16:59:26 -0700636 public void noteInteractive(boolean interactive) {
637 enforceCallingPermission();
638 synchronized (mStats) {
639 mStats.noteInteractiveLocked(interactive);
640 }
641 }
Dianne Hackborne13c4c02014-02-11 17:18:35 -0800642
Dianne Hackborn1e01d162014-12-04 17:46:42 -0800643 public void noteConnectivityChanged(int type, String extra) {
644 enforceCallingPermission();
645 synchronized (mStats) {
646 mStats.noteConnectivityChangedLocked(type, extra);
647 }
648 }
649
Ruchi Kandoifa97fcf2016-05-13 15:10:39 -0700650 public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
Dianne Hackborne13c4c02014-02-11 17:18:35 -0800651 enforceCallingPermission();
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700652 final boolean update;
Dianne Hackborne13c4c02014-02-11 17:18:35 -0800653 synchronized (mStats) {
Adam Lesinski14ae39a2017-05-26 11:50:40 -0700654 update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
655 }
656
657 if (update) {
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700658 mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
Dianne Hackborne13c4c02014-02-11 17:18:35 -0800659 }
660 }
661
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800662 public void notePhoneOn() {
663 enforceCallingPermission();
664 synchronized (mStats) {
665 mStats.notePhoneOnLocked();
666 }
667 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -0700668
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800669 public void notePhoneOff() {
670 enforceCallingPermission();
671 synchronized (mStats) {
672 mStats.notePhoneOffLocked();
673 }
674 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -0700675
Wink Savillee9b06d72009-05-18 21:47:50 -0700676 public void notePhoneSignalStrength(SignalStrength signalStrength) {
Dianne Hackborn627bba72009-03-24 22:32:56 -0700677 enforceCallingPermission();
678 synchronized (mStats) {
Wink Savillee9b06d72009-05-18 21:47:50 -0700679 mStats.notePhoneSignalStrengthLocked(signalStrength);
Dianne Hackborn627bba72009-03-24 22:32:56 -0700680 }
681 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -0700682
Dianne Hackborn627bba72009-03-24 22:32:56 -0700683 public void notePhoneDataConnectionState(int dataType, boolean hasData) {
684 enforceCallingPermission();
685 synchronized (mStats) {
686 mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
687 }
688 }
Amith Yamasani32dbefd2009-06-19 09:21:17 -0700689
Amith Yamasanif37447b2009-10-08 18:28:01 -0700690 public void notePhoneState(int state) {
Amith Yamasani32dbefd2009-06-19 09:21:17 -0700691 enforceCallingPermission();
Dianne Hackborne4a59512010-12-07 11:08:07 -0800692 int simState = TelephonyManager.getDefault().getSimState();
Amith Yamasani32dbefd2009-06-19 09:21:17 -0700693 synchronized (mStats) {
Dianne Hackborne4a59512010-12-07 11:08:07 -0800694 mStats.notePhoneStateLocked(state, simState);
Amith Yamasani32dbefd2009-06-19 09:21:17 -0700695 }
696 }
697
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700698 public void noteWifiOn() {
The Android Open Source Project10592532009-03-18 17:39:46 -0700699 enforceCallingPermission();
700 synchronized (mStats) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700701 mStats.noteWifiOnLocked();
The Android Open Source Project10592532009-03-18 17:39:46 -0700702 }
703 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -0700704
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700705 public void noteWifiOff() {
The Android Open Source Project10592532009-03-18 17:39:46 -0700706 enforceCallingPermission();
707 synchronized (mStats) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700708 mStats.noteWifiOffLocked();
The Android Open Source Project10592532009-03-18 17:39:46 -0700709 }
710 }
Eric Shienbroodd4c5f892009-03-24 18:13:20 -0700711
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700712 public void noteStartAudio(int uid) {
713 enforceCallingPermission();
714 synchronized (mStats) {
715 mStats.noteAudioOnLocked(uid);
716 }
717 }
718
719 public void noteStopAudio(int uid) {
720 enforceCallingPermission();
721 synchronized (mStats) {
722 mStats.noteAudioOffLocked(uid);
723 }
724 }
725
726 public void noteStartVideo(int uid) {
727 enforceCallingPermission();
728 synchronized (mStats) {
729 mStats.noteVideoOnLocked(uid);
730 }
731 }
732
733 public void noteStopVideo(int uid) {
734 enforceCallingPermission();
735 synchronized (mStats) {
736 mStats.noteVideoOffLocked(uid);
737 }
738 }
739
Dianne Hackborn10eaa852014-07-22 22:54:55 -0700740 public void noteResetAudio() {
741 enforceCallingPermission();
742 synchronized (mStats) {
743 mStats.noteResetAudioLocked();
744 }
745 }
746
747 public void noteResetVideo() {
748 enforceCallingPermission();
749 synchronized (mStats) {
750 mStats.noteResetVideoLocked();
751 }
752 }
753
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700754 public void noteFlashlightOn(int uid) {
Dianne Hackbornabc7c492014-06-30 16:57:46 -0700755 enforceCallingPermission();
756 synchronized (mStats) {
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700757 mStats.noteFlashlightOnLocked(uid);
Dianne Hackbornabc7c492014-06-30 16:57:46 -0700758 }
759 }
760
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700761 public void noteFlashlightOff(int uid) {
Dianne Hackbornabc7c492014-06-30 16:57:46 -0700762 enforceCallingPermission();
763 synchronized (mStats) {
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700764 mStats.noteFlashlightOffLocked(uid);
765 }
766 }
767
768 public void noteStartCamera(int uid) {
769 enforceCallingPermission();
Joe Onorato82ba91d2017-04-27 16:18:05 -0700770 if (DBG) Slog.d(TAG, "begin noteStartCamera");
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700771 synchronized (mStats) {
772 mStats.noteCameraOnLocked(uid);
773 }
Joe Onorato82ba91d2017-04-27 16:18:05 -0700774 if (DBG) Slog.d(TAG, "end noteStartCamera");
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700775 }
776
777 public void noteStopCamera(int uid) {
778 enforceCallingPermission();
779 synchronized (mStats) {
780 mStats.noteCameraOffLocked(uid);
781 }
782 }
783
784 public void noteResetCamera() {
785 enforceCallingPermission();
786 synchronized (mStats) {
787 mStats.noteResetCameraLocked();
788 }
789 }
790
791 public void noteResetFlashlight() {
792 enforceCallingPermission();
793 synchronized (mStats) {
794 mStats.noteResetFlashlightLocked();
Dianne Hackbornabc7c492014-06-30 16:57:46 -0700795 }
796 }
797
Adam Lesinskie08af192015-03-25 16:42:59 -0700798 @Override
Adam Lesinski5f056f62016-07-14 16:56:08 -0700799 public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
Adam Lesinskie08af192015-03-25 16:42:59 -0700800 enforceCallingPermission();
801
802 // There was a change in WiFi power state.
803 // Collect data now for the past activity.
Dianne Hackborn0c820db2015-04-14 17:47:34 -0700804 synchronized (mStats) {
Adam Lesinskia7c90c82015-06-18 14:52:24 -0700805 if (mStats.isOnBattery()) {
Adam Lesinski06f46cb2015-06-23 13:42:53 -0700806 final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
807 powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
808 : "inactive";
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700809 mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
Adam Lesinskia7c90c82015-06-18 14:52:24 -0700810 }
Adam Lesinski5f056f62016-07-14 16:56:08 -0700811 mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
Dianne Hackborn0c820db2015-04-14 17:47:34 -0700812 }
Adam Lesinskie08af192015-03-25 16:42:59 -0700813 }
814
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700815 public void noteWifiRunning(WorkSource ws) {
Eric Shienbroodd4c5f892009-03-24 18:13:20 -0700816 enforceCallingPermission();
817 synchronized (mStats) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700818 mStats.noteWifiRunningLocked(ws);
Eric Shienbroodd4c5f892009-03-24 18:13:20 -0700819 }
820 }
821
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700822 public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
Eric Shienbroodd4c5f892009-03-24 18:13:20 -0700823 enforceCallingPermission();
824 synchronized (mStats) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700825 mStats.noteWifiRunningChangedLocked(oldWs, newWs);
826 }
827 }
828
829 public void noteWifiStopped(WorkSource ws) {
830 enforceCallingPermission();
831 synchronized (mStats) {
832 mStats.noteWifiStoppedLocked(ws);
Eric Shienbroodd4c5f892009-03-24 18:13:20 -0700833 }
834 }
835
Dianne Hackbornca1bf212014-02-14 14:18:36 -0800836 public void noteWifiState(int wifiState, String accessPoint) {
837 enforceCallingPermission();
838 synchronized (mStats) {
839 mStats.noteWifiStateLocked(wifiState, accessPoint);
840 }
841 }
842
Dianne Hackborn3251b902014-06-20 14:40:53 -0700843 public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
844 enforceCallingPermission();
845 synchronized (mStats) {
846 mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
847 }
848 }
849
850 public void noteWifiRssiChanged(int newRssi) {
851 enforceCallingPermission();
852 synchronized (mStats) {
853 mStats.noteWifiRssiChangedLocked(newRssi);
854 }
855 }
856
The Android Open Source Project10592532009-03-18 17:39:46 -0700857 public void noteFullWifiLockAcquired(int uid) {
858 enforceCallingPermission();
859 synchronized (mStats) {
860 mStats.noteFullWifiLockAcquiredLocked(uid);
861 }
862 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -0700863
The Android Open Source Project10592532009-03-18 17:39:46 -0700864 public void noteFullWifiLockReleased(int uid) {
865 enforceCallingPermission();
866 synchronized (mStats) {
867 mStats.noteFullWifiLockReleasedLocked(uid);
868 }
869 }
Nick Pelly6ccaa542012-06-15 15:22:47 -0700870
871 public void noteWifiScanStarted(int uid) {
The Android Open Source Project10592532009-03-18 17:39:46 -0700872 enforceCallingPermission();
873 synchronized (mStats) {
Nick Pelly6ccaa542012-06-15 15:22:47 -0700874 mStats.noteWifiScanStartedLocked(uid);
The Android Open Source Project10592532009-03-18 17:39:46 -0700875 }
876 }
Nick Pelly6ccaa542012-06-15 15:22:47 -0700877
878 public void noteWifiScanStopped(int uid) {
The Android Open Source Project10592532009-03-18 17:39:46 -0700879 enforceCallingPermission();
880 synchronized (mStats) {
Nick Pelly6ccaa542012-06-15 15:22:47 -0700881 mStats.noteWifiScanStoppedLocked(uid);
The Android Open Source Project10592532009-03-18 17:39:46 -0700882 }
883 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800884
Robert Greenwalt5347bd42009-05-13 15:10:16 -0700885 public void noteWifiMulticastEnabled(int uid) {
886 enforceCallingPermission();
887 synchronized (mStats) {
888 mStats.noteWifiMulticastEnabledLocked(uid);
889 }
890 }
891
892 public void noteWifiMulticastDisabled(int uid) {
893 enforceCallingPermission();
894 synchronized (mStats) {
895 mStats.noteWifiMulticastDisabledLocked(uid);
896 }
897 }
898
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700899 public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
900 enforceCallingPermission();
901 synchronized (mStats) {
902 mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
903 }
904 }
905
906 public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
907 enforceCallingPermission();
908 synchronized (mStats) {
909 mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
910 }
911 }
912
Nick Pelly6ccaa542012-06-15 15:22:47 -0700913 public void noteWifiScanStartedFromSource(WorkSource ws) {
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700914 enforceCallingPermission();
915 synchronized (mStats) {
Nick Pelly6ccaa542012-06-15 15:22:47 -0700916 mStats.noteWifiScanStartedFromSourceLocked(ws);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700917 }
918 }
919
Nick Pelly6ccaa542012-06-15 15:22:47 -0700920 public void noteWifiScanStoppedFromSource(WorkSource ws) {
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700921 enforceCallingPermission();
922 synchronized (mStats) {
Nick Pelly6ccaa542012-06-15 15:22:47 -0700923 mStats.noteWifiScanStoppedFromSourceLocked(ws);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700924 }
925 }
926
Robert Greenwalta029ea12013-09-25 16:38:12 -0700927 public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
928 enforceCallingPermission();
929 synchronized (mStats) {
930 mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
931 }
932 }
933
934 public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
935 enforceCallingPermission();
936 synchronized (mStats) {
937 mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
938 }
939 }
940
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700941 @Override
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700942 public void noteNetworkInterfaceType(String iface, int networkType) {
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700943 enforceCallingPermission();
944 synchronized (mStats) {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700945 mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700946 }
947 }
948
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700949 @Override
950 public void noteNetworkStatsEnabled() {
951 enforceCallingPermission();
Adam Lesinskib3a1bad2017-05-26 11:50:40 -0700952 // During device boot, qtaguid isn't enabled until after the inital
953 // loading of battery stats. Now that they're enabled, take our initial
954 // snapshot for future delta calculation.
955 mWorker.scheduleSync("network-stats-enabled",
956 BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700957 }
958
Dianne Hackborn8ad2af72015-03-17 17:00:24 -0700959 @Override
Dianne Hackborn08c47a52015-10-15 12:38:14 -0700960 public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
Dianne Hackborn8ad2af72015-03-17 17:00:24 -0700961 enforceCallingPermission();
962 synchronized (mStats) {
Dianne Hackborn08c47a52015-10-15 12:38:14 -0700963 mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -0700964 }
965 }
966
Dianne Hackborn3accca02013-09-20 09:32:11 -0700967 public void notePackageInstalled(String pkgName, long versionCode) {
Dianne Hackborn8ad2af72015-03-17 17:00:24 -0700968 enforceCallingPermission();
969 synchronized (mStats) {
970 mStats.notePackageInstalledLocked(pkgName, versionCode);
971 }
972 }
973
974 public void notePackageUninstalled(String pkgName) {
975 enforceCallingPermission();
976 synchronized (mStats) {
977 mStats.notePackageUninstalledLocked(pkgName);
978 }
979 }
980
Adam Lesinski6771d622016-01-15 18:14:47 -0800981 @Override
Bookatzb1f04f32017-05-19 13:57:32 -0700982 public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
Adam Lesinski6771d622016-01-15 18:14:47 -0800983 enforceCallingPermission();
Adam Lesinski9f55cc72016-01-27 20:42:14 -0800984 synchronized (mStats) {
Bookatzb1f04f32017-05-19 13:57:32 -0700985 mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
Adam Lesinski9f55cc72016-01-27 20:42:14 -0800986 }
Adam Lesinski6771d622016-01-15 18:14:47 -0800987 }
988
989 @Override
Bookatz94c5a312017-07-11 16:49:17 -0700990 public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) {
Adam Lesinski6771d622016-01-15 18:14:47 -0800991 enforceCallingPermission();
Adam Lesinski9f55cc72016-01-27 20:42:14 -0800992 synchronized (mStats) {
Bookatz94c5a312017-07-11 16:49:17 -0700993 mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized);
Adam Lesinski9f55cc72016-01-27 20:42:14 -0800994 }
995 }
996
997 @Override
998 public void noteResetBleScan() {
999 enforceCallingPermission();
1000 synchronized (mStats) {
1001 mStats.noteResetBluetoothScanLocked();
1002 }
Adam Lesinski6771d622016-01-15 18:14:47 -08001003 }
1004
Adam Lesinski010bf372016-04-11 12:18:18 -07001005 @Override
Bookatz4ebc0642017-05-11 12:21:19 -07001006 public void noteBleScanResults(WorkSource ws, int numNewResults) {
Bookatz956f36bf2017-04-28 09:48:17 -07001007 enforceCallingPermission();
1008 synchronized (mStats) {
Bookatz4ebc0642017-05-11 12:21:19 -07001009 mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults);
Bookatz956f36bf2017-04-28 09:48:17 -07001010 }
1011 }
1012
1013 @Override
Adam Lesinski010bf372016-04-11 12:18:18 -07001014 public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
1015 enforceCallingPermission();
1016
1017 if (info == null || !info.isValid()) {
1018 Slog.e(TAG, "invalid wifi data given: " + info);
1019 return;
1020 }
1021
Adam Lesinski14ae39a2017-05-26 11:50:40 -07001022 mStats.updateWifiState(info);
Adam Lesinski010bf372016-04-11 12:18:18 -07001023 }
1024
1025 @Override
1026 public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
1027 enforceCallingPermission();
1028 if (info == null || !info.isValid()) {
1029 Slog.e(TAG, "invalid bluetooth data given: " + info);
1030 return;
1031 }
1032
Adam Lesinskib3a1bad2017-05-26 11:50:40 -07001033 mStats.updateBluetoothStateLocked(info);
Adam Lesinski010bf372016-04-11 12:18:18 -07001034 }
1035
1036 @Override
1037 public void noteModemControllerActivity(ModemActivityInfo info) {
1038 enforceCallingPermission();
1039
1040 if (info == null || !info.isValid()) {
1041 Slog.e(TAG, "invalid modem data given: " + info);
1042 return;
1043 }
1044
Adam Lesinski14ae39a2017-05-26 11:50:40 -07001045 mStats.updateMobileRadioState(info);
Adam Lesinski010bf372016-04-11 12:18:18 -07001046 }
1047
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001048 public boolean isOnBattery() {
1049 return mStats.isOnBattery();
1050 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07001051
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001052 @Override
1053 public void setBatteryState(final int status, final int health, final int plugType,
Adam Lesinski041d9172016-12-12 12:03:56 -08001054 final int level, final int temp, final int volt, final int chargeUAh,
1055 final int chargeFullUAh) {
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001056 enforceCallingPermission();
1057
1058 // BatteryService calls us here and we may update external state. It would be wrong
1059 // to block such a low level service like BatteryService on external stats like WiFi.
Adam Lesinskib3a1bad2017-05-26 11:50:40 -07001060 mWorker.scheduleRunnable(() -> {
1061 synchronized (mStats) {
1062 final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
1063 if (mStats.isOnBattery() == onBattery) {
1064 // The battery state has not changed, so we don't need to sync external
1065 // stats immediately.
1066 mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1067 chargeUAh, chargeFullUAh);
1068 return;
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001069 }
Adam Lesinskib3a1bad2017-05-26 11:50:40 -07001070 }
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001071
Adam Lesinskib3a1bad2017-05-26 11:50:40 -07001072 // Sync external stats first as the battery has changed states. If we don't sync
1073 // before changing the state, we may not collect the relevant data later.
1074 // Order here is guaranteed since we're scheduling from the same thread and we are
1075 // using a single threaded executor.
1076 mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
1077 mWorker.scheduleRunnable(() -> {
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001078 synchronized (mStats) {
Adam Lesinski926969b2016-04-28 17:31:12 -07001079 mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
Adam Lesinski041d9172016-12-12 12:03:56 -08001080 chargeUAh, chargeFullUAh);
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001081 }
Adam Lesinskib3a1bad2017-05-26 11:50:40 -07001082 });
Adam Lesinskid7616ef2015-07-27 11:43:05 -07001083 });
Evan Millar633a1742009-04-02 16:36:33 -07001084 }
Kweku Adams2f73ecd2017-09-27 16:59:19 -07001085
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001086 public long getAwakeTimeBattery() {
1087 mContext.enforceCallingOrSelfPermission(
1088 android.Manifest.permission.BATTERY_STATS, null);
1089 return mStats.getAwakeTimeBattery();
1090 }
1091
1092 public long getAwakeTimePlugged() {
1093 mContext.enforceCallingOrSelfPermission(
1094 android.Manifest.permission.BATTERY_STATS, null);
1095 return mStats.getAwakeTimePlugged();
1096 }
1097
1098 public void enforceCallingPermission() {
1099 if (Binder.getCallingPid() == Process.myPid()) {
1100 return;
1101 }
1102 mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
1103 Binder.getCallingPid(), Binder.getCallingUid(), null);
1104 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001105
1106 final class WakeupReasonThread extends Thread {
Adam Lesinski515702c2015-07-23 18:13:38 -07001107 private static final int MAX_REASON_SIZE = 512;
1108 private CharsetDecoder mDecoder;
1109 private ByteBuffer mUtf8Buffer;
1110 private CharBuffer mUtf16Buffer;
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001111
1112 WakeupReasonThread() {
1113 super("BatteryStats_wakeupReason");
1114 }
1115
1116 public void run() {
1117 Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1118
Adam Lesinski515702c2015-07-23 18:13:38 -07001119 mDecoder = StandardCharsets.UTF_8
1120 .newDecoder()
1121 .onMalformedInput(CodingErrorAction.REPLACE)
1122 .onUnmappableCharacter(CodingErrorAction.REPLACE)
1123 .replaceWith("?");
1124
1125 mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1126 mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1127
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001128 try {
Adam Lesinski515702c2015-07-23 18:13:38 -07001129 String reason;
1130 while ((reason = waitWakeup()) != null) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001131 synchronized (mStats) {
Adam Lesinski515702c2015-07-23 18:13:38 -07001132 mStats.noteWakeupReasonLocked(reason);
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001133 }
1134 }
1135 } catch (RuntimeException e) {
1136 Slog.e(TAG, "Failure reading wakeup reasons", e);
1137 }
1138 }
Adam Lesinski515702c2015-07-23 18:13:38 -07001139
1140 private String waitWakeup() {
1141 mUtf8Buffer.clear();
1142 mUtf16Buffer.clear();
1143 mDecoder.reset();
1144
1145 int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1146 if (bytesWritten < 0) {
1147 return null;
1148 } else if (bytesWritten == 0) {
1149 return "unknown";
1150 }
1151
1152 // Set the buffer's limit to the number of bytes written.
1153 mUtf8Buffer.limit(bytesWritten);
1154
1155 // Decode the buffer from UTF-8 to UTF-16.
1156 // Unmappable characters will be replaced.
1157 mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1158 mUtf16Buffer.flip();
1159
1160 // Create a String from the UTF-16 buffer.
1161 return mUtf16Buffer.toString();
1162 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001163 }
1164
Adam Lesinski515702c2015-07-23 18:13:38 -07001165 private static native int nativeWaitWakeup(ByteBuffer outBuffer);
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001166
Dianne Hackbornae384452011-06-28 12:33:48 -07001167 private void dumpHelp(PrintWriter pw) {
Dianne Hackborn91268cf2013-06-13 19:06:50 -07001168 pw.println("Battery stats (batterystats) dump options:");
Dianne Hackborn1e725a72015-03-24 18:23:19 -07001169 pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]");
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08001170 pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
Dianne Hackborn865b79b2015-08-18 17:33:00 -07001171 pw.println(" --checkin: generate output for a checkin report; will write (and clear) the");
1172 pw.println(" last old completed stats when they had been reset.");
Joe Onorato1476d322016-05-05 14:46:15 -07001173 pw.println(" -c: write the current stats in checkin format.");
Dianne Hackborn099bc622014-01-22 13:39:16 -08001174 pw.println(" --history: show only history data.");
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001175 pw.println(" --history-start <num>: show only history data starting at given time offset.");
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001176 pw.println(" --charged: only output data since last charged.");
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08001177 pw.println(" --daily: only output full daily data.");
Dianne Hackbornae384452011-06-28 12:33:48 -07001178 pw.println(" --reset: reset the stats, clearing all current data.");
1179 pw.println(" --write: force write current collected stats to disk.");
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08001180 pw.println(" --new-daily: immediately create and write new daily stats record.");
1181 pw.println(" --read-daily: read-load last written daily stats.");
Sudheer Shanka5c19b892018-01-05 17:25:46 -08001182 pw.println(" --settings: dump the settings key/values related to batterystats");
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07001183 pw.println(" <package.name>: optional name of package to filter output by.");
Dianne Hackbornfc064132014-06-02 12:42:12 -07001184 pw.println(" -h: print this help text.");
1185 pw.println("Battery stats (batterystats) commands:");
1186 pw.println(" enable|disable <option>");
1187 pw.println(" Enable or disable a running option. Option state is not saved across boots.");
1188 pw.println(" Options are:");
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001189 pw.println(" full-history: include additional detailed events in battery history:");
Dianne Hackborn1e383822015-04-10 14:02:33 -07001190 pw.println(" wake_lock_in, alarms and proc events");
Dianne Hackbornfc064132014-06-02 12:42:12 -07001191 pw.println(" no-auto-reset: don't automatically reset stats when unplugged");
Amith Yamasani674c9bb2017-02-01 09:45:17 -08001192 pw.println(" pretend-screen-off: pretend the screen is off, even if screen state changes");
Dianne Hackbornae384452011-06-28 12:33:48 -07001193 }
1194
Sudheer Shanka5c19b892018-01-05 17:25:46 -08001195 private void dumpSettings(PrintWriter pw) {
1196 synchronized (mStats) {
1197 mStats.dumpConstantsLocked(pw);
1198 }
1199 }
1200
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07001201 private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1202 i++;
1203 if (i >= args.length) {
1204 pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1205 dumpHelp(pw);
1206 return -1;
1207 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001208 if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07001209 synchronized (mStats) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001210 mStats.setRecordAllHistoryLocked(enable);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07001211 }
Dianne Hackborn9a755432014-05-15 17:05:22 -07001212 } else if ("no-auto-reset".equals(args[i])) {
1213 synchronized (mStats) {
1214 mStats.setNoAutoReset(enable);
1215 }
Amith Yamasani674c9bb2017-02-01 09:45:17 -08001216 } else if ("pretend-screen-off".equals(args[i])) {
1217 synchronized (mStats) {
1218 mStats.setPretendScreenOff(enable);
1219 }
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07001220 } else {
1221 pw.println("Unknown enable/disable option: " + args[i]);
1222 dumpHelp(pw);
1223 return -1;
1224 }
1225 return i;
1226 }
1227
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07001228
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001229 @Override
1230 protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
Jeff Sharkey6df866a2017-03-31 14:08:23 -06001231 if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
Kenny Root3abd75b2011-09-29 11:00:41 -07001232
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001233 int flags = 0;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001234 boolean useCheckinFormat = false;
Kweku Adams2f73ecd2017-09-27 16:59:19 -07001235 boolean toProto = false;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001236 boolean isRealCheckin = false;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07001237 boolean noOutput = false;
Dianne Hackborn16b0b562014-06-03 17:24:42 -07001238 boolean writeData = false;
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001239 long historyStart = -1;
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07001240 int reqUid = -1;
Dianne Hackborne4a59512010-12-07 11:08:07 -08001241 if (args != null) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001242 for (int i=0; i<args.length; i++) {
1243 String arg = args[i];
Dianne Hackborne4a59512010-12-07 11:08:07 -08001244 if ("--checkin".equals(arg)) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001245 useCheckinFormat = true;
1246 isRealCheckin = true;
Dianne Hackborn099bc622014-01-22 13:39:16 -08001247 } else if ("--history".equals(arg)) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001248 flags |= BatteryStats.DUMP_HISTORY_ONLY;
1249 } else if ("--history-start".equals(arg)) {
1250 flags |= BatteryStats.DUMP_HISTORY_ONLY;
1251 i++;
1252 if (i >= args.length) {
1253 pw.println("Missing time argument for --history-since");
1254 dumpHelp(pw);
1255 return;
1256 }
1257 historyStart = Long.parseLong(args[i]);
Dianne Hackborn16b0b562014-06-03 17:24:42 -07001258 writeData = true;
Dianne Hackborn49021f52013-09-04 18:03:40 -07001259 } else if ("-c".equals(arg)) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001260 useCheckinFormat = true;
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001261 flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
Kweku Adams2f73ecd2017-09-27 16:59:19 -07001262 } else if ("--proto".equals(arg)) {
1263 toProto = true;
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001264 } else if ("--charged".equals(arg)) {
1265 flags |= BatteryStats.DUMP_CHARGED_ONLY;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08001266 } else if ("--daily".equals(arg)) {
1267 flags |= BatteryStats.DUMP_DAILY_ONLY;
Dianne Hackborne4a59512010-12-07 11:08:07 -08001268 } else if ("--reset".equals(arg)) {
1269 synchronized (mStats) {
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001270 mStats.resetAllStatsCmdLocked();
Dianne Hackborne4a59512010-12-07 11:08:07 -08001271 pw.println("Battery stats reset.");
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07001272 noOutput = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001273 }
Adam Lesinskib3a1bad2017-05-26 11:50:40 -07001274 mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07001275 } else if ("--write".equals(arg)) {
Sudheer Shankab2f83c12017-11-13 19:25:01 -08001276 syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07001277 synchronized (mStats) {
1278 mStats.writeSyncLocked();
1279 pw.println("Battery stats written.");
1280 noOutput = true;
1281 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08001282 } else if ("--new-daily".equals(arg)) {
1283 synchronized (mStats) {
1284 mStats.recordDailyStatsLocked();
1285 pw.println("New daily stats written.");
1286 noOutput = true;
1287 }
1288 } else if ("--read-daily".equals(arg)) {
1289 synchronized (mStats) {
1290 mStats.readDailyStatsLocked();
1291 pw.println("Last daily stats read.");
1292 noOutput = true;
1293 }
Dianne Hackbornfc064132014-06-02 12:42:12 -07001294 } else if ("--enable".equals(arg) || "enable".equals(arg)) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07001295 i = doEnableOrDisable(pw, i, args, true);
1296 if (i < 0) {
1297 return;
1298 }
1299 pw.println("Enabled: " + args[i]);
1300 return;
Dianne Hackbornfc064132014-06-02 12:42:12 -07001301 } else if ("--disable".equals(arg) || "disable".equals(arg)) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07001302 i = doEnableOrDisable(pw, i, args, false);
1303 if (i < 0) {
1304 return;
1305 }
1306 pw.println("Disabled: " + args[i]);
1307 return;
Dianne Hackbornae384452011-06-28 12:33:48 -07001308 } else if ("-h".equals(arg)) {
1309 dumpHelp(pw);
1310 return;
Sudheer Shanka5c19b892018-01-05 17:25:46 -08001311 } else if ("--settings".equals(arg)) {
1312 dumpSettings(pw);
1313 return;
Mike Lockwoode8174042011-08-16 12:53:43 -07001314 } else if ("-a".equals(arg)) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07001315 flags |= BatteryStats.DUMP_VERBOSE;
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07001316 } else if (arg.length() > 0 && arg.charAt(0) == '-'){
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07001317 pw.println("Unknown option: " + arg);
Dianne Hackbornae384452011-06-28 12:33:48 -07001318 dumpHelp(pw);
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07001319 return;
1320 } else {
1321 // Not an option, last argument must be a package name.
1322 try {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07001323 reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07001324 UserHandle.getCallingUserId());
1325 } catch (PackageManager.NameNotFoundException e) {
1326 pw.println("Unknown package: " + arg);
1327 dumpHelp(pw);
1328 return;
1329 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001330 }
1331 }
Dianne Hackborne4a59512010-12-07 11:08:07 -08001332 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07001333 if (noOutput) {
1334 return;
1335 }
Dianne Hackborn13a6a9b2015-04-22 18:03:59 -07001336
1337 long ident = Binder.clearCallingIdentity();
1338 try {
1339 if (BatteryStatsHelper.checkWifiOnly(mContext)) {
1340 flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
1341 }
1342 // Fetch data from external sources and update the BatteryStatsImpl object with them.
Sudheer Shankab2f83c12017-11-13 19:25:01 -08001343 syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
Dianne Hackborn13a6a9b2015-04-22 18:03:59 -07001344 } finally {
1345 Binder.restoreCallingIdentity(ident);
Dianne Hackbornd953c532014-08-16 18:17:38 -07001346 }
Dianne Hackborn13a6a9b2015-04-22 18:03:59 -07001347
Dianne Hackbornab4a81b2014-10-09 17:59:38 -07001348 if (reqUid >= 0) {
1349 // By default, if the caller is only interested in a specific package, then
1350 // we only dump the aggregated data since charged.
Dianne Hackborn1e725a72015-03-24 18:23:19 -07001351 if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
Dianne Hackbornab4a81b2014-10-09 17:59:38 -07001352 flags |= BatteryStats.DUMP_CHARGED_ONLY;
1353 // Also if they are doing -c, we don't want history.
1354 flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1355 }
1356 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07001357
Kweku Adams2f73ecd2017-09-27 16:59:19 -07001358 if (toProto) {
1359 List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
1360 PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
1361 if (isRealCheckin) {
1362 // For a real checkin, first we want to prefer to use the last complete checkin
1363 // file if there is one.
1364 synchronized (mStats.mCheckinFile) {
1365 if (mStats.mCheckinFile.exists()) {
1366 try {
1367 byte[] raw = mStats.mCheckinFile.readFully();
1368 if (raw != null) {
1369 Parcel in = Parcel.obtain();
1370 in.unmarshall(raw, 0, raw.length);
1371 in.setDataPosition(0);
1372 BatteryStatsImpl checkinStats = new BatteryStatsImpl(
1373 null, mStats.mHandler, null, mUserManagerUserInfoProvider);
1374 checkinStats.readSummaryFromParcel(in);
1375 in.recycle();
Kweku Adams6ccebf22017-12-11 12:30:35 -08001376 checkinStats.dumpProtoLocked(mContext, fd, apps, flags);
Kweku Adams2f73ecd2017-09-27 16:59:19 -07001377 mStats.mCheckinFile.delete();
1378 return;
1379 }
1380 } catch (IOException | ParcelFormatException e) {
1381 Slog.w(TAG, "Failure reading checkin file "
1382 + mStats.mCheckinFile.getBaseFile(), e);
1383 }
1384 }
1385 }
1386 }
1387 if (DBG) Slog.d(TAG, "begin dumpProtoLocked from UID " + Binder.getCallingUid());
1388 synchronized (mStats) {
Kweku Adams6ccebf22017-12-11 12:30:35 -08001389 mStats.dumpProtoLocked(mContext, fd, apps, flags);
Kweku Adams2f73ecd2017-09-27 16:59:19 -07001390 if (writeData) {
1391 mStats.writeAsyncLocked();
1392 }
1393 }
1394 if (DBG) Slog.d(TAG, "end dumpProtoLocked");
1395 } else if (useCheckinFormat) {
Dianne Hackborn9cfba352016-03-24 17:31:28 -07001396 List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
Amith Yamasani0d1fd8d2016-10-12 14:21:51 -07001397 PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001398 if (isRealCheckin) {
1399 // For a real checkin, first we want to prefer to use the last complete checkin
1400 // file if there is one.
1401 synchronized (mStats.mCheckinFile) {
1402 if (mStats.mCheckinFile.exists()) {
1403 try {
1404 byte[] raw = mStats.mCheckinFile.readFully();
1405 if (raw != null) {
1406 Parcel in = Parcel.obtain();
1407 in.unmarshall(raw, 0, raw.length);
1408 in.setDataPosition(0);
1409 BatteryStatsImpl checkinStats = new BatteryStatsImpl(
Suprabh Shuklae6e723d2017-06-14 16:14:43 -07001410 null, mStats.mHandler, null, mUserManagerUserInfoProvider);
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001411 checkinStats.readSummaryFromParcel(in);
1412 in.recycle();
1413 checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
1414 historyStart);
1415 mStats.mCheckinFile.delete();
1416 return;
1417 }
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07001418 } catch (IOException | ParcelFormatException e) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07001419 Slog.w(TAG, "Failure reading checkin file "
1420 + mStats.mCheckinFile.getBaseFile(), e);
1421 }
1422 }
1423 }
1424 }
Joe Onorato82ba91d2017-04-27 16:18:05 -07001425 if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
Dianne Hackborne4a59512010-12-07 11:08:07 -08001426 synchronized (mStats) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001427 mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
Dianne Hackborn16b0b562014-06-03 17:24:42 -07001428 if (writeData) {
1429 mStats.writeAsyncLocked();
1430 }
Dianne Hackborne4a59512010-12-07 11:08:07 -08001431 }
Joe Onorato82ba91d2017-04-27 16:18:05 -07001432 if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
Dianne Hackborne4a59512010-12-07 11:08:07 -08001433 } else {
Joe Onorato82ba91d2017-04-27 16:18:05 -07001434 if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
Dianne Hackborne4a59512010-12-07 11:08:07 -08001435 synchronized (mStats) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001436 mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
Dianne Hackborn16b0b562014-06-03 17:24:42 -07001437 if (writeData) {
1438 mStats.writeAsyncLocked();
1439 }
Dianne Hackborne4a59512010-12-07 11:08:07 -08001440 }
Joe Onorato82ba91d2017-04-27 16:18:05 -07001441 if (DBG) Slog.d(TAG, "end dumpLocked");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001442 }
1443 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07001444
Joe Onorato713fec82016-03-04 10:34:02 -08001445 /**
Siddharth Raya1fd0572017-11-13 14:20:47 -08001446 * Gets a snapshot of cellular stats
1447 * @hide
1448 */
1449 public CellularBatteryStats getCellularBatteryStats() {
1450 synchronized (mStats) {
1451 return mStats.getCellularBatteryStats();
1452 }
1453 }
1454
1455 /**
Siddharth Rayb50a6842017-12-14 15:15:28 -08001456 * Gets a snapshot of Wifi stats
1457 * @hide
1458 */
1459 public WifiBatteryStats getWifiBatteryStats() {
1460 synchronized (mStats) {
1461 return mStats.getWifiBatteryStats();
1462 }
1463 }
1464
1465 /**
Siddharth Ray78ccaf52017-12-23 16:16:21 -08001466 * Gets a snapshot of Gps stats
1467 * @hide
1468 */
1469 public GpsBatteryStats getGpsBatteryStats() {
1470 synchronized (mStats) {
1471 return mStats.getGpsBatteryStats();
1472 }
1473 }
1474
1475 /**
Joe Onorato713fec82016-03-04 10:34:02 -08001476 * Gets a snapshot of the system health for a particular uid.
1477 */
1478 @Override
1479 public HealthStatsParceler takeUidSnapshot(int requestUid) {
1480 if (requestUid != Binder.getCallingUid()) {
1481 mContext.enforceCallingOrSelfPermission(
1482 android.Manifest.permission.BATTERY_STATS, null);
1483 }
1484 long ident = Binder.clearCallingIdentity();
1485 try {
Sudheer Shankab2f83c12017-11-13 19:25:01 -08001486 syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL);
Joe Onorato713fec82016-03-04 10:34:02 -08001487 synchronized (mStats) {
1488 return getHealthStatsForUidLocked(requestUid);
1489 }
1490 } catch (Exception ex) {
Joe Onorato82ba91d2017-04-27 16:18:05 -07001491 Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
Joe Onorato713fec82016-03-04 10:34:02 -08001492 throw ex;
1493 } finally {
1494 Binder.restoreCallingIdentity(ident);
1495 }
1496 }
1497
1498 /**
1499 * Gets a snapshot of the system health for a number of uids.
1500 */
1501 @Override
1502 public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1503 if (!onlyCaller(requestUids)) {
1504 mContext.enforceCallingOrSelfPermission(
1505 android.Manifest.permission.BATTERY_STATS, null);
1506 }
1507 long ident = Binder.clearCallingIdentity();
1508 int i=-1;
1509 try {
Sudheer Shankab2f83c12017-11-13 19:25:01 -08001510 syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL);
Joe Onorato713fec82016-03-04 10:34:02 -08001511 synchronized (mStats) {
1512 final int N = requestUids.length;
1513 final HealthStatsParceler[] results = new HealthStatsParceler[N];
1514 for (i=0; i<N; i++) {
1515 results[i] = getHealthStatsForUidLocked(requestUids[i]);
1516 }
1517 return results;
1518 }
1519 } catch (Exception ex) {
Joe Onorato82ba91d2017-04-27 16:18:05 -07001520 if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
Joe Onorato713fec82016-03-04 10:34:02 -08001521 + Arrays.toString(requestUids) + ") i=" + i, ex);
1522 throw ex;
1523 } finally {
1524 Binder.restoreCallingIdentity(ident);
1525 }
1526 }
1527
1528 /**
1529 * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1530 */
1531 private static boolean onlyCaller(int[] requestUids) {
1532 final int caller = Binder.getCallingUid();
1533 final int N = requestUids.length;
1534 for (int i=0; i<N; i++) {
1535 if (requestUids[i] != caller) {
1536 return false;
1537 }
1538 }
1539 return true;
1540 }
1541
1542 /**
1543 * Gets a HealthStatsParceler for the given uid. You should probably call
Adam Lesinski010bf372016-04-11 12:18:18 -07001544 * updateExternalStatsSync first.
Joe Onorato713fec82016-03-04 10:34:02 -08001545 */
1546 HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1547 final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1548 final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1549 final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1550 if (uid != null) {
1551 writer.writeUid(uidWriter, mStats, uid);
1552 }
1553 return new HealthStatsParceler(uidWriter);
1554 }
1555
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001556}