Loading core/java/android/os/BatteryStats.java +21 −1 Original line number Diff line number Diff line Loading @@ -68,6 +68,20 @@ public abstract class BatteryStats implements Parcelable { */ public static final int WIFI_MULTICAST_ENABLED = 7; /** * A constant indicating an audio turn on timer * * {@hide} */ public static final int AUDIO_TURNED_ON = 7; /** * A constant indicating a video turn on timer * * {@hide} */ public static final int VIDEO_TURNED_ON = 8; /** * Include all of the data in the stats, including previously saved data. */ Loading Loading @@ -234,11 +248,17 @@ public abstract class BatteryStats implements Parcelable { public abstract void noteScanWifiLockReleasedLocked(); public abstract void noteWifiMulticastEnabledLocked(); public abstract void noteWifiMulticastDisabledLocked(); public abstract void noteAudioTurnedOnLocked(); public abstract void noteAudioTurnedOffLocked(); public abstract void noteVideoTurnedOnLocked(); public abstract void noteVideoTurnedOffLocked(); public abstract long getWifiTurnedOnTime(long batteryRealtime, int which); public abstract long getFullWifiLockTime(long batteryRealtime, int which); public abstract long getScanWifiLockTime(long batteryRealtime, int which); public abstract long getWifiMulticastTime(long batteryRealtime, int which); public abstract long getAudioTurnedOnTime(long batteryRealtime, int which); public abstract long getVideoTurnedOnTime(long batteryRealtime, int which); /** * Note that these must match the constants in android.os.LocalPowerManager. Loading core/java/com/android/internal/os/BatteryStatsImpl.java +127 −12 Original line number Diff line number Diff line Loading @@ -37,10 +37,8 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * All information we are collecting about things that can happen that impact Loading @@ -55,7 +53,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version private static final int VERSION = 35; private static final int VERSION = 36; private final File mFile; private final File mBackupFile; Loading Loading @@ -105,6 +103,12 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mPhoneOn; StopwatchTimer mPhoneOnTimer; boolean mAudioOn; StopwatchTimer mAudioOnTimer; boolean mVideoOn; StopwatchTimer mVideoOnTimer; int mPhoneSignalStrengthBin = -1; final StopwatchTimer[] mPhoneSignalStrengthsTimer = new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; Loading Loading @@ -320,6 +324,13 @@ public final class BatteryStatsImpl extends BatteryStats { */ long mUnpluggedTime; /** * Constructs from a parcel. * @param type * @param unpluggables * @param powerType * @param in */ Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { mType = type; Loading Loading @@ -633,7 +644,6 @@ public final class BatteryStatsImpl extends BatteryStats { */ long mAcquireTime; StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, ArrayList<Unpluggable> unpluggables, Parcel in) { super(type, unpluggables, in); Loading Loading @@ -1072,6 +1082,50 @@ public final class BatteryStatsImpl extends BatteryStats { } } public void noteAudioOnLocked(int uid) { if (!mAudioOn) { mAudioOn = true; mAudioOnTimer.startRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteAudioTurnedOnLocked(); } } public void noteAudioOffLocked(int uid) { if (mAudioOn) { mAudioOn = false; mAudioOnTimer.stopRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteAudioTurnedOffLocked(); } } public void noteVideoOnLocked(int uid) { if (!mVideoOn) { mVideoOn = true; mVideoOnTimer.startRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteVideoTurnedOnLocked(); } } public void noteVideoOffLocked(int uid) { if (mVideoOn) { mVideoOn = false; mVideoOnTimer.stopRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteVideoTurnedOffLocked(); } } public void noteWifiRunningLocked() { if (!mWifiRunning) { mWifiRunning = true; Loading Loading @@ -1230,6 +1284,12 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mWifiMulticastEnabled; StopwatchTimer mWifiMulticastTimer; boolean mAudioTurnedOn; StopwatchTimer mAudioTurnedOnTimer; boolean mVideoTurnedOn; StopwatchTimer mVideoTurnedOnTimer; Counter[] mUserActivityCounters; /** Loading Loading @@ -1259,6 +1319,8 @@ public final class BatteryStatsImpl extends BatteryStats { mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables); mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, null, mUnpluggables); mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables); mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables); } @Override Loading Loading @@ -1342,6 +1404,38 @@ public final class BatteryStatsImpl extends BatteryStats { } } @Override public void noteVideoTurnedOnLocked() { if (!mVideoTurnedOn) { mVideoTurnedOn = true; mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); } } @Override public void noteVideoTurnedOffLocked() { if (mVideoTurnedOn) { mVideoTurnedOn = false; mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); } } @Override public void noteAudioTurnedOnLocked() { if (!mAudioTurnedOn) { mAudioTurnedOn = true; mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); } } @Override public void noteAudioTurnedOffLocked() { if (mAudioTurnedOn) { mAudioTurnedOn = false; mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); } } @Override public void noteFullWifiLockReleasedLocked() { if (mFullWifiLockOut) { Loading Loading @@ -1387,6 +1481,16 @@ public final class BatteryStatsImpl extends BatteryStats { return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } @Override public long getAudioTurnedOnTime(long batteryRealtime, int which) { return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } @Override public long getVideoTurnedOnTime(long batteryRealtime, int which) { return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } @Override public long getFullWifiLockTime(long batteryRealtime, int which) { return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); Loading Loading @@ -1475,6 +1579,8 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(mTcpBytesSentAtLastUnplug); mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime); mFullWifiLockTimer.writeToParcel(out, batteryRealtime); mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); mScanWifiLockTimer.writeToParcel(out, batteryRealtime); mWifiMulticastTimer.writeToParcel(out, batteryRealtime); if (mUserActivityCounters == null) { Loading Loading @@ -1534,6 +1640,10 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in); mFullWifiLockOut = false; mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in); mAudioTurnedOn = false; mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in); mVideoTurnedOn = false; mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in); mScanWifiLockOut = false; mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in); mWifiMulticastEnabled = false; Loading Loading @@ -2764,6 +2874,10 @@ public final class BatteryStatsImpl extends BatteryStats { u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); u.mFullWifiLockOut = false; u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); u.mAudioTurnedOn = false; u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); u.mVideoTurnedOn = false; u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); u.mScanWifiLockOut = false; u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); u.mWifiMulticastEnabled = false; Loading Loading @@ -3063,6 +3177,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int ikw = 0; ikw < NKW; ikw++) { if (in.readInt() != 0) { String wakelockName = in.readString(); in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); mKernelWakelockStats.put(wakelockName, kwlt); } Loading core/java/com/android/internal/os/PowerProfile.java 0 → 100644 +185 −0 Original line number Diff line number Diff line /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import android.content.Context; import android.content.res.XmlResourceParser; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.HashMap; /** * Reports power consumption values for various device activities. Reads values from an XML file. * Customize the XML file for different devices. * [hidden] */ public class PowerProfile { /** * No power consumption, or accounted for elsewhere. */ public static final String POWER_NONE = "none"; /** * Power consumption when CPU is in power collapse mode. */ public static final String POWER_CPU_IDLE = "cpu.idle"; /** * Power consumption when CPU is running at normal speed. */ public static final String POWER_CPU_NORMAL = "cpu.normal"; /** * Power consumption when CPU is running at full speed. */ public static final String POWER_CPU_FULL = "cpu.full"; /** * Power consumption when WiFi driver is scanning for networks. */ public static final String POWER_WIFI_SCAN = "wifi.scan"; /** * Power consumption when WiFi driver is on. */ public static final String POWER_WIFI_ON = "wifi.on"; /** * Power consumption when WiFi driver is transmitting/receiving. */ public static final String POWER_WIFI_ACTIVE = "wifi.active"; /** * Power consumption when GPS is on. */ public static final String POWER_GPS_ON = "gps.on"; /** * Power consumption when Bluetooth driver is on. */ public static final String POWER_BLUETOOTH_ON = "bluetooth.on"; /** * Power consumption when Bluetooth driver is transmitting/receiving. */ public static final String POWER_BLUETOOTH_ACTIVE = "bluetooth.active"; /** * Power consumption when screen is on, not including the backlight power. */ public static final String POWER_SCREEN_ON = "screen.on"; /** * Power consumption when cell radio is on but not on a call. */ public static final String POWER_RADIO_ON = "radio.on"; /** * Power consumption when talking on the phone. */ public static final String POWER_RADIO_ACTIVE = "radio.active"; /** * Power consumption at full backlight brightness. If the backlight is at * 50% brightness, then this should be multiplied by 0.5 */ public static final String POWER_SCREEN_FULL = "screen.full"; /** * Power consumed by the audio hardware when playing back audio content. This is in addition * to the CPU power, probably due to a DSP and / or amplifier. */ public static final String POWER_AUDIO = "dsp.audio"; /** * Power consumed by any media hardware when playing back video content. This is in addition * to the CPU power, probably due to a DSP. */ public static final String POWER_VIDEO = "dsp.video"; static final HashMap<String, Double> sPowerMap = new HashMap<String, Double>(); private static final String TAG_DEVICE = "device"; private static final String TAG_ITEM = "item"; private static final String ATTR_NAME = "name"; public PowerProfile(Context context, CharSequence profile) { // Read the XML file for the given profile (normally only one per // device) if (sPowerMap.size() == 0) { readPowerValuesFromXml(context, profile); } } private void readPowerValuesFromXml(Context context, CharSequence profile) { // FIXME //int id = context.getResources().getIdentifier(profile.toString(), "xml", // "com.android.internal"); int id = com.android.internal.R.xml.power_profile_default; XmlResourceParser parser = context.getResources().getXml(id); try { XmlUtils.beginDocument(parser, TAG_DEVICE); while (true) { XmlUtils.nextElement(parser); String element = parser.getName(); if (element == null || !(element.equals(TAG_ITEM))) { break; } String name = parser.getAttributeValue(null, ATTR_NAME); if (parser.next() == XmlPullParser.TEXT) { String power = parser.getText(); double value = 0; try { value = Double.valueOf(power); } catch (NumberFormatException nfe) { } sPowerMap.put(name, value); } } } catch (XmlPullParserException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } finally { parser.close(); } } /** * Returns the average current in mA consumed by the subsystem * @param type the subsystem type * @return the average current in milliAmps. */ public double getAveragePower(String type) { if (sPowerMap.containsKey(type)) { return sPowerMap.get(type); } else { return 0; } } } core/res/res/xml/power_profile_default.xml 0 → 100644 +36 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ** ** Copyright 2009, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License") ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ --> <device name="Android"> <item name="none">0</item> <item name="screen.on">30</item> <item name="bluetooth.active">103</item> <item name="bluetooth.on">5</item> <item name="screen.full">144</item> <item name="wifi.on">23</item> <item name="wifi.active">200</item> <item name="wifi.scan">200</item> <item name="cpu.idle">1.6</item> <item name="cpu.normal">100</item> <item name="cpu.full">140</item> <item name="dsp.audio">70</item> <item name="dsp.video">100</item> <item name="radio.on">3</item> <item name="radio.active">175</item> </device> services/java/com/android/server/am/BatteryStatsService.java +28 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,34 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } } public void noteStartAudio(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteAudioOnLocked(uid); } } public void noteStopAudio(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteAudioOffLocked(uid); } } public void noteStartVideo(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteVideoOnLocked(uid); } } public void noteStopVideo(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteVideoOffLocked(uid); } } public void noteWifiRunning() { enforceCallingPermission(); synchronized (mStats) { Loading Loading
core/java/android/os/BatteryStats.java +21 −1 Original line number Diff line number Diff line Loading @@ -68,6 +68,20 @@ public abstract class BatteryStats implements Parcelable { */ public static final int WIFI_MULTICAST_ENABLED = 7; /** * A constant indicating an audio turn on timer * * {@hide} */ public static final int AUDIO_TURNED_ON = 7; /** * A constant indicating a video turn on timer * * {@hide} */ public static final int VIDEO_TURNED_ON = 8; /** * Include all of the data in the stats, including previously saved data. */ Loading Loading @@ -234,11 +248,17 @@ public abstract class BatteryStats implements Parcelable { public abstract void noteScanWifiLockReleasedLocked(); public abstract void noteWifiMulticastEnabledLocked(); public abstract void noteWifiMulticastDisabledLocked(); public abstract void noteAudioTurnedOnLocked(); public abstract void noteAudioTurnedOffLocked(); public abstract void noteVideoTurnedOnLocked(); public abstract void noteVideoTurnedOffLocked(); public abstract long getWifiTurnedOnTime(long batteryRealtime, int which); public abstract long getFullWifiLockTime(long batteryRealtime, int which); public abstract long getScanWifiLockTime(long batteryRealtime, int which); public abstract long getWifiMulticastTime(long batteryRealtime, int which); public abstract long getAudioTurnedOnTime(long batteryRealtime, int which); public abstract long getVideoTurnedOnTime(long batteryRealtime, int which); /** * Note that these must match the constants in android.os.LocalPowerManager. Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +127 −12 Original line number Diff line number Diff line Loading @@ -37,10 +37,8 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * All information we are collecting about things that can happen that impact Loading @@ -55,7 +53,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version private static final int VERSION = 35; private static final int VERSION = 36; private final File mFile; private final File mBackupFile; Loading Loading @@ -105,6 +103,12 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mPhoneOn; StopwatchTimer mPhoneOnTimer; boolean mAudioOn; StopwatchTimer mAudioOnTimer; boolean mVideoOn; StopwatchTimer mVideoOnTimer; int mPhoneSignalStrengthBin = -1; final StopwatchTimer[] mPhoneSignalStrengthsTimer = new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; Loading Loading @@ -320,6 +324,13 @@ public final class BatteryStatsImpl extends BatteryStats { */ long mUnpluggedTime; /** * Constructs from a parcel. * @param type * @param unpluggables * @param powerType * @param in */ Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { mType = type; Loading Loading @@ -633,7 +644,6 @@ public final class BatteryStatsImpl extends BatteryStats { */ long mAcquireTime; StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, ArrayList<Unpluggable> unpluggables, Parcel in) { super(type, unpluggables, in); Loading Loading @@ -1072,6 +1082,50 @@ public final class BatteryStatsImpl extends BatteryStats { } } public void noteAudioOnLocked(int uid) { if (!mAudioOn) { mAudioOn = true; mAudioOnTimer.startRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteAudioTurnedOnLocked(); } } public void noteAudioOffLocked(int uid) { if (mAudioOn) { mAudioOn = false; mAudioOnTimer.stopRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteAudioTurnedOffLocked(); } } public void noteVideoOnLocked(int uid) { if (!mVideoOn) { mVideoOn = true; mVideoOnTimer.startRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteVideoTurnedOnLocked(); } } public void noteVideoOffLocked(int uid) { if (mVideoOn) { mVideoOn = false; mVideoOnTimer.stopRunningLocked(this); } Uid u = mUidStats.get(uid); if (u != null) { u.noteVideoTurnedOffLocked(); } } public void noteWifiRunningLocked() { if (!mWifiRunning) { mWifiRunning = true; Loading Loading @@ -1230,6 +1284,12 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mWifiMulticastEnabled; StopwatchTimer mWifiMulticastTimer; boolean mAudioTurnedOn; StopwatchTimer mAudioTurnedOnTimer; boolean mVideoTurnedOn; StopwatchTimer mVideoTurnedOnTimer; Counter[] mUserActivityCounters; /** Loading Loading @@ -1259,6 +1319,8 @@ public final class BatteryStatsImpl extends BatteryStats { mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables); mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, null, mUnpluggables); mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables); mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables); } @Override Loading Loading @@ -1342,6 +1404,38 @@ public final class BatteryStatsImpl extends BatteryStats { } } @Override public void noteVideoTurnedOnLocked() { if (!mVideoTurnedOn) { mVideoTurnedOn = true; mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); } } @Override public void noteVideoTurnedOffLocked() { if (mVideoTurnedOn) { mVideoTurnedOn = false; mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); } } @Override public void noteAudioTurnedOnLocked() { if (!mAudioTurnedOn) { mAudioTurnedOn = true; mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); } } @Override public void noteAudioTurnedOffLocked() { if (mAudioTurnedOn) { mAudioTurnedOn = false; mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); } } @Override public void noteFullWifiLockReleasedLocked() { if (mFullWifiLockOut) { Loading Loading @@ -1387,6 +1481,16 @@ public final class BatteryStatsImpl extends BatteryStats { return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } @Override public long getAudioTurnedOnTime(long batteryRealtime, int which) { return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } @Override public long getVideoTurnedOnTime(long batteryRealtime, int which) { return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } @Override public long getFullWifiLockTime(long batteryRealtime, int which) { return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); Loading Loading @@ -1475,6 +1579,8 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(mTcpBytesSentAtLastUnplug); mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime); mFullWifiLockTimer.writeToParcel(out, batteryRealtime); mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); mScanWifiLockTimer.writeToParcel(out, batteryRealtime); mWifiMulticastTimer.writeToParcel(out, batteryRealtime); if (mUserActivityCounters == null) { Loading Loading @@ -1534,6 +1640,10 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in); mFullWifiLockOut = false; mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in); mAudioTurnedOn = false; mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in); mVideoTurnedOn = false; mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in); mScanWifiLockOut = false; mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in); mWifiMulticastEnabled = false; Loading Loading @@ -2764,6 +2874,10 @@ public final class BatteryStatsImpl extends BatteryStats { u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); u.mFullWifiLockOut = false; u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); u.mAudioTurnedOn = false; u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); u.mVideoTurnedOn = false; u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); u.mScanWifiLockOut = false; u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); u.mWifiMulticastEnabled = false; Loading Loading @@ -3063,6 +3177,7 @@ public final class BatteryStatsImpl extends BatteryStats { for (int ikw = 0; ikw < NKW; ikw++) { if (in.readInt() != 0) { String wakelockName = in.readString(); in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); mKernelWakelockStats.put(wakelockName, kwlt); } Loading
core/java/com/android/internal/os/PowerProfile.java 0 → 100644 +185 −0 Original line number Diff line number Diff line /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import android.content.Context; import android.content.res.XmlResourceParser; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.HashMap; /** * Reports power consumption values for various device activities. Reads values from an XML file. * Customize the XML file for different devices. * [hidden] */ public class PowerProfile { /** * No power consumption, or accounted for elsewhere. */ public static final String POWER_NONE = "none"; /** * Power consumption when CPU is in power collapse mode. */ public static final String POWER_CPU_IDLE = "cpu.idle"; /** * Power consumption when CPU is running at normal speed. */ public static final String POWER_CPU_NORMAL = "cpu.normal"; /** * Power consumption when CPU is running at full speed. */ public static final String POWER_CPU_FULL = "cpu.full"; /** * Power consumption when WiFi driver is scanning for networks. */ public static final String POWER_WIFI_SCAN = "wifi.scan"; /** * Power consumption when WiFi driver is on. */ public static final String POWER_WIFI_ON = "wifi.on"; /** * Power consumption when WiFi driver is transmitting/receiving. */ public static final String POWER_WIFI_ACTIVE = "wifi.active"; /** * Power consumption when GPS is on. */ public static final String POWER_GPS_ON = "gps.on"; /** * Power consumption when Bluetooth driver is on. */ public static final String POWER_BLUETOOTH_ON = "bluetooth.on"; /** * Power consumption when Bluetooth driver is transmitting/receiving. */ public static final String POWER_BLUETOOTH_ACTIVE = "bluetooth.active"; /** * Power consumption when screen is on, not including the backlight power. */ public static final String POWER_SCREEN_ON = "screen.on"; /** * Power consumption when cell radio is on but not on a call. */ public static final String POWER_RADIO_ON = "radio.on"; /** * Power consumption when talking on the phone. */ public static final String POWER_RADIO_ACTIVE = "radio.active"; /** * Power consumption at full backlight brightness. If the backlight is at * 50% brightness, then this should be multiplied by 0.5 */ public static final String POWER_SCREEN_FULL = "screen.full"; /** * Power consumed by the audio hardware when playing back audio content. This is in addition * to the CPU power, probably due to a DSP and / or amplifier. */ public static final String POWER_AUDIO = "dsp.audio"; /** * Power consumed by any media hardware when playing back video content. This is in addition * to the CPU power, probably due to a DSP. */ public static final String POWER_VIDEO = "dsp.video"; static final HashMap<String, Double> sPowerMap = new HashMap<String, Double>(); private static final String TAG_DEVICE = "device"; private static final String TAG_ITEM = "item"; private static final String ATTR_NAME = "name"; public PowerProfile(Context context, CharSequence profile) { // Read the XML file for the given profile (normally only one per // device) if (sPowerMap.size() == 0) { readPowerValuesFromXml(context, profile); } } private void readPowerValuesFromXml(Context context, CharSequence profile) { // FIXME //int id = context.getResources().getIdentifier(profile.toString(), "xml", // "com.android.internal"); int id = com.android.internal.R.xml.power_profile_default; XmlResourceParser parser = context.getResources().getXml(id); try { XmlUtils.beginDocument(parser, TAG_DEVICE); while (true) { XmlUtils.nextElement(parser); String element = parser.getName(); if (element == null || !(element.equals(TAG_ITEM))) { break; } String name = parser.getAttributeValue(null, ATTR_NAME); if (parser.next() == XmlPullParser.TEXT) { String power = parser.getText(); double value = 0; try { value = Double.valueOf(power); } catch (NumberFormatException nfe) { } sPowerMap.put(name, value); } } } catch (XmlPullParserException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } finally { parser.close(); } } /** * Returns the average current in mA consumed by the subsystem * @param type the subsystem type * @return the average current in milliAmps. */ public double getAveragePower(String type) { if (sPowerMap.containsKey(type)) { return sPowerMap.get(type); } else { return 0; } } }
core/res/res/xml/power_profile_default.xml 0 → 100644 +36 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ** ** Copyright 2009, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License") ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ --> <device name="Android"> <item name="none">0</item> <item name="screen.on">30</item> <item name="bluetooth.active">103</item> <item name="bluetooth.on">5</item> <item name="screen.full">144</item> <item name="wifi.on">23</item> <item name="wifi.active">200</item> <item name="wifi.scan">200</item> <item name="cpu.idle">1.6</item> <item name="cpu.normal">100</item> <item name="cpu.full">140</item> <item name="dsp.audio">70</item> <item name="dsp.video">100</item> <item name="radio.on">3</item> <item name="radio.active">175</item> </device>
services/java/com/android/server/am/BatteryStatsService.java +28 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,34 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } } public void noteStartAudio(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteAudioOnLocked(uid); } } public void noteStopAudio(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteAudioOffLocked(uid); } } public void noteStartVideo(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteVideoOnLocked(uid); } } public void noteStopVideo(int uid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteVideoOffLocked(uid); } } public void noteWifiRunning() { enforceCallingPermission(); synchronized (mStats) { Loading