Merge "[DU03]Remove INetworkStatsService from BatteryStatsImpl"

This commit is contained in:
Treehugger Robot
2022-01-12 19:33:52 +00:00
committed by Gerrit Code Review
8 changed files with 82 additions and 30 deletions

View File

@@ -25,6 +25,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;
@@ -36,7 +37,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;
@@ -11539,19 +11541,11 @@ public class BatteryStatsImpl extends BatteryStats {
private NetworkStats mLastModemNetworkStats = new NetworkStats(0, -1);
@VisibleForTesting
protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
try {
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);
protected NetworkStats readNetworkStatsLocked(@NonNull NetworkStatsManager networkStatsManager,
String[] ifaces) {
Objects.requireNonNull(networkStatsManager);
if (!ArrayUtils.isEmpty(ifaces)) {
return networkStatsManager.getDetailedUidStats(Set.of(ifaces));
}
return null;
}
@@ -11561,7 +11555,8 @@ public class BatteryStatsImpl extends BatteryStats {
* @param info The energy information from the WiFi controller.
*/
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) {
Slog.d(TAG, "Updating wifi stats: " + Arrays.toString(mWifiIfaces));
}
@@ -11569,7 +11564,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());
@@ -11921,7 +11917,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);
}
@@ -11935,7 +11932,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());

View File

@@ -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;
@@ -40,12 +41,15 @@ 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
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()
@@ -90,7 +94,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);
@@ -150,7 +155,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);

View File

@@ -16,6 +16,8 @@
package com.android.internal.os;
import android.annotation.NonNull;
import android.app.usage.NetworkStatsManager;
import android.net.NetworkStats;
import android.os.Handler;
import android.os.Looper;
@@ -105,7 +107,8 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
}
@Override
protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
protected NetworkStats readNetworkStatsLocked(@NonNull NetworkStatsManager networkStatsManager,
String[] ifaces) {
return mNetworkStats;
}

View File

@@ -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);

View File

@@ -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) {

View File

@@ -922,6 +922,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override
public NetworkStats getDetailedUidStats(String[] requiredIfaces) {
enforceAnyPermissionOf(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
try {
final String[] ifacesToQuery =
mStatsFactory.augmentWithStackedInterfaces(requiredIfaces);

View File

@@ -16,6 +16,7 @@
package com.android.server.am;
import android.annotation.Nullable;
import android.app.usage.NetworkStatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
@@ -702,8 +703,10 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
if (wifiInfo.isValid()) {
final long wifiChargeUC = measuredEnergyDeltas != null ?
measuredEnergyDeltas.wifiChargeUC : MeasuredEnergySnapshot.UNAVAILABLE;
mStats.updateWifiState(
extractDeltaLocked(wifiInfo), wifiChargeUC, elapsedRealtime, uptime);
final NetworkStatsManager networkStatsManager = mInjector.getSystemService(
NetworkStatsManager.class);
mStats.updateWifiState(extractDeltaLocked(wifiInfo),
wifiChargeUC, elapsedRealtime, uptime, networkStatsManager);
} else {
Slog.w(TAG, "wifi info is invalid: " + wifiInfo);
}
@@ -712,8 +715,10 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
if (modemInfo != null) {
final long mobileRadioChargeUC = measuredEnergyDeltas != null
? measuredEnergyDeltas.mobileRadioChargeUC : MeasuredEnergySnapshot.UNAVAILABLE;
final NetworkStatsManager networkStatsManager = mInjector.getSystemService(
NetworkStatsManager.class);
mStats.noteModemControllerActivity(modemInfo, mobileRadioChargeUC, elapsedRealtime,
uptime);
uptime, networkStatsManager);
}
if (updateFlags == UPDATE_ALL) {

View File

@@ -22,6 +22,7 @@ import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE;
import android.annotation.NonNull;
import android.app.StatsManager;
import android.app.usage.NetworkStatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.content.ContentResolver;
import android.content.Context;
@@ -2025,8 +2026,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
synchronized (mLock) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
final long uptime = SystemClock.uptimeMillis();
final NetworkStatsManager networkStatsManager = mContext.getSystemService(
NetworkStatsManager.class);
mHandler.post(() -> {
mStats.updateWifiState(info, POWER_DATA_UNAVAILABLE, elapsedRealtime, uptime);
mStats.updateWifiState(info, POWER_DATA_UNAVAILABLE, elapsedRealtime, uptime,
networkStatsManager);
});
}
}
@@ -2063,9 +2067,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
synchronized (mLock) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
final long uptime = SystemClock.uptimeMillis();
final NetworkStatsManager networkStatsManager = mContext.getSystemService(
NetworkStatsManager.class);
mHandler.post(() -> {
mStats.noteModemControllerActivity(info, POWER_DATA_UNAVAILABLE, elapsedRealtime,
uptime);
uptime, networkStatsManager);
});
}
}