Merge "Revert "Temporarily additional stats into battery dumpsys"" into sc-dev
This commit is contained in:
@@ -41,7 +41,6 @@ import android.net.NetworkStats;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.BatteryManager;
|
import android.os.BatteryManager;
|
||||||
import android.os.BatteryProperty;
|
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -58,7 +57,6 @@ import android.os.Process;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.SystemProperties;
|
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.WorkSource;
|
import android.os.WorkSource;
|
||||||
import android.os.WorkSource.WorkChain;
|
import android.os.WorkSource.WorkChain;
|
||||||
@@ -150,14 +148,6 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
public class BatteryStatsImpl extends BatteryStats {
|
public class BatteryStatsImpl extends BatteryStats {
|
||||||
private static final String TAG = "BatteryStatsImpl";
|
private static final String TAG = "BatteryStatsImpl";
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
// TODO(b/169376495): STOPSHIP if true
|
|
||||||
private static final boolean DEBUG_FOREGROUND_STATS = true;
|
|
||||||
|
|
||||||
private static final boolean ENABLE_FOREGROUND_STATS_COLLECTION =
|
|
||||||
DEBUG_FOREGROUND_STATS && SystemProperties.getBoolean(
|
|
||||||
"debug.battery_foreground_stats_collection", false);
|
|
||||||
|
|
||||||
public static final boolean DEBUG_ENERGY = false;
|
public static final boolean DEBUG_ENERGY = false;
|
||||||
private static final boolean DEBUG_ENERGY_CPU = DEBUG_ENERGY;
|
private static final boolean DEBUG_ENERGY_CPU = DEBUG_ENERGY;
|
||||||
private static final boolean DEBUG_BINDER_STATS = false;
|
private static final boolean DEBUG_BINDER_STATS = false;
|
||||||
@@ -752,37 +742,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
long mTrackRunningHistoryElapsedRealtimeMs = 0;
|
long mTrackRunningHistoryElapsedRealtimeMs = 0;
|
||||||
long mTrackRunningHistoryUptimeMs = 0;
|
long mTrackRunningHistoryUptimeMs = 0;
|
||||||
|
|
||||||
private static final int FOREGROUND_UID_INITIAL_CAPACITY = 10;
|
|
||||||
private static final int INVALID_UID = -1;
|
|
||||||
|
|
||||||
private final IntArray mForegroundUids = ENABLE_FOREGROUND_STATS_COLLECTION
|
|
||||||
? new IntArray(FOREGROUND_UID_INITIAL_CAPACITY) : null;
|
|
||||||
|
|
||||||
// Last recorded battery energy capacity.
|
|
||||||
// This is used for computing foregrund power per application.
|
|
||||||
// See: PowerForUid below
|
|
||||||
private long mLastBatteryEnergyCapacityNwh = 0;
|
|
||||||
|
|
||||||
private static final class PowerForUid {
|
|
||||||
public long energyNwh = 0;
|
|
||||||
// Same as energyNwh, but not tracked for the first 2 minutes;
|
|
||||||
public long filteredEnergyNwh = 0;
|
|
||||||
public double totalHours = 0;
|
|
||||||
public long baseTimeMs = 0;
|
|
||||||
|
|
||||||
double computePower() {
|
|
||||||
// units in nW
|
|
||||||
return totalHours != 0 ? energyNwh / totalHours : -1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
double computeFilteredPower() {
|
|
||||||
// units in nW
|
|
||||||
return totalHours != 0 ? filteredEnergyNwh / totalHours : -1.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private final HashMap<Integer, PowerForUid> mUidToPower = ENABLE_FOREGROUND_STATS_COLLECTION
|
|
||||||
? new HashMap<>() : null;
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
final BatteryStatsHistory mBatteryStatsHistory;
|
final BatteryStatsHistory mBatteryStatsHistory;
|
||||||
|
|
||||||
@@ -1094,7 +1053,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
private int mNumConnectivityChange;
|
private int mNumConnectivityChange;
|
||||||
|
|
||||||
private int mBatteryVoltageMv = -1;
|
private int mBatteryVoltageMv = -1;
|
||||||
private int mBatteryChargeUah = -1;
|
|
||||||
private int mEstimatedBatteryCapacityMah = -1;
|
private int mEstimatedBatteryCapacityMah = -1;
|
||||||
|
|
||||||
private int mMinLearnedBatteryCapacityUah = -1;
|
private int mMinLearnedBatteryCapacityUah = -1;
|
||||||
@@ -4020,49 +3978,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
// TODO(b/155216561): It is possible for isolated uids to be in a higher
|
// TODO(b/155216561): It is possible for isolated uids to be in a higher
|
||||||
// state than its parent uid. We should track the highest state within the union of host
|
// state than its parent uid. We should track the highest state within the union of host
|
||||||
// and isolated uids rather than only the parent uid.
|
// and isolated uids rather than only the parent uid.
|
||||||
|
|
||||||
|
|
||||||
int uidState = mapToInternalProcessState(state);
|
|
||||||
|
|
||||||
boolean isForeground = (uidState == Uid.PROCESS_STATE_TOP)
|
|
||||||
|| (uidState == Uid.PROCESS_STATE_FOREGROUND);
|
|
||||||
|
|
||||||
|
|
||||||
if (ENABLE_FOREGROUND_STATS_COLLECTION) {
|
|
||||||
boolean previouslyInForegrond = false;
|
|
||||||
for (int i = 0; i < mForegroundUids.size(); i++) {
|
|
||||||
if (mForegroundUids.get(i) == uid) {
|
|
||||||
previouslyInForegrond = true;
|
|
||||||
if (!isForeground) {
|
|
||||||
// If we were previously in the foreground, remove the uid
|
|
||||||
// from the foreground set and dirty the slot.
|
|
||||||
mForegroundUids.set(i, INVALID_UID);
|
|
||||||
final PowerForUid pfu =
|
|
||||||
mUidToPower.computeIfAbsent(uid, unused -> new PowerForUid());
|
|
||||||
pfu.baseTimeMs = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!previouslyInForegrond && isForeground) {
|
|
||||||
boolean addedToForeground = false;
|
|
||||||
// Check if we have a free slot to clobber...
|
|
||||||
for (int i = 0; i < mForegroundUids.size(); i++) {
|
|
||||||
if (mForegroundUids.get(i) == INVALID_UID) {
|
|
||||||
addedToForeground = true;
|
|
||||||
mForegroundUids.set(i, uid);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...if not, append to the end of the array.
|
|
||||||
if (!addedToForeground) {
|
|
||||||
mForegroundUids.add(uid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FrameworkStatsLog.write(FrameworkStatsLog.UID_PROCESS_STATE_CHANGED, uid,
|
FrameworkStatsLog.write(FrameworkStatsLog.UID_PROCESS_STATE_CHANGED, uid,
|
||||||
ActivityManager.processStateAmToProto(state));
|
ActivityManager.processStateAmToProto(state));
|
||||||
getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
|
getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
|
||||||
@@ -13547,7 +13462,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
doWrite = true;
|
doWrite = true;
|
||||||
resetAllStatsLocked(mSecUptime, mSecRealtime);
|
resetAllStatsLocked(mSecUptime, mSecRealtime);
|
||||||
if (chargeUah > 0 && level > 0) {
|
if (chargeUah > 0 && level > 0) {
|
||||||
mBatteryChargeUah = chargeUah;
|
|
||||||
// Only use the reported coulomb charge value if it is supported and reported.
|
// Only use the reported coulomb charge value if it is supported and reported.
|
||||||
mEstimatedBatteryCapacityMah = (int) ((chargeUah / 1000) / (level / 100.0));
|
mEstimatedBatteryCapacityMah = (int) ((chargeUah / 1000) / (level / 100.0));
|
||||||
}
|
}
|
||||||
@@ -13720,48 +13634,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
startRecordingHistory(elapsedRealtimeMs, uptimeMs, true);
|
startRecordingHistory(elapsedRealtimeMs, uptimeMs, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mBatteryVoltageMv = voltageMv;
|
mBatteryVoltageMv = voltageMv;
|
||||||
|
|
||||||
if (ENABLE_FOREGROUND_STATS_COLLECTION) {
|
|
||||||
if (onBattery) {
|
|
||||||
final long energyNwh = (voltageMv * (long) chargeUah);
|
|
||||||
final long energyDelta = mLastBatteryEnergyCapacityNwh - energyNwh;
|
|
||||||
for (int i = 0; i < mForegroundUids.size(); i++) {
|
|
||||||
final int uid = mForegroundUids.get(i);
|
|
||||||
if (uid == INVALID_UID) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final PowerForUid pfu = mUidToPower
|
|
||||||
.computeIfAbsent(uid, unused -> new PowerForUid());
|
|
||||||
if (pfu.baseTimeMs <= 0) {
|
|
||||||
pfu.baseTimeMs = currentTimeMs;
|
|
||||||
} else {
|
|
||||||
// Check if mLastBatteryEnergyCapacityNwh > energyNwh,
|
|
||||||
// to make sure we only count discharges
|
|
||||||
if (energyDelta > 0) {
|
|
||||||
pfu.energyNwh += energyDelta;
|
|
||||||
// Convert from milliseconds to hours
|
|
||||||
// 1000 ms per second * 3600 seconds per hour
|
|
||||||
pfu.totalHours += ((double) (currentTimeMs - pfu.baseTimeMs)
|
|
||||||
/ (1.0 * 1000 * 60 * 60));
|
|
||||||
// Now convert from 2 minutes to hours
|
|
||||||
// 2 minutes = 1/30 of an hour
|
|
||||||
if (pfu.totalHours > (2.0 / 60)) {
|
|
||||||
pfu.filteredEnergyNwh += energyDelta;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
pfu.baseTimeMs = currentTimeMs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mLastBatteryEnergyCapacityNwh = energyNwh;
|
|
||||||
} else if (onBattery != mOnBattery) {
|
|
||||||
// Transition to onBattery = false
|
|
||||||
mUidToPower.values().forEach(v -> v.baseTimeMs = 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mCurrentBatteryLevel = level;
|
mCurrentBatteryLevel = level;
|
||||||
if (mDischargePlugLevel < 0) {
|
if (mDischargePlugLevel < 0) {
|
||||||
mDischargePlugLevel = level;
|
mDischargePlugLevel = level;
|
||||||
@@ -16679,48 +16552,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void dumpLocked(Context context, PrintWriter pw, int flags, int reqUid, long histStart) {
|
public void dumpLocked(Context context, PrintWriter pw, int flags, int reqUid, long histStart) {
|
||||||
if (ENABLE_FOREGROUND_STATS_COLLECTION) {
|
|
||||||
long actualChargeUah = -1;
|
|
||||||
long actualEnergyNwh = -1;
|
|
||||||
try {
|
|
||||||
IBatteryPropertiesRegistrar registrar =
|
|
||||||
IBatteryPropertiesRegistrar.Stub.asInterface(
|
|
||||||
ServiceManager.getService("batteryproperties"));
|
|
||||||
if (registrar != null) {
|
|
||||||
BatteryProperty prop = new BatteryProperty();
|
|
||||||
if (registrar.getProperty(
|
|
||||||
BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER, prop) == 0) {
|
|
||||||
actualChargeUah = prop.getLong();
|
|
||||||
}
|
|
||||||
prop = new BatteryProperty();
|
|
||||||
if (registrar.getProperty(
|
|
||||||
BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER, prop) == 0) {
|
|
||||||
actualEnergyNwh = prop.getLong();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
// Ignore.
|
|
||||||
}
|
|
||||||
pw.printf("ActualCharge (uAh): %d\n", (int) actualChargeUah);
|
|
||||||
pw.printf("ActualEnergy (nWh): %d\n", actualEnergyNwh);
|
|
||||||
pw.printf("mBatteryCharge (uAh): %d\n", mBatteryChargeUah);
|
|
||||||
pw.printf("mBatteryVolts (mV): %d\n", mBatteryVoltageMv);
|
|
||||||
pw.printf("est energy (nWh): %d\n", mBatteryVoltageMv * (long) mBatteryChargeUah);
|
|
||||||
pw.printf("mEstimatedBatteryCapacity (mAh): %d\n", mEstimatedBatteryCapacityMah);
|
|
||||||
pw.printf("mMinLearnedBatteryCapacity (uAh): %d\n", mMinLearnedBatteryCapacityUah);
|
|
||||||
pw.printf("mMaxLearnedBatteryCapacity (uAh): %d\n", mMaxLearnedBatteryCapacityUah);
|
|
||||||
pw.printf("est. capacity: %f\n",
|
|
||||||
(float) actualChargeUah / (mEstimatedBatteryCapacityMah * 1000));
|
|
||||||
pw.printf("mCurrentBatteryLevel: %d\n", mCurrentBatteryLevel);
|
|
||||||
pw.println("Total Power per app:");
|
|
||||||
mUidToPower.entrySet().forEach(e ->
|
|
||||||
pw.printf("Uid: %d, Total watts (nW): %f\n",
|
|
||||||
e.getKey(), e.getValue().computePower()));
|
|
||||||
pw.println("Total Power per app after first 2 minutes initial launch:");
|
|
||||||
mUidToPower.entrySet().forEach(e ->
|
|
||||||
pw.printf("Uid: %d, Total watts (nW): %f\n",
|
|
||||||
e.getKey(), e.getValue().computeFilteredPower()));
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
pw.println("mOnBatteryTimeBase:");
|
pw.println("mOnBatteryTimeBase:");
|
||||||
mOnBatteryTimeBase.dump(pw, " ");
|
mOnBatteryTimeBase.dump(pw, " ");
|
||||||
|
|||||||
Reference in New Issue
Block a user