Merge "Fix boot time BatteryStats reset failure" into sc-dev am: ebf77ebc51 am: bea4bac02c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15128655 Change-Id: I2d5f02809e76c8f9381917ed307de46a3a3ba029
This commit is contained in:
@@ -191,6 +191,11 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public static final int WAKE_LOCK_WEIGHT = 50;
|
public static final int WAKE_LOCK_WEIGHT = 50;
|
||||||
|
|
||||||
|
public static final int RESET_REASON_CORRUPT_FILE = 1;
|
||||||
|
public static final int RESET_REASON_ADB_COMMAND = 2;
|
||||||
|
public static final int RESET_REASON_FULL_CHARGE = 3;
|
||||||
|
public static final int RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE = 4;
|
||||||
|
|
||||||
protected Clocks mClocks;
|
protected Clocks mClocks;
|
||||||
|
|
||||||
private final AtomicFile mStatsFile;
|
private final AtomicFile mStatsFile;
|
||||||
@@ -348,8 +353,9 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback invoked immediately prior to resetting battery stats.
|
* Callback invoked immediately prior to resetting battery stats.
|
||||||
|
* @param resetReason One of the RESET_REASON_* constants.
|
||||||
*/
|
*/
|
||||||
void prepareForBatteryStatsReset();
|
void prepareForBatteryStatsReset(int resetReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BatteryResetListener mBatteryResetListener;
|
private BatteryResetListener mBatteryResetListener;
|
||||||
@@ -747,6 +753,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
// CPU update, even if we aren't currently running wake locks.
|
// CPU update, even if we aren't currently running wake locks.
|
||||||
boolean mDistributeWakelockCpu;
|
boolean mDistributeWakelockCpu;
|
||||||
|
|
||||||
|
private boolean mSystemReady;
|
||||||
boolean mShuttingDown;
|
boolean mShuttingDown;
|
||||||
|
|
||||||
final HistoryEventTracker mActiveEvents = new HistoryEventTracker();
|
final HistoryEventTracker mActiveEvents = new HistoryEventTracker();
|
||||||
@@ -11210,7 +11217,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
long uptimeUs = mSecUptime * 1000;
|
long uptimeUs = mSecUptime * 1000;
|
||||||
long mSecRealtime = mClocks.elapsedRealtime();
|
long mSecRealtime = mClocks.elapsedRealtime();
|
||||||
long realtimeUs = mSecRealtime * 1000;
|
long realtimeUs = mSecRealtime * 1000;
|
||||||
resetAllStatsLocked(mSecUptime, mSecRealtime);
|
resetAllStatsLocked(mSecUptime, mSecRealtime, RESET_REASON_ADB_COMMAND);
|
||||||
mDischargeStartLevel = mHistoryCur.batteryLevel;
|
mDischargeStartLevel = mHistoryCur.batteryLevel;
|
||||||
pullPendingStateUpdatesLocked();
|
pullPendingStateUpdatesLocked();
|
||||||
addHistoryRecordLocked(mSecRealtime, mSecUptime);
|
addHistoryRecordLocked(mSecRealtime, mSecUptime);
|
||||||
@@ -11239,9 +11246,10 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
initActiveHistoryEventsLocked(mSecRealtime, mSecUptime);
|
initActiveHistoryEventsLocked(mSecRealtime, mSecUptime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetAllStatsLocked(long uptimeMillis, long elapsedRealtimeMillis) {
|
private void resetAllStatsLocked(long uptimeMillis, long elapsedRealtimeMillis,
|
||||||
|
int resetReason) {
|
||||||
if (mBatteryResetListener != null) {
|
if (mBatteryResetListener != null) {
|
||||||
mBatteryResetListener.prepareForBatteryStatsReset();
|
mBatteryResetListener.prepareForBatteryStatsReset(resetReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
final long uptimeUs = uptimeMillis * 1000;
|
final long uptimeUs = uptimeMillis * 1000;
|
||||||
@@ -13477,6 +13485,13 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies BatteryStatsImpl that the system server is ready.
|
||||||
|
*/
|
||||||
|
public void onSystemReady() {
|
||||||
|
mSystemReady = true;
|
||||||
|
}
|
||||||
|
|
||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
protected void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime,
|
protected void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime,
|
||||||
final boolean onBattery, final int oldStatus, final int level, final int chargeUah) {
|
final boolean onBattery, final int oldStatus, final int level, final int chargeUah) {
|
||||||
@@ -13493,10 +13508,17 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
// battery was last full, or the level is at 100, or
|
// battery was last full, or the level is at 100, or
|
||||||
// we have gone through a significant charge (from a very low
|
// we have gone through a significant charge (from a very low
|
||||||
// level to a now very high level).
|
// level to a now very high level).
|
||||||
|
// Also, we will reset the stats if battery got partially charged
|
||||||
|
// and discharged repeatedly without ever reaching the full charge.
|
||||||
|
// This reset is done in order to prevent stats sessions from going on forever.
|
||||||
|
// Exceedingly long battery sessions would lead to an overflow of
|
||||||
|
// data structures such as mWakeupReasonStats.
|
||||||
boolean reset = false;
|
boolean reset = false;
|
||||||
if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL
|
if (!mNoAutoReset && mSystemReady
|
||||||
|
&& (oldStatus == BatteryManager.BATTERY_STATUS_FULL
|
||||||
|| level >= 90
|
|| level >= 90
|
||||||
|| (mDischargeCurrentLevel < 20 && level >= 80))) {
|
|| (mDischargeCurrentLevel < 20 && level >= 80)
|
||||||
|
|| getHighDischargeAmountSinceCharge() >= 200)) {
|
||||||
Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
|
Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
|
||||||
+ " dischargeLevel=" + mDischargeCurrentLevel
|
+ " dischargeLevel=" + mDischargeCurrentLevel
|
||||||
+ " lowAmount=" + getLowDischargeAmountSinceCharge()
|
+ " lowAmount=" + getLowDischargeAmountSinceCharge()
|
||||||
@@ -13534,7 +13556,7 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
doWrite = true;
|
doWrite = true;
|
||||||
resetAllStatsLocked(mSecUptime, mSecRealtime);
|
resetAllStatsLocked(mSecUptime, mSecRealtime, RESET_REASON_FULL_CHARGE);
|
||||||
if (chargeUah > 0 && level > 0) {
|
if (chargeUah > 0 && level > 0) {
|
||||||
// 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));
|
||||||
@@ -14502,7 +14524,8 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
? null : new MeasuredEnergyStats(supportedStandardBuckets, customBucketNames);
|
? null : new MeasuredEnergyStats(supportedStandardBuckets, customBucketNames);
|
||||||
// Supported power buckets changed since last boot.
|
// Supported power buckets changed since last boot.
|
||||||
// Existing data is no longer reliable.
|
// Existing data is no longer reliable.
|
||||||
resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime());
|
resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime(),
|
||||||
|
RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14949,7 +14972,8 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Slog.e(TAG, "Error reading battery statistics", e);
|
Slog.e(TAG, "Error reading battery statistics", e);
|
||||||
resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime());
|
resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime(),
|
||||||
|
RESET_REASON_CORRUPT_FILE);
|
||||||
} finally {
|
} finally {
|
||||||
stats.recycle();
|
stats.recycle();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ public class BatteryUsageStatsStore {
|
|||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final BatteryStatsImpl mBatteryStats;
|
private final BatteryStatsImpl mBatteryStats;
|
||||||
|
private boolean mSystemReady;
|
||||||
private final File mStoreDir;
|
private final File mStoreDir;
|
||||||
private final File mLockFile;
|
private final File mLockFile;
|
||||||
private final AtomicFile mConfigFile;
|
private final AtomicFile mConfigFile;
|
||||||
@@ -95,7 +96,18 @@ public class BatteryUsageStatsStore {
|
|||||||
mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(mContext, mBatteryStats);
|
mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(mContext, mBatteryStats);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prepareForBatteryStatsReset() {
|
/**
|
||||||
|
* Notifies BatteryUsageStatsStore that the system server is ready.
|
||||||
|
*/
|
||||||
|
public void onSystemReady() {
|
||||||
|
mSystemReady = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareForBatteryStatsReset(int resetReason) {
|
||||||
|
if (resetReason == BatteryStatsImpl.RESET_REASON_CORRUPT_FILE || !mSystemReady) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final List<BatteryUsageStats> stats =
|
final List<BatteryUsageStats> stats =
|
||||||
mBatteryUsageStatsProvider.getBatteryUsageStats(BATTERY_USAGE_STATS_QUERY);
|
mBatteryUsageStatsProvider.getBatteryUsageStats(BATTERY_USAGE_STATS_QUERY);
|
||||||
if (stats.isEmpty()) {
|
if (stats.isEmpty()) {
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ public class BatteryUsageStatsProviderTest {
|
|||||||
BatteryUsageStatsStore batteryUsageStatsStore = new BatteryUsageStatsStore(context,
|
BatteryUsageStatsStore batteryUsageStatsStore = new BatteryUsageStatsStore(context,
|
||||||
batteryStats, new File(context.getCacheDir(), "BatteryUsageStatsProviderTest"),
|
batteryStats, new File(context.getCacheDir(), "BatteryUsageStatsProviderTest"),
|
||||||
new TestHandler(), Integer.MAX_VALUE);
|
new TestHandler(), Integer.MAX_VALUE);
|
||||||
|
batteryUsageStatsStore.onSystemReady();
|
||||||
|
|
||||||
BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context,
|
BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context,
|
||||||
batteryStats, batteryUsageStatsStore);
|
batteryStats, batteryUsageStatsStore);
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ public class BatteryUsageStatsRule implements TestRule {
|
|||||||
mMockClocks.currentTime = currentTime;
|
mMockClocks.currentTime = currentTime;
|
||||||
mBatteryStats = new MockBatteryStatsImpl(mMockClocks);
|
mBatteryStats = new MockBatteryStatsImpl(mMockClocks);
|
||||||
mBatteryStats.setPowerProfile(mPowerProfile);
|
mBatteryStats.setPowerProfile(mPowerProfile);
|
||||||
|
mBatteryStats.onSystemReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BatteryUsageStatsRule setAveragePower(String key, double value) {
|
public BatteryUsageStatsRule setAveragePower(String key, double value) {
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ public class BatteryUsageStatsStoreTest {
|
|||||||
mBatteryStats = new MockBatteryStatsImpl(mMockClocks);
|
mBatteryStats = new MockBatteryStatsImpl(mMockClocks);
|
||||||
mBatteryStats.setNoAutoReset(true);
|
mBatteryStats.setNoAutoReset(true);
|
||||||
mBatteryStats.setPowerProfile(mock(PowerProfile.class));
|
mBatteryStats.setPowerProfile(mock(PowerProfile.class));
|
||||||
|
mBatteryStats.onSystemReady();
|
||||||
|
|
||||||
Context context = InstrumentationRegistry.getContext();
|
Context context = InstrumentationRegistry.getContext();
|
||||||
|
|
||||||
@@ -67,6 +68,7 @@ public class BatteryUsageStatsStoreTest {
|
|||||||
|
|
||||||
mBatteryUsageStatsStore = new BatteryUsageStatsStore(context, mBatteryStats,
|
mBatteryUsageStatsStore = new BatteryUsageStatsStore(context, mBatteryStats,
|
||||||
mStoreDirectory, new TestHandler(), MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES);
|
mStoreDirectory, new TestHandler(), MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES);
|
||||||
|
mBatteryUsageStatsStore.onSystemReady();
|
||||||
|
|
||||||
mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mBatteryStats);
|
mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mBatteryStats);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7635,6 +7635,7 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
t.traceEnd();
|
t.traceEnd();
|
||||||
|
|
||||||
t.traceBegin("ActivityManagerStartApps");
|
t.traceBegin("ActivityManagerStartApps");
|
||||||
|
mBatteryStatsService.onSystemReady();
|
||||||
mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
|
mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
|
||||||
Integer.toString(currentUserId), currentUserId);
|
Integer.toString(currentUserId), currentUserId);
|
||||||
mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START,
|
mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START,
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
|
|||||||
Watchdog.Monitor {
|
Watchdog.Monitor {
|
||||||
static final String TAG = "BatteryStatsService";
|
static final String TAG = "BatteryStatsService";
|
||||||
static final boolean DBG = false;
|
static final boolean DBG = false;
|
||||||
private static final boolean BATTERY_USAGE_STORE_ENABLED = false;
|
private static final boolean BATTERY_USAGE_STORE_ENABLED = true;
|
||||||
|
|
||||||
private static IBatteryStats sService;
|
private static IBatteryStats sService;
|
||||||
|
|
||||||
@@ -398,6 +398,16 @@ public final class BatteryStatsService extends IBatteryStats.Stub
|
|||||||
registerStatsCallbacks();
|
registerStatsCallbacks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies BatteryStatsService that the system server is ready.
|
||||||
|
*/
|
||||||
|
public void onSystemReady() {
|
||||||
|
mStats.onSystemReady();
|
||||||
|
if (BATTERY_USAGE_STORE_ENABLED) {
|
||||||
|
mBatteryUsageStatsStore.onSystemReady();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final class LocalService extends BatteryStatsInternal {
|
private final class LocalService extends BatteryStatsInternal {
|
||||||
@Override
|
@Override
|
||||||
public String[] getWifiIfaces() {
|
public String[] getWifiIfaces() {
|
||||||
|
|||||||
Reference in New Issue
Block a user