diff options
| -rw-r--r-- | cmds/statsd/src/stats_events.proto | 110 | ||||
| -rw-r--r-- | core/java/android/os/BatteryStats.java | 2 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/BatteryStatsImpl.java | 27 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 5 |
4 files changed, 141 insertions, 3 deletions
diff --git a/cmds/statsd/src/stats_events.proto b/cmds/statsd/src/stats_events.proto index 39621406222e..0406f11350e8 100644 --- a/cmds/statsd/src/stats_events.proto +++ b/cmds/statsd/src/stats_events.proto @@ -57,6 +57,14 @@ message StatsEvent { UidProcessStateChanged uid_process_state_changed = 27; ProcessLifeCycleStateChanged process_life_cycle_state_changed = 28; ScreenStateChanged screen_state_changed = 29; + BatteryLevelChanged battery_level_changed = 30; + ChargingStateChanged charging_state_changed = 31; + PluggedStateChanged plugged_state_changed = 32; + DeviceTemperatureReported device_temperature_reported = 33; + DeviceOnStatusChanged device_on_status_changed = 34; + WakeupAlarmOccurred wakeup_alarm_occurred = 35; + KernelWakeupReported kernel_wakeup_reported = 36; + // TODO: Reorder the numbering so that the most frequent occur events occur in the first 15. } } @@ -460,4 +468,106 @@ message DeviceIdleModeStateChanged { message ScreenBrightnessChanged { // Screen brightness level. Should be in [-1, 255] according to PowerManager.java. optional int32 level = 1; +} + +/** + * Logs battery level (percent full, from 0 to 100). + * + * Logged from: + * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java + */ +message BatteryLevelChanged { + // Battery level. Should be in [0, 100]. + optional int32 battery_level = 1; +} + +/** + * Logs change in charging status of the device. + * + * Logged from: + * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java + */ +message ChargingStateChanged { + // TODO: Link directly to BatteryManager.java's constants (via a proto). + enum State { + BATTERY_STATUS_UNKNOWN = 1; + BATTERY_STATUS_CHARGING = 2; + BATTERY_STATUS_DISCHARGING = 3; + BATTERY_STATUS_NOT_CHARGING = 4; + BATTERY_STATUS_FULL = 5; + } + optional State charging_state = 1; +} + +/** + * Logs whether the device is plugged in, and what power source it is using. + * + * Logged from: + * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java + */ +message PluggedStateChanged { + // TODO: Link directly to BatteryManager.java's constants (via a proto). + enum State { + // Note that NONE is not in BatteryManager.java's constants. + BATTERY_PLUGGED_NONE = 0; + // Power source is an AC charger. + BATTERY_PLUGGED_AC = 1; + // Power source is a USB port. + BATTERY_PLUGGED_USB = 2; + // Power source is wireless. + BATTERY_PLUGGED_WIRELESS = 4; + } + optional State plugged_state = 1; +} + +/** + * Logs the temperature of the device, in tenths of a degree Celsius. + * + * Logged from: + * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java + */ +message DeviceTemperatureReported { + // Temperature in tenths of a degree C. + optional int32 temperature = 1; +} + +// TODO: Define this more precisely. +// TODO: Log the ON state somewhere. It isn't currently logged anywhere. +/** + * Logs when the device turns off or on. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java + */ +message DeviceOnStatusChanged { + enum State { + OFF = 0; + ON = 1; + } + optional State state = 1; +} + +/** + * Logs when an app's wakeup alarm fires. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java + */ +message WakeupAlarmOccurred { + // TODO: Add attribution instead of uid? + optional int32 uid = 1; +} + +/** + * Logs kernel wakeup reasons and aborts. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java + */ +message KernelWakeupReported { + // Name of the kernel wakeup reason (or abort). + optional string wakeup_reason_name = 1; + + // Duration (in microseconds) for the wake-up interrupt to be serviced. + optional int64 duration_usec = 2; }
\ No newline at end of file diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 8682c01ebd85..a8a65e37f914 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -1986,7 +1986,7 @@ public abstract class BatteryStats implements Parcelable { public abstract long getDeviceIdlingTime(int mode, long elapsedRealtimeUs, int which); /** - * Returns the number of times that the devie has started idling. + * Returns the number of times that the device has started idling. * * {@hide} */ diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 9cc1959f296c..b8940cf9f02e 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -4055,6 +4055,7 @@ public class BatteryStatsImpl extends BatteryStats { long deltaUptime = uptimeMs - mLastWakeupUptimeMs; SamplingTimer timer = getWakeupReasonTimerLocked(mLastWakeupReason); timer.add(deltaUptime * 1000, 1); // time in in microseconds + StatsLog.write(StatsLog.KERNEL_WAKEUP_REPORTED, mLastWakeupReason, deltaUptime * 1000); mLastWakeupReason = null; } } @@ -11156,11 +11157,15 @@ public class BatteryStatsImpl extends BatteryStats { // This should probably be exposed in the API, though it's not critical public static final int BATTERY_PLUGGED_NONE = 0; - public void setBatteryStateLocked(int status, int health, int plugType, int level, - int temp, int volt, int chargeUAh, int chargeFullUAh) { + public void setBatteryStateLocked(final int status, final int health, final int plugType, + final int level, /* not final */ int temp, final int volt, final int chargeUAh, + final int chargeFullUAh) { // Temperature is encoded without the signed bit, so clamp any negative temperatures to 0. temp = Math.max(0, temp); + reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null, + status, plugType, level, temp); + final boolean onBattery = plugType == BATTERY_PLUGGED_NONE; final long uptime = mClocks.uptimeMillis(); final long elapsedRealtime = mClocks.elapsedRealtime(); @@ -11337,6 +11342,24 @@ public class BatteryStatsImpl extends BatteryStats { mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh); } + // Inform StatsLog of setBatteryState changes. + // If this is the first reporting, pass in recentPast == null. + private void reportChangesToStatsLog(HistoryItem recentPast, + final int status, final int plugType, final int level, final int temp) { + + if (recentPast == null || recentPast.batteryStatus != status) { + StatsLog.write(StatsLog.CHARGING_STATE_CHANGED, status); + } + if (recentPast == null || recentPast.batteryPlugType != plugType) { + StatsLog.write(StatsLog.PLUGGED_STATE_CHANGED, plugType); + } + if (recentPast == null || recentPast.batteryLevel != level) { + StatsLog.write(StatsLog.BATTERY_LEVEL_CHANGED, level); + } + // Let's just always print the temperature, regardless of whether it changed. + StatsLog.write(StatsLog.DEVICE_TEMPERATURE_REPORTED, temp); + } + public long getAwakeTimeBattery() { return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index eed1e6bc110e..44c5114f75ba 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -334,6 +334,7 @@ import android.text.style.SuggestionSpan; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; +import android.util.StatsLog; import android.util.TimingsTraceLog; import android.util.DebugUtils; import android.util.DisplayMetrics; @@ -12332,6 +12333,9 @@ public class ActivityManagerService extends IActivityManager.Stub + android.Manifest.permission.SHUTDOWN); } + // TODO: Where should the corresponding '1' (start) write go? + StatsLog.write(StatsLog.DEVICE_ON_STATUS_CHANGED, 0); + boolean timedout = false; synchronized(this) { @@ -13514,6 +13518,7 @@ public class ActivityManagerService extends IActivityManager.Stub stats.getPackageStatsLocked(sourceUid >= 0 ? sourceUid : uid, sourcePkg != null ? sourcePkg : rec.key.packageName); pkg.noteWakeupAlarmLocked(tag); + StatsLog.write(StatsLog.WAKEUP_ALARM_OCCURRED, sourceUid >= 0 ? sourceUid : uid); } } } |