Loading api/system-current.txt +18 −0 Original line number Diff line number Diff line Loading @@ -8445,6 +8445,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<android.telephony.ModemActivityInfo.TransmitPower> getTransmitPowerInfo(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR; field public static final int TX_POWER_LEVELS = 5; // 0x5 } public class ModemActivityInfo.TransmitPower { method @NonNull public android.util.Range<java.lang.Integer> getPowerRangeInDbm(); method public int getTimeInMillis(); } public final class NetworkRegistrationInfo implements android.os.Parcelable { method public int describeContents(); method public int getAccessNetworkTechnology(); cmds/statsd/src/atoms.proto +1 −1 Original line number Diff line number Diff line Loading @@ -3957,7 +3957,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]; } /** Loading core/java/com/android/internal/os/BatteryStatsImpl.java +24 −20 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.provider.Settings; import android.telephony.CellSignalStrength; 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; Loading Loading @@ -10978,7 +10979,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) { Loading @@ -10986,15 +10987,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; } Loading Loading @@ -11037,10 +11037,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. Loading @@ -11052,13 +11053,14 @@ 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, CellSignalStrength.getNumSignalStrengthLevels()); i++) { energyUsed += txTimeMs[i] * mPowerProfile.getAveragePower( PowerProfile.POWER_MODEM_CONTROLLER_TX, i); List<TransmitPower> txPowerInfo = deltaInfo.getTransmitPowerInfo(); for (int i = 0; i < Math.min(txPowerInfo.size(), SignalStrength.NUM_SIGNAL_STRENGTH_BINS); i++) { energyUsed += txPowerInfo.get(i).getTimeInMillis() * mPowerProfile .getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, i); } // We store the power drain as mAms. Loading Loading @@ -11147,15 +11149,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); } Loading Loading @@ -11186,15 +11189,16 @@ public class BatteryStatsImpl extends BatteryStats { if (activityInfo == null) { return; } int[] txTimeMs = activityInfo.getTxTimeMillis(); if (txTimeMs == null || txTimeMs.length != ModemActivityInfo.TX_POWER_LEVELS) { List<TransmitPower> 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; } } Loading services/core/java/com/android/server/stats/StatsCompanionService.java +6 −7 Original line number Diff line number Diff line Loading @@ -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); } } Loading telephony/java/android/telephony/ModemActivityInfo.java +122 −51 Original line number Diff line number Diff line Loading @@ -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 * <ul> * <li> index 0 = tx_power < 0dBm. </li> * <li> index 1 = 0dBm < tx_power < 5dBm. </li> * <li> index 2 = 5dBm < tx_power < 15dBm. </li> * <li> index 3 = 15dBm < tx_power < 20dBm. </li> * <li> index 4 = tx_power > 20dBm. </li> * </ul> */ public static final int TX_POWER_LEVELS = 5; private static final Range<Integer>[] 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<TransmitPower> 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 Loading @@ -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 + "}"; } Loading @@ -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) { Loading @@ -92,107 +112,158 @@ public class ModemActivityInfo implements Parcelable { } }; public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeLong(mTimestamp); 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<TransmitPower> getTransmitPowerInfo() { return mTransmitPowerInfo; } /** @hide */ public void setTransmitTimeMillis(int[] txTimeMs) { populateTransmitPowerRange(txTimeMs); } public void setTxTimeMillis(int[] txTimeMs) { mTxTimeMs = 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<Integer> mPowerRangeInDbm; /** @hide */ public TransmitPower(@NonNull Range<Integer> 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<Integer> getPowerRangeInDbm() { return mPowerRangeInDbm; } @Override public String toString() { return "TransmitPower{" + " mTimeInMillis=" + mTimeInMillis + " mPowerRangeInDbm={" + mPowerRangeInDbm.getLower() + "," + mPowerRangeInDbm.getUpper() + "}}"; } } } Loading
api/system-current.txt +18 −0 Original line number Diff line number Diff line Loading @@ -8445,6 +8445,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<android.telephony.ModemActivityInfo.TransmitPower> getTransmitPowerInfo(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR; field public static final int TX_POWER_LEVELS = 5; // 0x5 } public class ModemActivityInfo.TransmitPower { method @NonNull public android.util.Range<java.lang.Integer> getPowerRangeInDbm(); method public int getTimeInMillis(); } public final class NetworkRegistrationInfo implements android.os.Parcelable { method public int describeContents(); method public int getAccessNetworkTechnology();
cmds/statsd/src/atoms.proto +1 −1 Original line number Diff line number Diff line Loading @@ -3957,7 +3957,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]; } /** Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +24 −20 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.provider.Settings; import android.telephony.CellSignalStrength; 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; Loading Loading @@ -10978,7 +10979,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) { Loading @@ -10986,15 +10987,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; } Loading Loading @@ -11037,10 +11037,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. Loading @@ -11052,13 +11053,14 @@ 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, CellSignalStrength.getNumSignalStrengthLevels()); i++) { energyUsed += txTimeMs[i] * mPowerProfile.getAveragePower( PowerProfile.POWER_MODEM_CONTROLLER_TX, i); List<TransmitPower> txPowerInfo = deltaInfo.getTransmitPowerInfo(); for (int i = 0; i < Math.min(txPowerInfo.size(), SignalStrength.NUM_SIGNAL_STRENGTH_BINS); i++) { energyUsed += txPowerInfo.get(i).getTimeInMillis() * mPowerProfile .getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, i); } // We store the power drain as mAms. Loading Loading @@ -11147,15 +11149,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); } Loading Loading @@ -11186,15 +11189,16 @@ public class BatteryStatsImpl extends BatteryStats { if (activityInfo == null) { return; } int[] txTimeMs = activityInfo.getTxTimeMillis(); if (txTimeMs == null || txTimeMs.length != ModemActivityInfo.TX_POWER_LEVELS) { List<TransmitPower> 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; } } Loading
services/core/java/com/android/server/stats/StatsCompanionService.java +6 −7 Original line number Diff line number Diff line Loading @@ -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); } } Loading
telephony/java/android/telephony/ModemActivityInfo.java +122 −51 Original line number Diff line number Diff line Loading @@ -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 * <ul> * <li> index 0 = tx_power < 0dBm. </li> * <li> index 1 = 0dBm < tx_power < 5dBm. </li> * <li> index 2 = 5dBm < tx_power < 15dBm. </li> * <li> index 3 = 15dBm < tx_power < 20dBm. </li> * <li> index 4 = tx_power > 20dBm. </li> * </ul> */ public static final int TX_POWER_LEVELS = 5; private static final Range<Integer>[] 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<TransmitPower> 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 Loading @@ -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 + "}"; } Loading @@ -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) { Loading @@ -92,107 +112,158 @@ public class ModemActivityInfo implements Parcelable { } }; public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeLong(mTimestamp); 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<TransmitPower> getTransmitPowerInfo() { return mTransmitPowerInfo; } /** @hide */ public void setTransmitTimeMillis(int[] txTimeMs) { populateTransmitPowerRange(txTimeMs); } public void setTxTimeMillis(int[] txTimeMs) { mTxTimeMs = 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<Integer> mPowerRangeInDbm; /** @hide */ public TransmitPower(@NonNull Range<Integer> 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<Integer> getPowerRangeInDbm() { return mPowerRangeInDbm; } @Override public String toString() { return "TransmitPower{" + " mTimeInMillis=" + mTimeInMillis + " mPowerRangeInDbm={" + mPowerRangeInDbm.getLower() + "," + mPowerRangeInDbm.getUpper() + "}}"; } } }