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

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

Merge "Switch to optimized implementation of NetworkStats.subtract" into main

parents 3033ceff 80eccf9a
Loading
Loading
Loading
Loading
+24 −89
Original line number Diff line number Diff line
@@ -2205,6 +2205,11 @@ public class BatteryStatsImpl extends BatteryStats {
                getWakelockDurationRetriever() {
            return mWakelockDurationRetriever;
        }
        @Override
        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
            return BatteryStatsImpl.this.networkStatsDelta(stats, oldStats);
        }
    }
    private final PowerStatsCollectorInjector mPowerStatsCollectorInjector =
@@ -12392,83 +12397,13 @@ public class BatteryStatsImpl extends BatteryStats {
        return networkStatsManager.getWifiUidStats();
    }
    static class NetworkStatsDelta {
        int mUid;
        int mSet;
        long mRxBytes;
        long mRxPackets;
        long mTxBytes;
        long mTxPackets;
        public int getUid() {
            return mUid;
        }
        public int getSet() {
            return mSet;
        }
        public long getRxBytes() {
            return mRxBytes;
        }
        public long getRxPackets() {
            return mRxPackets;
        }
        public long getTxBytes() {
            return mTxBytes;
        }
        public long getTxPackets() {
            return mTxPackets;
        }
        @Override
        public String toString() {
            return "NetworkStatsDelta{mUid=" + mUid + ", mSet=" + mSet + ", mRxBytes=" + mRxBytes
                    + ", mRxPackets=" + mRxPackets + ", mTxBytes=" + mTxBytes + ", mTxPackets="
                    + mTxPackets + '}';
        }
    }
    static List<NetworkStatsDelta> computeDelta(NetworkStats currentStats,
            NetworkStats lastStats) {
        List<NetworkStatsDelta> deltaList = new ArrayList<>();
        for (NetworkStats.Entry entry : currentStats) {
            NetworkStatsDelta delta = new NetworkStatsDelta();
            delta.mUid = entry.getUid();
            delta.mSet = entry.getSet();
            NetworkStats.Entry lastEntry = null;
            if (lastStats != null) {
                for (NetworkStats.Entry e : lastStats) {
                    if (e.getUid() == entry.getUid() && e.getSet() == entry.getSet()
                            && e.getTag() == entry.getTag()
                            && e.getMetered() == entry.getMetered()
                            && e.getRoaming() == entry.getRoaming()
                            && e.getDefaultNetwork() == entry.getDefaultNetwork()
                            /*&& Objects.equals(e.getIface(), entry.getIface())*/) {
                        lastEntry = e;
                        break;
                    }
                }
            }
            if (lastEntry != null) {
                delta.mRxBytes = Math.max(0, entry.getRxBytes() - lastEntry.getRxBytes());
                delta.mRxPackets = Math.max(0, entry.getRxPackets() - lastEntry.getRxPackets());
                delta.mTxBytes = Math.max(0, entry.getTxBytes() - lastEntry.getTxBytes());
                delta.mTxPackets = Math.max(0, entry.getTxPackets() - lastEntry.getTxPackets());
            } else {
                delta.mRxBytes = entry.getRxBytes();
                delta.mRxPackets = entry.getRxPackets();
                delta.mTxBytes = entry.getTxBytes();
                delta.mTxPackets = entry.getTxPackets();
            }
            deltaList.add(delta);
    @VisibleForTesting
    protected NetworkStats networkStatsDelta(@NonNull NetworkStats stats,
            @Nullable NetworkStats oldStats) {
        if (oldStats == null) {
            return stats;
        }
        return deltaList;
        return stats.subtract(oldStats);
    }
    /**
@@ -12486,12 +12421,12 @@ public class BatteryStatsImpl extends BatteryStats {
            }
        }
        NetworkStats delta;
        // Grab a separate lock to acquire the network stats, which may do I/O.
        List<NetworkStatsDelta> delta;
        synchronized (mWifiNetworkLock) {
            final NetworkStats latestStats = readWifiNetworkStatsLocked(networkStatsManager);
            if (latestStats != null) {
                delta = computeDelta(latestStats, mLastWifiNetworkStats);
                delta = networkStatsDelta(latestStats, mLastWifiNetworkStats);
                mLastWifiNetworkStats = latestStats;
            } else {
                delta = null;
@@ -12501,15 +12436,15 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    private void onWifiPowerStatsRetrieved(WifiActivityEnergyInfo wifiActivityEnergyInfo,
            List<NetworkStatsDelta> networkStatsDeltas, long elapsedRealtimeMs, long uptimeMs) {
            NetworkStats networkStatsDelta, long elapsedRealtimeMs, long uptimeMs) {
        // Do not populate consumed energy, because energy attribution is done by
        // WifiPowerStatsProcessor.
        updateWifiBatteryStats(wifiActivityEnergyInfo, networkStatsDeltas, POWER_DATA_UNAVAILABLE,
        updateWifiBatteryStats(wifiActivityEnergyInfo, networkStatsDelta, POWER_DATA_UNAVAILABLE,
                elapsedRealtimeMs, uptimeMs);
    }
    private void updateWifiBatteryStats(WifiActivityEnergyInfo info,
            List<NetworkStatsDelta> delta, long consumedChargeUC, long elapsedRealtimeMs,
            NetworkStats delta, long consumedChargeUC, long elapsedRealtimeMs,
            long uptimeMs) {
        synchronized (this) {
            if (!mOnBatteryInternal || mIgnoreNextExternalStats) {
@@ -12535,7 +12470,7 @@ public class BatteryStatsImpl extends BatteryStats {
            long totalTxPackets = 0;
            long totalRxPackets = 0;
            if (delta != null) {
                for (NetworkStatsDelta entry : delta) {
                for (NetworkStats.Entry entry : delta) {
                    if (DEBUG_ENERGY) {
                        Slog.d(TAG, "Wifi uid " + entry.getUid()
                                + ": delta rx=" + entry.getRxBytes()
@@ -12879,11 +12814,11 @@ public class BatteryStatsImpl extends BatteryStats {
        mLastModemActivityInfo = activityInfo;
        // Grab a separate lock to acquire the network stats, which may do I/O.
        List<NetworkStatsDelta> delta = null;
        NetworkStats delta = null;
        synchronized (mModemNetworkLock) {
            final NetworkStats latestStats = readMobileNetworkStatsLocked(networkStatsManager);
            if (latestStats != null) {
                delta = computeDelta(latestStats, mLastModemNetworkStats);
                delta = networkStatsDelta(latestStats, mLastModemNetworkStats);
                mLastModemNetworkStats = latestStats;
            }
        }
@@ -12892,15 +12827,15 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    private void onMobileRadioPowerStatsRetrieved(ModemActivityInfo modemActivityInfo,
            List<NetworkStatsDelta> networkStatsDeltas, long elapsedRealtimeMs, long uptimeMs) {
            NetworkStats networkStatsDelta, long elapsedRealtimeMs, long uptimeMs) {
        // Do not populate consumed energy, because energy attribution is done by
        // MobileRadioPowerStatsProcessor.
        updateCellularBatteryStats(modemActivityInfo, networkStatsDeltas, POWER_DATA_UNAVAILABLE,
        updateCellularBatteryStats(modemActivityInfo, networkStatsDelta, POWER_DATA_UNAVAILABLE,
                elapsedRealtimeMs, uptimeMs);
    }
    private void updateCellularBatteryStats(@Nullable ModemActivityInfo deltaInfo,
            @Nullable List<NetworkStatsDelta> delta, long consumedChargeUC, long elapsedRealtimeMs,
            @Nullable NetworkStats delta, long consumedChargeUC, long elapsedRealtimeMs,
            long uptimeMs) {
        // Add modem tx power to history.
        addModemTxPowerToHistory(deltaInfo, elapsedRealtimeMs, uptimeMs);
@@ -13003,7 +12938,7 @@ public class BatteryStatsImpl extends BatteryStats {
            long totalRxPackets = 0;
            long totalTxPackets = 0;
            if (delta != null) {
                for (NetworkStatsDelta entry : delta) {
                for (NetworkStats.Entry entry : delta) {
                    if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                        continue;
                    }
@@ -13044,7 +12979,7 @@ public class BatteryStatsImpl extends BatteryStats {
                // Now distribute proportional blame to the apps that did networking.
                long totalPackets = totalRxPackets + totalTxPackets;
                if (totalPackets > 0) {
                    for (NetworkStatsDelta entry : delta) {
                    for (NetworkStats.Entry entry : delta) {
                        if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                            continue;
                        }
+7 −8
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.MobileRadioPowerStatsLayout;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.LongSupplier;
@@ -71,7 +70,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
    interface Observer {
        void onMobileRadioPowerStatsRetrieved(
                @Nullable ModemActivityInfo modemActivityDelta,
                @Nullable List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas,
                @Nullable NetworkStats networkStatsDeltas,
                long elapsedRealtimeMs, long uptimeMs);
    }

@@ -86,6 +85,8 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
        TelephonyManager getTelephonyManager();
        LongSupplier getCallDurationSupplier();
        LongSupplier getPhoneSignalScanDurationSupplier();

        NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats);
    }

    private final Injector mInjector;
@@ -190,7 +191,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
        mPowerStats.uidStats.clear();

        ModemActivityInfo modemActivityDelta = collectModemActivityInfo();
        List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas = collectNetworkStats();
        NetworkStats networkStatsDeltas = collectNetworkStats();

        mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);

@@ -288,17 +289,15 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector {
        return deltaInfo;
    }

    private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
    private NetworkStats collectNetworkStats() {
        NetworkStats networkStats = mNetworkStatsSupplier.get();
        if (networkStats == null) {
            return null;
        }

        List<BatteryStatsImpl.NetworkStatsDelta> delta =
                BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
        NetworkStats delta = mInjector.networkStatsDelta(networkStats, mLastNetworkStats);
        mLastNetworkStats = networkStats;
        for (int i = delta.size() - 1; i >= 0; i--) {
            BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
        for (NetworkStats.Entry uidDelta : delta) {
            long rxBytes = uidDelta.getRxBytes();
            long txBytes = uidDelta.getTxBytes();
            long rxPackets = uidDelta.getRxPackets();
+7 −8
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.WifiPowerStatsLayout;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
@@ -43,7 +42,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {

    interface Observer {
        void onWifiPowerStatsRetrieved(WifiActivityEnergyInfo info,
                List<BatteryStatsImpl.NetworkStatsDelta> delta, long elapsedRealtimeMs,
                NetworkStats delta, long elapsedRealtimeMs,
                long uptimeMs);
    }

@@ -66,6 +65,8 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {
        Supplier<NetworkStats> getWifiNetworkStatsSupplier();
        WifiManager getWifiManager();
        WifiStatsRetriever getWifiStatsRetriever();

        NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats);
    }

    private final Injector mInjector;
@@ -161,7 +162,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {
        } else {
            collectWifiActivityStats();
        }
        List<BatteryStatsImpl.NetworkStatsDelta> networkStatsDeltas = collectNetworkStats();
        NetworkStats networkStatsDeltas = collectNetworkStats();
        collectWifiScanTime();

        mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);
@@ -227,17 +228,15 @@ public class WifiPowerStatsCollector extends PowerStatsCollector {
        mPowerStats.durationMs = duration;
    }

    private List<BatteryStatsImpl.NetworkStatsDelta> collectNetworkStats() {
    private NetworkStats collectNetworkStats() {
        NetworkStats networkStats = mNetworkStatsSupplier.get();
        if (networkStats == null) {
            return null;
        }

        List<BatteryStatsImpl.NetworkStatsDelta> delta =
                BatteryStatsImpl.computeDelta(networkStats, mLastNetworkStats);
        NetworkStats delta = mInjector.networkStatsDelta(networkStats, mLastNetworkStats);
        mLastNetworkStats = networkStats;
        for (int i = delta.size() - 1; i >= 0; i--) {
            BatteryStatsImpl.NetworkStatsDelta uidDelta = delta.get(i);
        for (NetworkStats.Entry uidDelta : delta) {
            long rxBytes = uidDelta.getRxBytes();
            long txBytes = uidDelta.getTxBytes();
            long rxPackets = uidDelta.getRxPackets();
+5 −0
Original line number Diff line number Diff line
@@ -158,6 +158,11 @@ public class MobileRadioPowerStatsCollectorTest {
        public LongSupplier getPhoneSignalScanDurationSupplier() {
            return mScanDurationSupplier;
        }

        @Override
        public NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
            return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
        }
    };

    @Before
+5 −0
Original line number Diff line number Diff line
@@ -283,6 +283,11 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
    protected void updateBatteryPropertiesLocked() {
    }

    @Override
    protected NetworkStats networkStatsDelta(NetworkStats stats, NetworkStats oldStats) {
        return NetworkStatsTestUtils.networkStatsDelta(stats, oldStats);
    }

    public static class DummyExternalStatsSync implements ExternalStatsSync {
        public int flags = 0;

Loading