Merge "Remove DeviceCalculatedPowerBlameUid and DeviceCalculatedPowerBlameOther atoms"

This commit is contained in:
Dmitri Plotnikov
2022-02-08 18:04:43 +00:00
committed by Android (Google) Code Review
2 changed files with 10 additions and 136 deletions

View File

@@ -40,8 +40,6 @@ import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.FrameworkStatsLog;
import junit.framework.TestCase;
import org.junit.Before;
@@ -258,36 +256,6 @@ public class BatteryStatsHelperTest extends TestCase {
assertThat(time).isEqualTo(TIME_STATE_FOREGROUND_MS);
}
@Test
public void testDrainTypesSyncedWithProto() {
assertEquals(BatterySipper.DrainType.AMBIENT_DISPLAY.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__AMBIENT_DISPLAY);
// AtomsProto has no "APP"
assertEquals(BatterySipper.DrainType.BLUETOOTH.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__BLUETOOTH);
assertEquals(BatterySipper.DrainType.CAMERA.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__CAMERA);
assertEquals(BatterySipper.DrainType.CELL.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__CELL);
assertEquals(BatterySipper.DrainType.FLASHLIGHT.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__FLASHLIGHT);
assertEquals(BatterySipper.DrainType.IDLE.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__IDLE);
assertEquals(BatterySipper.DrainType.MEMORY.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__MEMORY);
assertEquals(BatterySipper.DrainType.OVERCOUNTED.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__OVERCOUNTED);
assertEquals(BatterySipper.DrainType.PHONE.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__PHONE);
assertEquals(BatterySipper.DrainType.SCREEN.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__SCREEN);
assertEquals(BatterySipper.DrainType.UNACCOUNTED.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__UNACCOUNTED);
// AtomsProto has no "USER"
assertEquals(BatterySipper.DrainType.WIFI.ordinal(),
FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER__DRAIN_TYPE__WIFI);
}
private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah,
int uidCode, boolean isUidNull, ScreenPowerCalculator spc) {
final BatterySipper sipper = mock(BatterySipper.class);

View File

@@ -105,6 +105,8 @@ import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.BatteryStats;
import android.os.BatteryStatsInternal;
import android.os.BatteryStatsManager;
import android.os.BatteryUsageStats;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -168,8 +170,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.procstats.IProcessStats;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BinderCallsStats.ExportedCallStat;
import com.android.internal.os.KernelAllocationStats;
import com.android.internal.os.KernelCpuBpfTracking;
@@ -273,7 +273,6 @@ public class StatsPullAtomService extends SystemService {
*/
private static final long NETSTATS_UID_DEFAULT_BUCKET_DURATION_MS = HOURS.toMillis(2);
private static final int MAX_BATTERY_STATS_HELPER_FREQUENCY_MS = 1000;
private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXIED;
private static final String COMMON_PERMISSION_PREFIX = "android.permission.";
@@ -366,12 +365,6 @@ public class StatsPullAtomService extends SystemService {
@GuardedBy("mCpuTimePerThreadFreqLock")
private KernelCpuThreadReaderDiff mKernelCpuThreadReader;
private final Object mBatteryStatsHelperLock = new Object();
@GuardedBy("mBatteryStatsHelperLock")
private BatteryStatsHelper mBatteryStatsHelper = null;
@GuardedBy("mBatteryStatsHelperLock")
private long mBatteryStatsHelperTimestampMs = -MAX_BATTERY_STATS_HELPER_FREQUENCY_MS;
private StatsPullAtomCallbackImpl mStatsCallbackImpl;
@GuardedBy("mAttributedAppOpsLock")
@@ -433,8 +426,6 @@ public class StatsPullAtomService extends SystemService {
private final Object mProcessCpuTimeLock = new Object();
private final Object mCpuTimePerThreadFreqLock = new Object();
private final Object mDeviceCalculatedPowerUseLock = new Object();
private final Object mDeviceCalculatedPowerBlameUidLock = new Object();
private final Object mDeviceCalculatedPowerBlameOtherLock = new Object();
private final Object mDebugElapsedClockLock = new Object();
private final Object mDebugFailingElapsedClockLock = new Object();
private final Object mBuildInformationLock = new Object();
@@ -645,14 +636,6 @@ public class StatsPullAtomService extends SystemService {
synchronized (mDeviceCalculatedPowerUseLock) {
return pullDeviceCalculatedPowerUseLocked(atomTag, data);
}
case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID:
synchronized (mDeviceCalculatedPowerBlameUidLock) {
return pullDeviceCalculatedPowerBlameUidLocked(atomTag, data);
}
case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER:
synchronized (mDeviceCalculatedPowerBlameOtherLock) {
return pullDeviceCalculatedPowerBlameOtherLocked(atomTag, data);
}
case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK:
synchronized (mDebugElapsedClockLock) {
return pullDebugElapsedClockLocked(atomTag, data);
@@ -905,8 +888,6 @@ public class StatsPullAtomService extends SystemService {
registerProcessCpuTime();
registerCpuTimePerThreadFreq();
registerDeviceCalculatedPowerUse();
registerDeviceCalculatedPowerBlameUid();
registerDeviceCalculatedPowerBlameOther();
registerDebugElapsedClock();
registerDebugFailingElapsedClock();
registerBuildInformation();
@@ -3080,32 +3061,6 @@ public class StatsPullAtomService extends SystemService {
return StatsManager.PULL_SUCCESS;
}
private BatteryStatsHelper getBatteryStatsHelper() {
synchronized (mBatteryStatsHelperLock) {
if (mBatteryStatsHelper == null) {
final long callingToken = Binder.clearCallingIdentity();
try {
// clearCallingIdentity required for BatteryStatsHelper.checkWifiOnly().
mBatteryStatsHelper = new BatteryStatsHelper(mContext, false);
} finally {
Binder.restoreCallingIdentity(callingToken);
}
mBatteryStatsHelper.create((Bundle) null);
}
long currentTime = SystemClock.elapsedRealtime();
if (currentTime - mBatteryStatsHelperTimestampMs
>= MAX_BATTERY_STATS_HELPER_FREQUENCY_MS) {
// Load BatteryStats and do all the calculations.
mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED,
UserHandle.USER_ALL);
// Calculations are done so we don't need to save the raw BatteryStats data in RAM.
mBatteryStatsHelper.clearStats();
mBatteryStatsHelperTimestampMs = currentTime;
}
}
return mBatteryStatsHelper;
}
private long milliAmpHrsToNanoAmpSecs(double mAh) {
return (long) (mAh * MILLI_AMP_HR_TO_NANO_AMP_SECS + 0.5);
}
@@ -3121,65 +3076,16 @@ public class StatsPullAtomService extends SystemService {
}
int pullDeviceCalculatedPowerUseLocked(int atomTag, List<StatsEvent> pulledData) {
BatteryStatsHelper bsHelper = getBatteryStatsHelper();
pulledData.add(FrameworkStatsLog.buildStatsEvent(
atomTag, milliAmpHrsToNanoAmpSecs(bsHelper.getComputedPower())));
return StatsManager.PULL_SUCCESS;
}
private void registerDeviceCalculatedPowerBlameUid() {
int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID;
mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
DIRECT_EXECUTOR,
mStatsCallbackImpl
);
}
int pullDeviceCalculatedPowerBlameUidLocked(int atomTag, List<StatsEvent> pulledData) {
final List<BatterySipper> sippers = getBatteryStatsHelper().getUsageList();
if (sippers == null) {
final BatteryStatsManager bsm = mContext.getSystemService(BatteryStatsManager.class);
try {
final BatteryUsageStats stats = bsm.getBatteryUsageStats();
pulledData.add(FrameworkStatsLog.buildStatsEvent(
atomTag, milliAmpHrsToNanoAmpSecs(stats.getConsumedPower())));
return StatsManager.PULL_SUCCESS;
} catch (Exception e) {
Log.e(TAG, "Could not obtain battery usage stats", e);
return StatsManager.PULL_SKIP;
}
for (BatterySipper bs : sippers) {
if (bs.drainType != bs.drainType.APP) {
continue;
}
pulledData.add(FrameworkStatsLog.buildStatsEvent(
atomTag, bs.uidObj.getUid(), milliAmpHrsToNanoAmpSecs(bs.totalPowerMah)));
}
return StatsManager.PULL_SUCCESS;
}
private void registerDeviceCalculatedPowerBlameOther() {
int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER;
mStatsManager.setPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
DIRECT_EXECUTOR,
mStatsCallbackImpl
);
}
int pullDeviceCalculatedPowerBlameOtherLocked(int atomTag, List<StatsEvent> pulledData) {
final List<BatterySipper> sippers = getBatteryStatsHelper().getUsageList();
if (sippers == null) {
return StatsManager.PULL_SKIP;
}
for (BatterySipper bs : sippers) {
if (bs.drainType == bs.drainType.APP) {
continue; // This is a separate atom; see pullDeviceCalculatedPowerBlameUid().
}
if (bs.drainType == bs.drainType.USER) {
continue; // This is not supported. We purposefully calculate over USER_ALL.
}
pulledData.add(FrameworkStatsLog.buildStatsEvent(
atomTag, bs.drainType.ordinal(), milliAmpHrsToNanoAmpSecs(bs.totalPowerMah)));
}
return StatsManager.PULL_SUCCESS;
}
private void registerDebugElapsedClock() {