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

Commit f504f091 authored by lifr's avatar lifr
Browse files

[DU03]Remove INetworkStatsService from BatteryStatsImpl

BatteryStatsImpl is using INetworkStatsService APIs, which
cannot be accessed after moving into the mainline module. So, replace
and remove those hidden API usages.

Bug: 210066922
Test: atest BatteryStatsImplTest WifiPowerCalculatorTest
            MobileRadioPowerCalculatorTest
CTS-Coverage-Bug: 213437796
Change-Id: I584897ff8ba303c717a9df3756c9f6778c1cfb10
parent 040fa1e1
Loading
Loading
Loading
Loading
+16 −18
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.usage.NetworkStatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
import android.compat.annotation.UnsupportedAppUsage;
@@ -37,7 +38,6 @@ import android.content.IntentFilter;
import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
import android.location.GnssSignalQuality;
import android.net.INetworkStatsService;
import android.net.NetworkStats;
import android.net.Uri;
import android.net.wifi.WifiManager;
@@ -136,7 +136,9 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
@@ -12502,19 +12504,11 @@ public class BatteryStatsImpl extends BatteryStats {
    private NetworkStats mLastModemNetworkStats = new NetworkStats(0, -1);
    @VisibleForTesting
    protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
        try {
    protected NetworkStats readNetworkStatsLocked(@NonNull NetworkStatsManager networkStatsManager,
            String[] ifaces) {
        Objects.requireNonNull(networkStatsManager);
        if (!ArrayUtils.isEmpty(ifaces)) {
                INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
                        ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
                if (statsService != null) {
                    return statsService.getDetailedUidStats(ifaces);
                } else {
                    Slog.e(TAG, "Failed to get networkStatsService ");
                }
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "failed to read network stats for ifaces: " + Arrays.toString(ifaces) + e);
            return networkStatsManager.getDetailedUidStats(Set.of(ifaces));
        }
        return null;
    }
@@ -12525,7 +12519,8 @@ public class BatteryStatsImpl extends BatteryStats {
     */
    @GuardedBy("this")
    public void updateWifiState(@Nullable final WifiActivityEnergyInfo info,
            final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs) {
            final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs,
            @NonNull NetworkStatsManager networkStatsManager) {
        if (DEBUG_ENERGY) {
            synchronized (mWifiNetworkLock) {
                Slog.d(TAG, "Updating wifi stats: " + Arrays.toString(mWifiIfaces));
@@ -12535,7 +12530,8 @@ public class BatteryStatsImpl extends BatteryStats {
        // Grab a separate lock to acquire the network stats, which may do I/O.
        NetworkStats delta = null;
        synchronized (mWifiNetworkLock) {
            final NetworkStats latestStats = readNetworkStatsLocked(mWifiIfaces);
            final NetworkStats latestStats = readNetworkStatsLocked(networkStatsManager,
                    mWifiIfaces);
            if (latestStats != null) {
                delta = NetworkStats.subtract(latestStats, mLastWifiNetworkStats, null, null,
                        mNetworkStatsPool.acquire());
@@ -12888,7 +12884,8 @@ public class BatteryStatsImpl extends BatteryStats {
     * Distribute Cell radio energy info and network traffic to apps.
     */
    public void noteModemControllerActivity(@Nullable final ModemActivityInfo activityInfo,
            final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs) {
            final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs,
            @NonNull NetworkStatsManager networkStatsManager) {
        if (DEBUG_ENERGY) {
            Slog.d(TAG, "Updating mobile radio stats with " + activityInfo);
        }
@@ -12902,7 +12899,8 @@ public class BatteryStatsImpl extends BatteryStats {
        // Grab a separate lock to acquire the network stats, which may do I/O.
        NetworkStats delta = null;
        synchronized (mModemNetworkLock) {
            final NetworkStats latestStats = readNetworkStatsLocked(mModemIfaces);
            final NetworkStats latestStats = readNetworkStatsLocked(networkStatsManager,
                    mModemIfaces);
            if (latestStats != null) {
                delta = NetworkStats.subtract(latestStats, mLastModemNetworkStats, null, null,
                        mNetworkStatsPool.acquire());
+13 −6
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.app.usage.NetworkStatsManager;
import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
@@ -44,6 +45,7 @@ import com.google.common.collect.Range;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -51,6 +53,8 @@ import org.junit.runner.RunWith;
public class MobileRadioPowerCalculatorTest {
    private static final double PRECISION = 0.00001;
    private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;
    @Mock
    NetworkStatsManager mNetworkStatsManager;

    @Rule
    public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
@@ -95,7 +99,8 @@ public class MobileRadioPowerCalculatorTest {

        ModemActivityInfo mai = new ModemActivityInfo(10000, 2000, 3000,
                new int[]{100, 200, 300, 400, 500}, 600);
        stats.noteModemControllerActivity(mai, POWER_DATA_UNAVAILABLE, 10000, 10000);
        stats.noteModemControllerActivity(mai, POWER_DATA_UNAVAILABLE, 10000, 10000,
                mNetworkStatsManager);

        mStatsRule.setTime(12_000_000, 12_000_000);

@@ -157,7 +162,8 @@ public class MobileRadioPowerCalculatorTest {
        mStatsRule.setNetworkStats(new NetworkStats(10000, 1)
                .insertEntry("cellular", APP_UID, 0, 0, 1000, 100, 2000, 20, 100));

        stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 10000, 10000);
        stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 10000, 10000,
                mNetworkStatsManager);

        uid.setProcessStateForTest(
                BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 11000);
@@ -165,7 +171,8 @@ public class MobileRadioPowerCalculatorTest {
        mStatsRule.setNetworkStats(new NetworkStats(12000, 1)
                .insertEntry("cellular", APP_UID, 0, 0, 1000, 250, 2000, 80, 200));

        stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 12000, 12000);
        stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 12000, 12000,
                mNetworkStatsManager);

        assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC()).isAtMost(0);
        // 12000-8000 = 4000 ms == 4_000_000 us
@@ -239,7 +246,7 @@ public class MobileRadioPowerCalculatorTest {

        ModemActivityInfo mai = new ModemActivityInfo(10000, 2000, 3000,
                new int[]{100, 200, 300, 400, 500}, 600);
        stats.noteModemControllerActivity(mai, 10_000_000, 10000, 10000);
        stats.noteModemControllerActivity(mai, 10_000_000, 10000, 10000, mNetworkStatsManager);

        mStatsRule.setTime(12_000_000, 12_000_000);

@@ -301,7 +308,7 @@ public class MobileRadioPowerCalculatorTest {
        mStatsRule.setNetworkStats(new NetworkStats(10000, 1)
                .insertEntry("cellular", APP_UID, 0, 0, 1000, 100, 2000, 20, 100));

        stats.noteModemControllerActivity(null, 10_000_000, 10000, 10000);
        stats.noteModemControllerActivity(null, 10_000_000, 10000, 10000, mNetworkStatsManager);

        uid.setProcessStateForTest(
                BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 11000);
@@ -309,7 +316,7 @@ public class MobileRadioPowerCalculatorTest {
        mStatsRule.setNetworkStats(new NetworkStats(12000, 1)
                .insertEntry("cellular", APP_UID, 0, 0, 1000, 250, 2000, 80, 200));

        stats.noteModemControllerActivity(null, 15_000_000, 12000, 12000);
        stats.noteModemControllerActivity(null, 15_000_000, 12000, 12000, mNetworkStatsManager);

        mStatsRule.setTime(20000, 20000);

+4 −1
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.annotation.NonNull;
import android.app.usage.NetworkStatsManager;
import android.net.NetworkStats;
import android.os.Handler;
import android.os.Looper;
@@ -116,7 +118,8 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
    }

    @Override
    protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
    protected NetworkStats readNetworkStatsLocked(@NonNull NetworkStatsManager networkStatsManager,
            String[] ifaces) {
        return mNetworkStats;
    }

+12 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE;

import static com.google.common.truth.Truth.assertThat;

import android.app.usage.NetworkStatsManager;
import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
@@ -35,6 +36,7 @@ import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -43,6 +45,9 @@ public class WifiPowerCalculatorTest {

    private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;

    @Mock
    NetworkStatsManager mNetworkStatsManager;

    @Rule
    public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
            .setAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_IDLE, 360.0)
@@ -80,7 +85,8 @@ public class WifiPowerCalculatorTest {
        final BatteryStatsImpl batteryStats = setupTestNetworkNumbers();
        final WifiActivityEnergyInfo energyInfo = setupPowerControllerBasedModelEnergyNumbersInfo();

        batteryStats.updateWifiState(energyInfo, POWER_DATA_UNAVAILABLE, 1000, 1000);
        batteryStats.updateWifiState(energyInfo, POWER_DATA_UNAVAILABLE, 1000, 1000,
                mNetworkStatsManager);

        WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
        mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
@@ -113,7 +119,7 @@ public class WifiPowerCalculatorTest {
        final BatteryStatsImpl batteryStats = setupTestNetworkNumbers();
        final WifiActivityEnergyInfo energyInfo = setupPowerControllerBasedModelEnergyNumbersInfo();

        batteryStats.updateWifiState(energyInfo, 1_000_000, 1000, 1000);
        batteryStats.updateWifiState(energyInfo, 1_000_000, 1000, 1000, mNetworkStatsManager);

        WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
        mStatsRule.apply(calculator);
@@ -160,7 +166,8 @@ public class WifiPowerCalculatorTest {

        // Don't pass WifiActivityEnergyInfo, making WifiPowerCalculator rely exclusively
        // on the packet counts.
        batteryStats.updateWifiState(/* energyInfo */ null, POWER_DATA_UNAVAILABLE, 1000, 1000);
        batteryStats.updateWifiState(/* energyInfo */ null, POWER_DATA_UNAVAILABLE, 1000, 1000,
                mNetworkStatsManager);

        WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
        mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
@@ -180,7 +187,8 @@ public class WifiPowerCalculatorTest {

        // Don't pass WifiActivityEnergyInfo, making WifiPowerCalculator rely exclusively
        // on the packet counts.
        batteryStats.updateWifiState(/* energyInfo */ null, 1_000_000, 1000, 1000);
        batteryStats.updateWifiState(/* energyInfo */ null, 1_000_000, 1000, 1000,
                mNetworkStatsManager);

        WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
        mStatsRule.apply(calculator);
+26 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.net.module.util.NetworkIdentityUtils;

import java.util.List;
import java.util.Objects;
import java.util.Set;

/**
 * Provides access to network usage history and statistics. Usage data is collected in
@@ -535,6 +536,31 @@ public class NetworkStatsManager {
        return result;
    }

    /**
     * Query realtime network usage statistics details with interfaces constrains.
     * Return snapshot of current UID statistics, including any {@link TrafficStats#UID_TETHERING},
     * video calling data usage and count of network operations that set by
     * {@link TrafficStats#incrementOperationCount}. The returned data doesn't include any
     * statistics that is reported by {@link NetworkStatsProvider}.
     *
     * @param requiredIfaces A list of interfaces the stats should be restricted to, or
     *               {@link NetworkStats#INTERFACES_ALL}.
     *
     * @hide
     */
    //@SystemApi
    @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
    @NonNull public android.net.NetworkStats getDetailedUidStats(
                @NonNull Set<String> requiredIfaces) {
        Objects.requireNonNull(requiredIfaces, "requiredIfaces cannot be null");
        try {
            return mService.getDetailedUidStats(requiredIfaces.toArray(new String[0]));
        } catch (RemoteException e) {
            if (DBG) Log.d(TAG, "Remote exception when get detailed uid stats");
            throw e.rethrowFromSystemServer();
        }
    }

    /** @hide */
    public void registerUsageCallback(NetworkTemplate template, int networkType,
            long thresholdBytes, UsageCallback callback, @Nullable Handler handler) {
Loading