From 7322e4a7ce0ba5a331df215e48d6f68f2cf890b9 Mon Sep 17 00:00:00 2001 From: Chen Xu Date: Sat, 7 Sep 2019 15:51:22 -0700 Subject: [PATCH] Expose ModemActivitiyInfo to system API ModemActivityInfo is used for batteryStatusService which is part of system service. To prepare telephony to be an mainline module, we should expose ModemActivityInfo to systemAPI 1. remove getConsumedPower API as we are missing modem support, API today only report 0 2. isValid API is introduced to cover modem issues before. Do not expose this for now. Bug: 140908357 Test: Build Change-Id: I6e1b0daa2e0ce23b9fd55f0dd7037631b93eb7a5 --- api/system-current.txt | 18 ++ cmds/statsd/src/atoms.proto | 2 +- .../android/internal/os/BatteryStatsImpl.java | 41 +++-- .../server/stats/StatsCompanionService.java | 13 +- .../android/telephony/ModemActivityInfo.java | 171 +++++++++++++----- 5 files changed, 168 insertions(+), 77 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 1c5f772f2e1b7..a4a4aea520070 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7736,6 +7736,24 @@ package android.telephony { field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming"; } + public final class ModemActivityInfo implements android.os.Parcelable { + ctor public ModemActivityInfo(long, int, int, @NonNull int[], int); + method public int describeContents(); + method public int getIdleTimeMillis(); + method public int getReceiveTimeMillis(); + method public int getSleepTimeMillis(); + method public long getTimestamp(); + method @NonNull public java.util.List getTransmitPowerInfo(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field public static final int TX_POWER_LEVELS = 5; // 0x5 + } + + public class ModemActivityInfo.TransmitPower { + method @NonNull public android.util.Range getPowerRangeInDbm(); + method public int getTimeInMillis(); + } + public final class NetworkRegistrationInfo implements android.os.Parcelable { method public int describeContents(); method public int getAccessNetworkTechnology(); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 2c8a5562c9796..b4c86ef6f1b5d 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -3967,7 +3967,7 @@ message ModemActivityInfo { // rx time in ms at power level 5 optional uint64 controller_rx_time_millis = 9; // product of current(mA), voltage(V) and time(ms) - optional uint64 energy_used = 10; + optional uint64 energy_used = 10 [deprecated=true]; } /** diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 8503ab82ac484..898b7119358f9 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -60,6 +60,7 @@ import android.os.connectivity.WifiBatteryStats; import android.provider.Settings; import android.telephony.DataConnectionRealTimeInfo; import android.telephony.ModemActivityInfo; +import android.telephony.ModemActivityInfo.TransmitPower; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; @@ -10975,7 +10976,7 @@ public class BatteryStatsImpl extends BatteryStats { } private ModemActivityInfo mLastModemActivityInfo = - new ModemActivityInfo(0, 0, 0, new int[0], 0, 0); + new ModemActivityInfo(0, 0, 0, new int[0], 0); private ModemActivityInfo getDeltaModemActivityInfo(ModemActivityInfo activityInfo) { if (activityInfo == null) { @@ -10983,15 +10984,14 @@ public class BatteryStatsImpl extends BatteryStats { } int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS]; for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) { - txTimeMs[i] = activityInfo.getTxTimeMillis()[i] - - mLastModemActivityInfo.getTxTimeMillis()[i]; + txTimeMs[i] = activityInfo.getTransmitPowerInfo().get(i).getTimeInMillis() + - mLastModemActivityInfo.getTransmitPowerInfo().get(i).getTimeInMillis(); } ModemActivityInfo deltaInfo = new ModemActivityInfo(activityInfo.getTimestamp(), activityInfo.getSleepTimeMillis() - mLastModemActivityInfo.getSleepTimeMillis(), activityInfo.getIdleTimeMillis() - mLastModemActivityInfo.getIdleTimeMillis(), txTimeMs, - activityInfo.getRxTimeMillis() - mLastModemActivityInfo.getRxTimeMillis(), - activityInfo.getEnergyUsed() - mLastModemActivityInfo.getEnergyUsed()); + activityInfo.getReceiveTimeMillis() - mLastModemActivityInfo.getReceiveTimeMillis()); mLastModemActivityInfo = activityInfo; return deltaInfo; } @@ -11034,10 +11034,11 @@ public class BatteryStatsImpl extends BatteryStats { deltaInfo.getIdleTimeMillis()); mModemActivity.getSleepTimeCounter().addCountLocked( deltaInfo.getSleepTimeMillis()); - mModemActivity.getRxTimeCounter().addCountLocked(deltaInfo.getRxTimeMillis()); + mModemActivity.getRxTimeCounter().addCountLocked(deltaInfo.getReceiveTimeMillis()); for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { mModemActivity.getTxTimeCounters()[lvl] - .addCountLocked(deltaInfo.getTxTimeMillis()[lvl]); + .addCountLocked(deltaInfo.getTransmitPowerInfo() + .get(lvl).getTimeInMillis()); } // POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V. @@ -11049,13 +11050,13 @@ public class BatteryStatsImpl extends BatteryStats { mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_SLEEP) + deltaInfo.getIdleTimeMillis() * mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_IDLE) - + deltaInfo.getRxTimeMillis() * + + deltaInfo.getReceiveTimeMillis() * mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX); - int[] txTimeMs = deltaInfo.getTxTimeMillis(); - for (int i = 0; i < Math.min(txTimeMs.length, + List txPowerInfo = deltaInfo.getTransmitPowerInfo(); + for (int i = 0; i < Math.min(txPowerInfo.size(), SignalStrength.NUM_SIGNAL_STRENGTH_BINS); i++) { - energyUsed += txTimeMs[i] * mPowerProfile.getAveragePower( - PowerProfile.POWER_MODEM_CONTROLLER_TX, i); + energyUsed += txPowerInfo.get(i).getTimeInMillis() * mPowerProfile + .getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, i); } // We store the power drain as mAms. @@ -11144,15 +11145,16 @@ public class BatteryStatsImpl extends BatteryStats { ControllerActivityCounterImpl activityCounter = u.getOrCreateModemControllerActivityLocked(); if (totalRxPackets > 0 && entry.rxPackets > 0) { - final long rxMs = (entry.rxPackets * deltaInfo.getRxTimeMillis()) - / totalRxPackets; + final long rxMs = (entry.rxPackets + * deltaInfo.getReceiveTimeMillis()) / totalRxPackets; activityCounter.getRxTimeCounter().addCountLocked(rxMs); } if (totalTxPackets > 0 && entry.txPackets > 0) { for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { long txMs = - entry.txPackets * deltaInfo.getTxTimeMillis()[lvl]; + entry.txPackets * deltaInfo.getTransmitPowerInfo() + .get(lvl).getTimeInMillis(); txMs /= totalTxPackets; activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs); } @@ -11183,15 +11185,16 @@ public class BatteryStatsImpl extends BatteryStats { if (activityInfo == null) { return; } - int[] txTimeMs = activityInfo.getTxTimeMillis(); - if (txTimeMs == null || txTimeMs.length != ModemActivityInfo.TX_POWER_LEVELS) { + List txPowerInfo = activityInfo.getTransmitPowerInfo(); + if (txPowerInfo == null || txPowerInfo.size() != ModemActivityInfo.TX_POWER_LEVELS) { return; } final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); int levelMaxTimeSpent = 0; - for (int i = 1; i < txTimeMs.length; i++) { - if (txTimeMs[i] > txTimeMs[levelMaxTimeSpent]) { + for (int i = 1; i < txPowerInfo.size(); i++) { + if (txPowerInfo.get(i).getTimeInMillis() > txPowerInfo.get(levelMaxTimeSpent) + .getTimeInMillis()) { levelMaxTimeSpent = i; } } diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index c76bbb05a3595..0d28b463a622a 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -1112,13 +1112,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { e.writeLong(modemInfo.getTimestamp()); e.writeLong(modemInfo.getSleepTimeMillis()); e.writeLong(modemInfo.getIdleTimeMillis()); - e.writeLong(modemInfo.getTxTimeMillis()[0]); - e.writeLong(modemInfo.getTxTimeMillis()[1]); - e.writeLong(modemInfo.getTxTimeMillis()[2]); - e.writeLong(modemInfo.getTxTimeMillis()[3]); - e.writeLong(modemInfo.getTxTimeMillis()[4]); - e.writeLong(modemInfo.getRxTimeMillis()); - e.writeLong(modemInfo.getEnergyUsed()); + e.writeLong(modemInfo.getTransmitPowerInfo().get(0).getTimeInMillis()); + e.writeLong(modemInfo.getTransmitPowerInfo().get(1).getTimeInMillis()); + e.writeLong(modemInfo.getTransmitPowerInfo().get(2).getTimeInMillis()); + e.writeLong(modemInfo.getTransmitPowerInfo().get(3).getTimeInMillis()); + e.writeLong(modemInfo.getTransmitPowerInfo().get(4).getTimeInMillis()); + e.writeLong(modemInfo.getReceiveTimeMillis()); pulledData.add(e); } } diff --git a/telephony/java/android/telephony/ModemActivityInfo.java b/telephony/java/android/telephony/ModemActivityInfo.java index a0af392fc6d5f..43bc85c9f2bdf 100644 --- a/telephony/java/android/telephony/ModemActivityInfo.java +++ b/telephony/java/android/telephony/ModemActivityInfo.java @@ -16,43 +16,65 @@ package android.telephony; +import android.annotation.NonNull; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; +import android.util.Range; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** - * Reports modem activity information + * Reports modem activity information. * @hide */ -public class ModemActivityInfo implements Parcelable { +@SystemApi +public final class ModemActivityInfo implements Parcelable { /** - * Tx power index - * index 0 = tx_power < 0dBm - * index 1 = 0dBm < tx_power < 5dBm - * index 2 = 5dBm < tx_power < 15dBm - * index 3 = 15dBm < tx_power < 20dBm - * index 4 = tx_power > 20dBm + * Tx(transmit) power level. see power index below + *
    + *
  • index 0 = tx_power < 0dBm.
  • + *
  • index 1 = 0dBm < tx_power < 5dBm.
  • + *
  • index 2 = 5dBm < tx_power < 15dBm.
  • + *
  • index 3 = 15dBm < tx_power < 20dBm.
  • + *
  • index 4 = tx_power > 20dBm.
  • + *
*/ public static final int TX_POWER_LEVELS = 5; + private static final Range[] TX_POWER_RANGES = new Range[] { + new Range<>(Integer.MIN_VALUE, 0), + new Range<>(0, 5), + new Range<>(5, 15), + new Range<>(15, 20), + new Range<>(20, Integer.MAX_VALUE) + + }; private long mTimestamp; private int mSleepTimeMs; private int mIdleTimeMs; - private int [] mTxTimeMs = new int[TX_POWER_LEVELS]; + private List mTransmitPowerInfo = new ArrayList<>(TX_POWER_LEVELS); private int mRxTimeMs; - private int mEnergyUsed; public ModemActivityInfo(long timestamp, int sleepTimeMs, int idleTimeMs, - int[] txTimeMs, int rxTimeMs, int energyUsed) { + @NonNull int[] txTimeMs, int rxTimeMs) { mTimestamp = timestamp; mSleepTimeMs = sleepTimeMs; mIdleTimeMs = idleTimeMs; if (txTimeMs != null) { - System.arraycopy(txTimeMs, 0, mTxTimeMs, 0, Math.min(txTimeMs.length, TX_POWER_LEVELS)); + populateTransmitPowerRange(txTimeMs); } mRxTimeMs = rxTimeMs; - mEnergyUsed = energyUsed; + } + + /** helper API to populate tx power range for each bucket **/ + private void populateTransmitPowerRange(@NonNull int[] transmitPowerMs) { + for (int i = 0; i < Math.min(transmitPowerMs.length, TX_POWER_LEVELS); i++) { + mTransmitPowerInfo.add(i, new TransmitPower(TX_POWER_RANGES[i], transmitPowerMs[i])); + } } @Override @@ -61,9 +83,8 @@ public class ModemActivityInfo implements Parcelable { + " mTimestamp=" + mTimestamp + " mSleepTimeMs=" + mSleepTimeMs + " mIdleTimeMs=" + mIdleTimeMs - + " mTxTimeMs[]=" + Arrays.toString(mTxTimeMs) + + " mTransmitPowerInfo[]=" + mTransmitPowerInfo.toString() + " mRxTimeMs=" + mRxTimeMs - + " mEnergyUsed=" + mEnergyUsed + "}"; } @@ -82,9 +103,8 @@ public class ModemActivityInfo implements Parcelable { txTimeMs[i] = in.readInt(); } int rxTimeMs = in.readInt(); - int energyUsed = in.readInt(); return new ModemActivityInfo(timestamp, sleepTimeMs, idleTimeMs, - txTimeMs, rxTimeMs, energyUsed); + txTimeMs, rxTimeMs); } public ModemActivityInfo[] newArray(int size) { @@ -97,102 +117,153 @@ public class ModemActivityInfo implements Parcelable { dest.writeInt(mSleepTimeMs); dest.writeInt(mIdleTimeMs); for (int i = 0; i < TX_POWER_LEVELS; i++) { - dest.writeInt(mTxTimeMs[i]); + dest.writeInt(mTransmitPowerInfo.get(i).getTimeInMillis()); } dest.writeInt(mRxTimeMs); - dest.writeInt(mEnergyUsed); } /** - * @return timestamp of record creation + * @return milliseconds since boot, including mTimeInMillis spent in sleep. + * @see SystemClock#elapsedRealtime() */ public long getTimestamp() { return mTimestamp; } + /** @hide */ public void setTimestamp(long timestamp) { mTimestamp = timestamp; } /** - * @return tx time in ms. It's an array of tx times - * with each index... + * @return an arrayList of {@link TransmitPower} with each element representing the total time where + * transmitter is awake time (in ms) for a given power range (in dbm). + * + * @see #TX_POWER_LEVELS */ - public int [] getTxTimeMillis() { - return mTxTimeMs; + @NonNull + public List getTransmitPowerInfo() { + return mTransmitPowerInfo; } - public void setTxTimeMillis(int[] txTimeMs) { - mTxTimeMs = txTimeMs; + /** @hide */ + public void setTransmitTimeMillis(int[] txTimeMs) { + populateTransmitPowerRange(txTimeMs); + } + + /** @hide */ + @NonNull + public int[] getTransmitTimeMillis() { + int[] transmitTimeMillis = new int[TX_POWER_LEVELS]; + for (int i = 0; i < transmitTimeMillis.length; i++) { + transmitTimeMillis[i] = mTransmitPowerInfo.get(i).getTimeInMillis(); + } + return transmitTimeMillis; } /** - * @return sleep time in ms. + * @return total mTimeInMillis (in ms) when modem is in a low power or sleep state. */ public int getSleepTimeMillis() { return mSleepTimeMs; } + /** @hide */ public void setSleepTimeMillis(int sleepTimeMillis) { mSleepTimeMs = sleepTimeMillis; } /** - * @return idle time in ms. + * @return total mTimeInMillis (in ms) when modem is awake but neither the transmitter nor receiver are + * active. */ public int getIdleTimeMillis() { return mIdleTimeMs; } + /** @hide */ public void setIdleTimeMillis(int idleTimeMillis) { mIdleTimeMs = idleTimeMillis; } /** - * @return rx time in ms. + * @return rx(receive) mTimeInMillis in ms. */ - public int getRxTimeMillis() { + public int getReceiveTimeMillis() { return mRxTimeMs; } - public void setRxTimeMillis(int rxTimeMillis) { + /** @hide */ + public void setReceiveTimeMillis(int rxTimeMillis) { mRxTimeMs = rxTimeMillis; } /** - * product of current(mA), voltage(V) and time(ms) - * @return energy used - */ - public int getEnergyUsed () { - return mEnergyUsed; - } - - public void setEnergyUsed(int energyUsed) { - mEnergyUsed = energyUsed; - } - - /** - * @return if the record is valid + * @return {@code true} if this {@link ModemActivityInfo} record is valid, + * {@code false} otherwise. + * + * @hide */ public boolean isValid() { - for (int txVal : getTxTimeMillis()) { - if(txVal < 0) { + for (TransmitPower powerInfo : getTransmitPowerInfo()) { + if(powerInfo.getTimeInMillis() < 0) { return false; } } return ((getIdleTimeMillis() >= 0) && (getSleepTimeMillis() >= 0) - && (getRxTimeMillis() >= 0) && (getEnergyUsed() >= 0) && !isEmpty()); + && (getReceiveTimeMillis() >= 0) && !isEmpty()); } private boolean isEmpty() { - for (int txVal : getTxTimeMillis()) { - if(txVal != 0) { + for (TransmitPower txVal : getTransmitPowerInfo()) { + if(txVal.getTimeInMillis() != 0) { return false; } } return ((getIdleTimeMillis() == 0) && (getSleepTimeMillis() == 0) - && (getRxTimeMillis() == 0) && (getEnergyUsed() == 0)); + && (getReceiveTimeMillis() == 0)); + } + + /** + * Transmit power Information, including the power range in dbm and the total time (in ms) where + * the transmitter is active/awake for this power range. + * e.g, range: 0dbm(lower) ~ 5dbm(upper) + * time: 5ms + */ + public class TransmitPower { + private int mTimeInMillis; + private Range mPowerRangeInDbm; + /** @hide */ + public TransmitPower(@NonNull Range range, int time) { + this.mTimeInMillis = time; + this.mPowerRangeInDbm = range; + } + + /** + * @return the total time in ms where the transmitter is active/wake for this power range + * {@link #getPowerRangeInDbm()}. + */ + public int getTimeInMillis() { + return mTimeInMillis; + } + + /** + * @return the power range in dbm. e.g, range: 0dbm(lower) ~ 5dbm(upper) + */ + @NonNull + public Range getPowerRangeInDbm() { + return mPowerRangeInDbm; + } + + @Override + public String toString() { + return "TransmitPower{" + + " mTimeInMillis=" + mTimeInMillis + + " mPowerRangeInDbm={" + mPowerRangeInDbm.getLower() + + "," + mPowerRangeInDbm.getUpper() + + "}}"; + } } }