Loading core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java +0 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +9 −103 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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."; Loading Loading @@ -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") Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -905,8 +888,6 @@ public class StatsPullAtomService extends SystemService { registerProcessCpuTime(); registerCpuTimePerThreadFreq(); registerDeviceCalculatedPowerUse(); registerDeviceCalculatedPowerBlameUid(); registerDeviceCalculatedPowerBlameOther(); registerDebugElapsedClock(); registerDebugFailingElapsedClock(); registerBuildInformation(); Loading Loading @@ -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); } Loading @@ -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) { return StatsManager.PULL_SKIP; } for (BatterySipper bs : sippers) { if (bs.drainType != bs.drainType.APP) { continue; } final BatteryStatsManager bsm = mContext.getSystemService(BatteryStatsManager.class); try { final BatteryUsageStats stats = bsm.getBatteryUsageStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( atomTag, bs.uidObj.getUid(), milliAmpHrsToNanoAmpSecs(bs.totalPowerMah))); } atomTag, milliAmpHrsToNanoAmpSecs(stats.getConsumedPower()))); 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) { } 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; // 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() { Loading Loading
core/tests/coretests/src/com/android/internal/os/BatteryStatsHelperTest.java +0 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +9 −103 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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."; Loading Loading @@ -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") Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -905,8 +888,6 @@ public class StatsPullAtomService extends SystemService { registerProcessCpuTime(); registerCpuTimePerThreadFreq(); registerDeviceCalculatedPowerUse(); registerDeviceCalculatedPowerBlameUid(); registerDeviceCalculatedPowerBlameOther(); registerDebugElapsedClock(); registerDebugFailingElapsedClock(); registerBuildInformation(); Loading Loading @@ -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); } Loading @@ -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) { return StatsManager.PULL_SKIP; } for (BatterySipper bs : sippers) { if (bs.drainType != bs.drainType.APP) { continue; } final BatteryStatsManager bsm = mContext.getSystemService(BatteryStatsManager.class); try { final BatteryUsageStats stats = bsm.getBatteryUsageStats(); pulledData.add(FrameworkStatsLog.buildStatsEvent( atomTag, bs.uidObj.getUid(), milliAmpHrsToNanoAmpSecs(bs.totalPowerMah))); } atomTag, milliAmpHrsToNanoAmpSecs(stats.getConsumedPower()))); 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) { } 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; // 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() { Loading