Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48550693 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov Committed by Android (Google) Code Review
Browse files

Merge "Remove DeviceCalculatedPowerBlameUid and DeviceCalculatedPowerBlameOther atoms"

parents b45c44cb 4123449e
Loading
Loading
Loading
Loading
+0 −32
Original line number Diff line number Diff line
@@ -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);
+9 −103
Original line number Diff line number Diff line
@@ -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) {
            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() {