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

Commit b50a684b authored by Siddharth Ray's avatar Siddharth Ray
Browse files

Wifi: Add scanning, activity time and API

Addition of Wifi Scanning time to Aggregate BatteryStats

Addition of Wifi Active time to BatteryStats (aggregate)

Addition of API to obtain Wifi battery stats for power drain diagnostics.

BUG:67213886

Test: Manual
Change-Id: I4f4c27ba839017d44feca685a4fae2f130d31765
parent 51a9a31b
Loading
Loading
Loading
Loading
+49 −6
Original line number Diff line number Diff line
@@ -336,6 +336,9 @@ public abstract class BatteryStats implements Parcelable {
    private final StringBuilder mFormatBuilder = new StringBuilder(32);
    private final Formatter mFormatter = new Formatter(mFormatBuilder);

    private static final String CELLULAR_CONTROLLER_NAME = "Cellular";
    private static final String WIFI_CONTROLLER_NAME = "WiFi";

    /**
     * Indicates times spent by the uid at each cpu frequency in all process states.
     *
@@ -411,6 +414,13 @@ public abstract class BatteryStats implements Parcelable {
         */
        public abstract LongCounter getIdleTimeCounter();

        /**
         * @return a non-null {@link LongCounter} representing time spent (milliseconds) in the
         * scan state.
         */
        public abstract LongCounter getScanTimeCounter();


        /**
         * @return a non-null {@link LongCounter} representing time spent (milliseconds) in the
         * receive state.
@@ -2398,6 +2408,14 @@ public abstract class BatteryStats implements Parcelable {
     */
    public abstract long getWifiOnTime(long elapsedRealtimeUs, int which);

    /**
     * Returns the time in microseconds that wifi has been active while the device was
     * running on battery.
     *
     * {@hide}
     */
    public abstract long getWifiActiveTime(long elapsedRealtimeUs, int which);

    /**
     * Returns the time in microseconds that wifi has been on and the driver has
     * been in the running state while the device was running on battery.
@@ -3345,6 +3363,20 @@ public abstract class BatteryStats implements Parcelable {
        final long sleepTimeMs
            = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs);

        if (controllerName.equals(WIFI_CONTROLLER_NAME)) {
            final long scanTimeMs = counter.getScanTimeCounter().getCountLocked(which);
            sb.setLength(0);
            sb.append(prefix);
            sb.append("     ");
            sb.append(controllerName);
            sb.append(" Scan time:  ");
            formatTimeMs(sb, scanTimeMs);
            sb.append("(");
            sb.append(formatRatioLocked(scanTimeMs, totalControllerActivityTimeMs));
            sb.append(")");
            pw.println(sb.toString());
        }

        sb.setLength(0);
        sb.append(prefix);
        sb.append("     ");
@@ -3386,7 +3418,7 @@ public abstract class BatteryStats implements Parcelable {

        String [] powerLevel;
        switch(controllerName) {
            case "Cellular":
            case CELLULAR_CONTROLLER_NAME:
                powerLevel = new String[] {
                    "   less than 0dBm: ",
                    "   0dBm to 8dBm: ",
@@ -4674,7 +4706,7 @@ public abstract class BatteryStats implements Parcelable {
        if (!didOne) sb.append(" (no activity)");
        pw.println(sb.toString());

        printControllerActivity(pw, sb, prefix, "Cellular",
        printControllerActivity(pw, sb, prefix, CELLULAR_CONTROLLER_NAME,
            getModemControllerActivity(), which);

        pw.print(prefix);
@@ -4683,6 +4715,16 @@ public abstract class BatteryStats implements Parcelable {
        sb.append("  Wifi Statistics:");
        pw.println(sb.toString());

        pw.print(prefix);
        sb.setLength(0);
        sb.append(prefix);
        sb.append("     Wifi kernel active time: ");
        final long wifiActiveTime = getWifiActiveTime(rawRealtime, which);
        formatTimeMs(sb, wifiActiveTime / 1000);
        sb.append("("); sb.append(formatRatioLocked(wifiActiveTime, whichBatteryRealtime));
        sb.append(")");
        pw.println(sb.toString());

        pw.print("     Wifi data received: "); pw.println(formatBytesLocked(wifiRxTotalBytes));
        pw.print("     Wifi data sent: "); pw.println(formatBytesLocked(wifiTxTotalBytes));
        pw.print("     Wifi packets received: "); pw.println(wifiRxTotalPackets);
@@ -4760,7 +4802,8 @@ public abstract class BatteryStats implements Parcelable {
        if (!didOne) sb.append(" (no activity)");
        pw.println(sb.toString());

        printControllerActivity(pw, sb, prefix, "WiFi", getWifiControllerActivity(), which);
        printControllerActivity(pw, sb, prefix, WIFI_CONTROLLER_NAME,
            getWifiControllerActivity(), which);

        pw.print(prefix);
        sb.setLength(0);
@@ -5238,8 +5281,8 @@ public abstract class BatteryStats implements Parcelable {
                pw.println(sb.toString());
            }

            printControllerActivityIfInteresting(pw, sb, prefix + "  ", "Modem",
                    u.getModemControllerActivity(), which);
            printControllerActivityIfInteresting(pw, sb, prefix + "  ",
                CELLULAR_CONTROLLER_NAME, u.getModemControllerActivity(), which);

            if (wifiRxBytes > 0 || wifiTxBytes > 0 || wifiRxPackets > 0 || wifiTxPackets > 0) {
                pw.print(prefix); pw.print("    Wi-Fi network: ");
@@ -5293,7 +5336,7 @@ public abstract class BatteryStats implements Parcelable {
                pw.println(sb.toString());
            }

            printControllerActivityIfInteresting(pw, sb, prefix + "  ", "WiFi",
            printControllerActivityIfInteresting(pw, sb, prefix + "  ", WIFI_CONTROLLER_NAME,
                    u.getWifiControllerActivity(), which);

            if (btRxBytes > 0 || btTxBytes > 0) {
+20 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.os.connectivity;

/** {@hide} */
parcelable WifiBatteryStats;
 No newline at end of file
+279 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.os.connectivity;

import android.os.BatteryStats;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.Arrays;

/**
 * API for Wifi power stats
 *
 * @hide
 */
public final class WifiBatteryStats implements Parcelable {

  private long mLoggingDurationMs;
  private long mKernelActiveTimeMs;
  private long mNumPacketsTx;
  private long mNumBytesTx;
  private long mNumPacketsRx;
  private long mNumBytesRx;
  private long mSleepTimeMs;
  private long mScanTimeMs;
  private long mIdleTimeMs;
  private long mRxTimeMs;
  private long mTxTimeMs;
  private long mEnergyConsumedMaMs;
  private long mNumAppScanRequest;
  private long[] mTimeInStateMs;
  private long[] mTimeInSupplicantStateMs;
  private long[] mTimeInRxSignalStrengthLevelMs;

  public static final Parcelable.Creator<WifiBatteryStats> CREATOR = new
      Parcelable.Creator<WifiBatteryStats>() {
        public WifiBatteryStats createFromParcel(Parcel in) {
          return new WifiBatteryStats(in);
        }

        public WifiBatteryStats[] newArray(int size) {
          return new WifiBatteryStats[size];
        }
      };

  public WifiBatteryStats() {
    initialize();
  }

  public void writeToParcel(Parcel out, int flags) {
    out.writeLong(mLoggingDurationMs);
    out.writeLong(mKernelActiveTimeMs);
    out.writeLong(mNumPacketsTx);
    out.writeLong(mNumBytesTx);
    out.writeLong(mNumPacketsRx);
    out.writeLong(mNumBytesRx);
    out.writeLong(mSleepTimeMs);
    out.writeLong(mScanTimeMs);
    out.writeLong(mIdleTimeMs);
    out.writeLong(mRxTimeMs);
    out.writeLong(mTxTimeMs);
    out.writeLong(mEnergyConsumedMaMs);
    out.writeLong(mNumAppScanRequest);
    out.writeLongArray(mTimeInStateMs);
    out.writeLongArray(mTimeInRxSignalStrengthLevelMs);
    out.writeLongArray(mTimeInSupplicantStateMs);
  }

  public void readFromParcel(Parcel in) {
    mLoggingDurationMs = in.readLong();
    mKernelActiveTimeMs = in.readLong();
    mNumPacketsTx = in.readLong();
    mNumBytesTx = in.readLong();
    mNumPacketsRx = in.readLong();
    mNumBytesRx = in.readLong();
    mSleepTimeMs = in.readLong();
    mScanTimeMs = in.readLong();
    mIdleTimeMs = in.readLong();
    mRxTimeMs = in.readLong();
    mTxTimeMs = in.readLong();
    mEnergyConsumedMaMs = in.readLong();
    mNumAppScanRequest = in.readLong();
    in.readLongArray(mTimeInStateMs);
    in.readLongArray(mTimeInRxSignalStrengthLevelMs);
    in.readLongArray(mTimeInSupplicantStateMs);
  }

  public long getLoggingDurationMs() {
    return mLoggingDurationMs;
  }

  public long getKernelActiveTimeMs() {
    return mKernelActiveTimeMs;
  }

  public long getNumPacketsTx() {
    return mNumPacketsTx;
  }

  public long getNumBytesTx() {
    return mNumBytesTx;
  }

  public long getNumPacketsRx() {
    return mNumPacketsRx;
  }

  public long getNumBytesRx() {
    return mNumBytesRx;
  }

  public long getSleepTimeMs() {
    return mSleepTimeMs;
  }

  public long getScanTimeMs() {
    return mScanTimeMs;
  }

  public long getIdleTimeMs() {
    return mIdleTimeMs;
  }

  public long getRxTimeMs() {
    return mRxTimeMs;
  }

  public long getTxTimeMs() {
    return mTxTimeMs;
  }

  public long getEnergyConsumedMaMs() {
    return mEnergyConsumedMaMs;
  }

  public long getNumAppScanRequest() {
    return mNumAppScanRequest;
  }

  public long[] getTimeInStateMs() {
    return mTimeInStateMs;
  }

  public long[] getTimeInRxSignalStrengthLevelMs() {
    return mTimeInRxSignalStrengthLevelMs;
  }

  public long[] getTimeInSupplicantStateMs() {
    return mTimeInSupplicantStateMs;
  }

  public void setLoggingDurationMs(long t) {
    mLoggingDurationMs = t;
    return;
  }

  public void setKernelActiveTimeMs(long t) {
    mKernelActiveTimeMs = t;
    return;
  }

  public void setNumPacketsTx(long n) {
    mNumPacketsTx = n;
    return;
  }

  public void setNumBytesTx(long b) {
    mNumBytesTx = b;
    return;
  }

  public void setNumPacketsRx(long n) {
    mNumPacketsRx = n;
    return;
  }

  public void setNumBytesRx(long b) {
    mNumBytesRx = b;
    return;
  }

  public void setSleepTimeMs(long t) {
    mSleepTimeMs = t;
    return;
  }

  public void setScanTimeMs(long t) {
    mScanTimeMs = t;
    return;
  }

  public void setIdleTimeMs(long t) {
    mIdleTimeMs = t;
    return;
  }

  public void setRxTimeMs(long t) {
    mRxTimeMs = t;
    return;
  }

  public void setTxTimeMs(long t) {
    mTxTimeMs = t;
    return;
  }

  public void setEnergyConsumedMaMs(long e) {
    mEnergyConsumedMaMs = e;
    return;
  }

  public void setNumAppScanRequest(long n) {
    mNumAppScanRequest = n;
    return;
  }

  public void setTimeInStateMs(long[] t) {
    mTimeInStateMs = Arrays.copyOfRange(t, 0,
        Math.min(t.length, BatteryStats.NUM_WIFI_STATES));
    return;
  }

  public void setTimeInRxSignalStrengthLevelMs(long[] t) {
    mTimeInRxSignalStrengthLevelMs = Arrays.copyOfRange(t, 0,
        Math.min(t.length, BatteryStats.NUM_WIFI_SIGNAL_STRENGTH_BINS));
    return;
  }

  public void setTimeInSupplicantStateMs(long[] t) {
    mTimeInSupplicantStateMs = Arrays.copyOfRange(
        t, 0, Math.min(t.length, BatteryStats.NUM_WIFI_SUPPL_STATES));
    return;
  }

  public int describeContents() {
    return 0;
  }

  private WifiBatteryStats(Parcel in) {
    initialize();
    readFromParcel(in);
  }

  private void initialize() {
    mLoggingDurationMs = 0;
    mKernelActiveTimeMs = 0;
    mNumPacketsTx = 0;
    mNumBytesTx = 0;
    mNumPacketsRx = 0;
    mNumBytesRx = 0;
    mSleepTimeMs = 0;
    mScanTimeMs = 0;
    mIdleTimeMs = 0;
    mRxTimeMs = 0;
    mTxTimeMs = 0;
    mEnergyConsumedMaMs = 0;
    mNumAppScanRequest = 0;
    mTimeInStateMs = new long[BatteryStats.NUM_WIFI_STATES];
    Arrays.fill(mTimeInStateMs, 0);
    mTimeInRxSignalStrengthLevelMs = new long[BatteryStats.NUM_WIFI_SIGNAL_STRENGTH_BINS];
    Arrays.fill(mTimeInRxSignalStrengthLevelMs, 0);
    mTimeInSupplicantStateMs = new long[BatteryStats.NUM_WIFI_SUPPL_STATES];
    Arrays.fill(mTimeInSupplicantStateMs, 0);
    return;
  }
}
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.net.wifi.WifiActivityEnergyInfo;
import android.os.ParcelFileDescriptor;
import android.os.WorkSource;
import android.os.connectivity.CellularBatteryStats;
import android.os.connectivity.WifiBatteryStats;
import android.os.connectivity.GpsBatteryStats;
import android.os.health.HealthStatsParceler;
import android.telephony.DataConnectionRealTimeInfo;
@@ -142,6 +143,9 @@ interface IBatteryStats {
    /** {@hide} */
    CellularBatteryStats getCellularBatteryStats();

    /** {@hide} */
    WifiBatteryStats getWifiBatteryStats();

    /** {@hide} */
    GpsBatteryStats getGpsBatteryStats();

+95 −7

File changed.

Preview size limit exceeded, changes collapsed.

Loading