Merge "[DU03]Remove INetworkStatsService from BatteryStatsImpl"
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user