diff options
| author | 2019-07-11 00:48:42 +0000 | |
|---|---|---|
| committer | 2019-07-11 00:48:42 +0000 | |
| commit | d5872ea21f9157c1988481bb3ba4e29f3da2b079 (patch) | |
| tree | aa134d0da8ceaf9f646a052bbedbb751d866e4f4 | |
| parent | f0c8097075d174d80f5a3e33be842dd215dd1545 (diff) | |
| parent | 1c572559c658205b42f06230361cd18e73c842ad (diff) | |
Merge "Improve dumpsys formatting"
7 files changed, 460 insertions, 449 deletions
diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java index 78239714ca3b..274e0e4c2b65 100644 --- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java +++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java @@ -40,127 +40,116 @@ import java.util.Arrays; */ public class GnssMetrics { - private static final String TAG = GnssMetrics.class.getSimpleName(); + private static final String TAG = GnssMetrics.class.getSimpleName(); - /* Constant which indicates GPS signal quality is as yet unknown */ - public static final int GPS_SIGNAL_QUALITY_UNKNOWN = - ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_UNKNOWN; // -1 + /* Constant which indicates GPS signal quality is as yet unknown */ + private static final int GPS_SIGNAL_QUALITY_UNKNOWN = + ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_UNKNOWN; // -1 - /* Constant which indicates GPS signal quality is poor */ - public static final int GPS_SIGNAL_QUALITY_POOR = - ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_POOR; // 0 + /* Constant which indicates GPS signal quality is poor */ + private static final int GPS_SIGNAL_QUALITY_POOR = + ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_POOR; // 0 - /* Constant which indicates GPS signal quality is good */ - public static final int GPS_SIGNAL_QUALITY_GOOD = - ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_GOOD; // 1 + /* Constant which indicates GPS signal quality is good */ + private static final int GPS_SIGNAL_QUALITY_GOOD = + ServerLocationProtoEnums.GPS_SIGNAL_QUALITY_GOOD; // 1 - /* Number of GPS signal quality levels */ - public static final int NUM_GPS_SIGNAL_QUALITY_LEVELS = GPS_SIGNAL_QUALITY_GOOD + 1; + /* Number of GPS signal quality levels */ + public static final int NUM_GPS_SIGNAL_QUALITY_LEVELS = GPS_SIGNAL_QUALITY_GOOD + 1; - /** Default time between location fixes (in millisecs) */ - private static final int DEFAULT_TIME_BETWEEN_FIXES_MILLISECS = 1000; + /** Default time between location fixes (in millisecs) */ + private static final int DEFAULT_TIME_BETWEEN_FIXES_MILLISECS = 1000; - /* The time since boot when logging started */ - private String logStartInElapsedRealTime; + /* The time since boot when logging started */ + private String mLogStartInElapsedRealTime; - /* GNSS power metrics */ - private GnssPowerMetrics mGnssPowerMetrics; + /* GNSS power metrics */ + private GnssPowerMetrics mGnssPowerMetrics; - /** - * A boolean array indicating whether the constellation types have been used in fix. - */ + /* A boolean array indicating whether the constellation types have been used in fix. */ private boolean[] mConstellationTypes; - - /** Constructor */ - public GnssMetrics(IBatteryStats stats) { - mGnssPowerMetrics = new GnssPowerMetrics(stats); - locationFailureStatistics = new Statistics(); - timeToFirstFixSecStatistics = new Statistics(); - positionAccuracyMeterStatistics = new Statistics(); - topFourAverageCn0Statistics = new Statistics(); - reset(); - } - - /** - * Logs the status of a location report received from the HAL - * - * @param isSuccessful - */ - public void logReceivedLocationStatus(boolean isSuccessful) { - if (!isSuccessful) { - locationFailureStatistics.addItem(1.0); - return; + /** Location failure statistics */ + private Statistics mLocationFailureStatistics; + /** Time to first fix statistics */ + private Statistics mTimeToFirstFixSecStatistics; + /** Position accuracy statistics */ + private Statistics mPositionAccuracyMeterStatistics; + /** Top 4 average CN0 statistics */ + private Statistics mTopFourAverageCn0Statistics; + + public GnssMetrics(IBatteryStats stats) { + mGnssPowerMetrics = new GnssPowerMetrics(stats); + mLocationFailureStatistics = new Statistics(); + mTimeToFirstFixSecStatistics = new Statistics(); + mPositionAccuracyMeterStatistics = new Statistics(); + mTopFourAverageCn0Statistics = new Statistics(); + reset(); } - locationFailureStatistics.addItem(0.0); - return; - } - - /** - * Logs missed reports - * - * @param desiredTimeBetweenFixesMilliSeconds - * @param actualTimeBetweenFixesMilliSeconds - */ - public void logMissedReports(int desiredTimeBetweenFixesMilliSeconds, - int actualTimeBetweenFixesMilliSeconds) { - int numReportMissed = (actualTimeBetweenFixesMilliSeconds / - Math.max(DEFAULT_TIME_BETWEEN_FIXES_MILLISECS, desiredTimeBetweenFixesMilliSeconds)) - 1; - if (numReportMissed > 0) { - for (int i = 0; i < numReportMissed; i++) { - locationFailureStatistics.addItem(1.0); - } + + /** + * Logs the status of a location report received from the HAL + */ + public void logReceivedLocationStatus(boolean isSuccessful) { + if (!isSuccessful) { + mLocationFailureStatistics.addItem(1.0); + return; + } + mLocationFailureStatistics.addItem(0.0); } - return; - } - - /** - * Logs time to first fix - * - * @param timeToFirstFixMilliSeconds - */ - public void logTimeToFirstFixMilliSecs(int timeToFirstFixMilliSeconds) { - timeToFirstFixSecStatistics.addItem((double) (timeToFirstFixMilliSeconds/1000)); - return; - } - - /** - * Logs position accuracy - * - * @param positionAccuracyMeters - */ - public void logPositionAccuracyMeters(float positionAccuracyMeters) { - positionAccuracyMeterStatistics.addItem((double) positionAccuracyMeters); - return; - } - - /* - * Logs CN0 when at least 4 SVs are available - * - */ - public void logCn0(float[] cn0s, int numSv) { - if (numSv == 0 || cn0s == null || cn0s.length == 0 || cn0s.length < numSv) { - if (numSv == 0) { - mGnssPowerMetrics.reportSignalQuality(null, 0); - } - return; + + /** + * Logs missed reports + */ + public void logMissedReports(int desiredTimeBetweenFixesMilliSeconds, + int actualTimeBetweenFixesMilliSeconds) { + int numReportMissed = (actualTimeBetweenFixesMilliSeconds / Math.max( + DEFAULT_TIME_BETWEEN_FIXES_MILLISECS, desiredTimeBetweenFixesMilliSeconds)) - 1; + if (numReportMissed > 0) { + for (int i = 0; i < numReportMissed; i++) { + mLocationFailureStatistics.addItem(1.0); + } + } } - float[] cn0Array = Arrays.copyOf(cn0s, numSv); - Arrays.sort(cn0Array); - mGnssPowerMetrics.reportSignalQuality(cn0Array, numSv); - if (numSv < 4) { - return; + + /** + * Logs time to first fix + */ + public void logTimeToFirstFixMilliSecs(int timeToFirstFixMilliSeconds) { + mTimeToFirstFixSecStatistics.addItem((double) (timeToFirstFixMilliSeconds / 1000)); } - if (cn0Array[numSv - 4] > 0.0) { - double top4AvgCn0 = 0.0; - for (int i = numSv - 4; i < numSv; i++) { - top4AvgCn0 += (double) cn0Array[i]; - } - top4AvgCn0 /= 4; - topFourAverageCn0Statistics.addItem(top4AvgCn0); + + /** + * Logs position accuracy + */ + public void logPositionAccuracyMeters(float positionAccuracyMeters) { + mPositionAccuracyMeterStatistics.addItem((double) positionAccuracyMeters); } - return; - } + /** + * Logs CN0 when at least 4 SVs are available + */ + public void logCn0(float[] cn0s, int numSv) { + if (numSv == 0 || cn0s == null || cn0s.length == 0 || cn0s.length < numSv) { + if (numSv == 0) { + mGnssPowerMetrics.reportSignalQuality(null, 0); + } + return; + } + float[] cn0Array = Arrays.copyOf(cn0s, numSv); + Arrays.sort(cn0Array); + mGnssPowerMetrics.reportSignalQuality(cn0Array, numSv); + if (numSv < 4) { + return; + } + if (cn0Array[numSv - 4] > 0.0) { + double top4AvgCn0 = 0.0; + for (int i = numSv - 4; i < numSv; i++) { + top4AvgCn0 += (double) cn0Array[i]; + } + top4AvgCn0 /= 4; + mTopFourAverageCn0Statistics.addItem(top4AvgCn0); + } + } /** * Logs that a constellation type has been observed. @@ -173,82 +162,82 @@ public class GnssMetrics { mConstellationTypes[constellationType] = true; } - /** - * Dumps GNSS metrics as a proto string - * @return - */ - public String dumpGnssMetricsAsProtoString() { - GnssLog msg = new GnssLog(); - if (locationFailureStatistics.getCount() > 0) { - msg.numLocationReportProcessed = locationFailureStatistics.getCount(); - msg.percentageLocationFailure = (int) (100.0 * locationFailureStatistics.getMean()); - } - if (timeToFirstFixSecStatistics.getCount() > 0) { - msg.numTimeToFirstFixProcessed = timeToFirstFixSecStatistics.getCount(); - msg.meanTimeToFirstFixSecs = (int) timeToFirstFixSecStatistics.getMean(); - msg.standardDeviationTimeToFirstFixSecs - = (int) timeToFirstFixSecStatistics.getStandardDeviation(); - } - if (positionAccuracyMeterStatistics.getCount() > 0) { - msg.numPositionAccuracyProcessed = positionAccuracyMeterStatistics.getCount(); - msg.meanPositionAccuracyMeters = (int) positionAccuracyMeterStatistics.getMean(); - msg.standardDeviationPositionAccuracyMeters - = (int) positionAccuracyMeterStatistics.getStandardDeviation(); - } - if (topFourAverageCn0Statistics.getCount() > 0) { - msg.numTopFourAverageCn0Processed = topFourAverageCn0Statistics.getCount(); - msg.meanTopFourAverageCn0DbHz = topFourAverageCn0Statistics.getMean(); - msg.standardDeviationTopFourAverageCn0DbHz - = topFourAverageCn0Statistics.getStandardDeviation(); - } - msg.powerMetrics = mGnssPowerMetrics.buildProto(); - msg.hardwareRevision = SystemProperties.get("ro.boot.revision", ""); - String s = Base64.encodeToString(GnssLog.toByteArray(msg), Base64.DEFAULT); - reset(); - return s; - } - - /** - * Dumps GNSS Metrics as text - * - * @return GNSS Metrics - */ - public String dumpGnssMetricsAsText() { - StringBuilder s = new StringBuilder(); - s.append("GNSS_KPI_START").append('\n'); - s.append(" KPI logging start time: ").append(logStartInElapsedRealTime).append("\n"); - s.append(" KPI logging end time: "); - TimeUtils.formatDuration(SystemClock.elapsedRealtimeNanos() / 1000000L, s); - s.append("\n"); - s.append(" Number of location reports: ").append( - locationFailureStatistics.getCount()).append("\n"); - if (locationFailureStatistics.getCount() > 0) { - s.append(" Percentage location failure: ").append( - 100.0 * locationFailureStatistics.getMean()).append("\n"); - } - s.append(" Number of TTFF reports: ").append( - timeToFirstFixSecStatistics.getCount()).append("\n"); - if (timeToFirstFixSecStatistics.getCount() > 0) { - s.append(" TTFF mean (sec): ").append(timeToFirstFixSecStatistics.getMean()).append("\n"); - s.append(" TTFF standard deviation (sec): ").append( - timeToFirstFixSecStatistics.getStandardDeviation()).append("\n"); - } - s.append(" Number of position accuracy reports: ").append( - positionAccuracyMeterStatistics.getCount()).append("\n"); - if (positionAccuracyMeterStatistics.getCount() > 0) { - s.append(" Position accuracy mean (m): ").append( - positionAccuracyMeterStatistics.getMean()).append("\n"); - s.append(" Position accuracy standard deviation (m): ").append( - positionAccuracyMeterStatistics.getStandardDeviation()).append("\n"); - } - s.append(" Number of CN0 reports: ").append( - topFourAverageCn0Statistics.getCount()).append("\n"); - if (topFourAverageCn0Statistics.getCount() > 0) { - s.append(" Top 4 Avg CN0 mean (dB-Hz): ").append( - topFourAverageCn0Statistics.getMean()).append("\n"); - s.append(" Top 4 Avg CN0 standard deviation (dB-Hz): ").append( - topFourAverageCn0Statistics.getStandardDeviation()).append("\n"); + /** + * Dumps GNSS metrics as a proto string + */ + public String dumpGnssMetricsAsProtoString() { + GnssLog msg = new GnssLog(); + if (mLocationFailureStatistics.getCount() > 0) { + msg.numLocationReportProcessed = mLocationFailureStatistics.getCount(); + msg.percentageLocationFailure = (int) (100.0 * mLocationFailureStatistics.getMean()); + } + if (mTimeToFirstFixSecStatistics.getCount() > 0) { + msg.numTimeToFirstFixProcessed = mTimeToFirstFixSecStatistics.getCount(); + msg.meanTimeToFirstFixSecs = (int) mTimeToFirstFixSecStatistics.getMean(); + msg.standardDeviationTimeToFirstFixSecs = + (int) mTimeToFirstFixSecStatistics.getStandardDeviation(); + } + if (mPositionAccuracyMeterStatistics.getCount() > 0) { + msg.numPositionAccuracyProcessed = mPositionAccuracyMeterStatistics.getCount(); + msg.meanPositionAccuracyMeters = (int) mPositionAccuracyMeterStatistics.getMean(); + msg.standardDeviationPositionAccuracyMeters = + (int) mPositionAccuracyMeterStatistics.getStandardDeviation(); + } + if (mTopFourAverageCn0Statistics.getCount() > 0) { + msg.numTopFourAverageCn0Processed = mTopFourAverageCn0Statistics.getCount(); + msg.meanTopFourAverageCn0DbHz = mTopFourAverageCn0Statistics.getMean(); + msg.standardDeviationTopFourAverageCn0DbHz = + mTopFourAverageCn0Statistics.getStandardDeviation(); + } + msg.powerMetrics = mGnssPowerMetrics.buildProto(); + msg.hardwareRevision = SystemProperties.get("ro.boot.revision", ""); + String s = Base64.encodeToString(GnssLog.toByteArray(msg), Base64.DEFAULT); + reset(); + return s; } + + /** + * Dumps GNSS Metrics as text + * + * @return GNSS Metrics + */ + public String dumpGnssMetricsAsText() { + StringBuilder s = new StringBuilder(); + s.append("GNSS_KPI_START").append('\n'); + s.append(" KPI logging start time: ").append(mLogStartInElapsedRealTime).append("\n"); + s.append(" KPI logging end time: "); + TimeUtils.formatDuration(SystemClock.elapsedRealtimeNanos() / 1000000L, s); + s.append("\n"); + s.append(" Number of location reports: ").append( + mLocationFailureStatistics.getCount()).append("\n"); + if (mLocationFailureStatistics.getCount() > 0) { + s.append(" Percentage location failure: ").append( + 100.0 * mLocationFailureStatistics.getMean()).append("\n"); + } + s.append(" Number of TTFF reports: ").append( + mTimeToFirstFixSecStatistics.getCount()).append("\n"); + if (mTimeToFirstFixSecStatistics.getCount() > 0) { + s.append(" TTFF mean (sec): ").append(mTimeToFirstFixSecStatistics.getMean()).append( + "\n"); + s.append(" TTFF standard deviation (sec): ").append( + mTimeToFirstFixSecStatistics.getStandardDeviation()).append("\n"); + } + s.append(" Number of position accuracy reports: ").append( + mPositionAccuracyMeterStatistics.getCount()).append("\n"); + if (mPositionAccuracyMeterStatistics.getCount() > 0) { + s.append(" Position accuracy mean (m): ").append( + mPositionAccuracyMeterStatistics.getMean()).append("\n"); + s.append(" Position accuracy standard deviation (m): ").append( + mPositionAccuracyMeterStatistics.getStandardDeviation()).append("\n"); + } + s.append(" Number of CN0 reports: ").append( + mTopFourAverageCn0Statistics.getCount()).append("\n"); + if (mTopFourAverageCn0Statistics.getCount() > 0) { + s.append(" Top 4 Avg CN0 mean (dB-Hz): ").append( + mTopFourAverageCn0Statistics.getMean()).append("\n"); + s.append(" Top 4 Avg CN0 standard deviation (dB-Hz): ").append( + mTopFourAverageCn0Statistics.getStandardDeviation()).append("\n"); + } s.append(" Used-in-fix constellation types: "); for (int i = 0; i < mConstellationTypes.length; i++) { if (mConstellationTypes[i]) { @@ -256,199 +245,193 @@ public class GnssMetrics { } } s.append("\n"); - s.append("GNSS_KPI_END").append("\n"); - GpsBatteryStats stats = mGnssPowerMetrics.getGpsBatteryStats(); - if (stats != null) { - s.append("Power Metrics").append("\n"); - s.append(" Time on battery (min): " - + stats.getLoggingDurationMs() / ((double) DateUtils.MINUTE_IN_MILLIS)).append("\n"); - long[] t = stats.getTimeInGpsSignalQualityLevel(); - if (t != null && t.length == NUM_GPS_SIGNAL_QUALITY_LEVELS) { - s.append(" Amount of time (while on battery) Top 4 Avg CN0 > " + - Double.toString(GnssPowerMetrics.POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ) + - " dB-Hz (min): ").append(t[1] / ((double) DateUtils.MINUTE_IN_MILLIS)).append("\n"); - s.append(" Amount of time (while on battery) Top 4 Avg CN0 <= " + - Double.toString(GnssPowerMetrics.POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ) + - " dB-Hz (min): ").append(t[0] / ((double) DateUtils.MINUTE_IN_MILLIS)).append("\n"); - } - s.append(" Energy consumed while on battery (mAh): ").append( - stats.getEnergyConsumedMaMs() / ((double) DateUtils.HOUR_IN_MILLIS)).append("\n"); - } - s.append("Hardware Version: " + SystemProperties.get("ro.boot.revision", "")).append("\n"); - return s.toString(); - } - - /** Class for storing statistics */ - private class Statistics { - - /** Resets statistics */ - public void reset() { - count = 0; - sum = 0.0; - sumSquare = 0.0; + s.append("GNSS_KPI_END").append("\n"); + GpsBatteryStats stats = mGnssPowerMetrics.getGpsBatteryStats(); + if (stats != null) { + s.append("Power Metrics").append("\n"); + s.append(" Time on battery (min): ").append( + stats.getLoggingDurationMs() / ((double) DateUtils.MINUTE_IN_MILLIS)).append( + "\n"); + long[] t = stats.getTimeInGpsSignalQualityLevel(); + if (t != null && t.length == NUM_GPS_SIGNAL_QUALITY_LEVELS) { + s.append(" Amount of time (while on battery) Top 4 Avg CN0 > " + + GnssPowerMetrics.POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ + + " dB-Hz (min): ").append( + t[1] / ((double) DateUtils.MINUTE_IN_MILLIS)).append("\n"); + s.append(" Amount of time (while on battery) Top 4 Avg CN0 <= " + + GnssPowerMetrics.POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ + + " dB-Hz (min): ").append( + t[0] / ((double) DateUtils.MINUTE_IN_MILLIS)).append("\n"); + } + s.append(" Energy consumed while on battery (mAh): ").append( + stats.getEnergyConsumedMaMs() / ((double) DateUtils.HOUR_IN_MILLIS)).append( + "\n"); + } + s.append("Hardware Version: ").append(SystemProperties.get("ro.boot.revision", "")).append( + "\n"); + return s.toString(); } - /** Adds an item */ - public void addItem(double item) { - count++; - sum += item; - sumSquare += item * item; + private void reset() { + StringBuilder s = new StringBuilder(); + TimeUtils.formatDuration(SystemClock.elapsedRealtimeNanos() / 1000000L, s); + mLogStartInElapsedRealTime = s.toString(); + mLocationFailureStatistics.reset(); + mTimeToFirstFixSecStatistics.reset(); + mPositionAccuracyMeterStatistics.reset(); + mTopFourAverageCn0Statistics.reset(); + resetConstellationTypes(); } - /** Returns number of items added */ - public int getCount() { - return count; + /** Resets {@link #mConstellationTypes} as an all-false boolean array. */ + public void resetConstellationTypes() { + mConstellationTypes = new boolean[GnssStatus.CONSTELLATION_COUNT]; } - /** Returns mean */ - public double getMean() { - return sum/count; - } + /** Class for storing statistics */ + private class Statistics { - /** Returns standard deviation */ - public double getStandardDeviation() { - double m = sum/count; - m = m * m; - double v = sumSquare/count; - if (v > m) { - return Math.sqrt(v - m); - } - return 0; - } + private int mCount; + private double mSum; + private double mSumSquare; - private int count; - private double sum; - private double sumSquare; - } - - /** Location failure statistics */ - private Statistics locationFailureStatistics; - - /** Time to first fix statistics */ - private Statistics timeToFirstFixSecStatistics; - - /** Position accuracy statistics */ - private Statistics positionAccuracyMeterStatistics; - - /** Top 4 average CN0 statistics */ - private Statistics topFourAverageCn0Statistics; - - /** - * Resets GNSS metrics - */ - private void reset() { - StringBuilder s = new StringBuilder(); - TimeUtils.formatDuration(SystemClock.elapsedRealtimeNanos() / 1000000L, s); - logStartInElapsedRealTime = s.toString(); - locationFailureStatistics.reset(); - timeToFirstFixSecStatistics.reset(); - positionAccuracyMeterStatistics.reset(); - topFourAverageCn0Statistics.reset(); - resetConstellationTypes(); - return; - } + /** Resets statistics */ + public void reset() { + mCount = 0; + mSum = 0.0; + mSumSquare = 0.0; + } - /** Resets {@link #mConstellationTypes} as an all-false boolean array. */ - public void resetConstellationTypes() { - mConstellationTypes = new boolean[GnssStatus.CONSTELLATION_COUNT]; + /** Adds an item */ + public void addItem(double item) { + mCount++; + mSum += item; + mSumSquare += item * item; + } + + /** Returns number of items added */ + public int getCount() { + return mCount; + } + + /** Returns mean */ + public double getMean() { + return mSum / mCount; + } + + /** Returns standard deviation */ + public double getStandardDeviation() { + double m = mSum / mCount; + m = m * m; + double v = mSumSquare / mCount; + if (v > m) { + return Math.sqrt(v - m); + } + return 0; + } } - /* Class for handling GNSS power related metrics */ - private class GnssPowerMetrics { + /* Class for handling GNSS power related metrics */ + private class GnssPowerMetrics { - /* Threshold for Top Four Average CN0 below which GNSS signal quality is declared poor */ - public static final double POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ = 20.0; + /* Threshold for Top Four Average CN0 below which GNSS signal quality is declared poor */ + public static final double POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ = 20.0; - /* Minimum change in Top Four Average CN0 needed to trigger a report */ - private static final double REPORTING_THRESHOLD_DB_HZ = 1.0; + /* Minimum change in Top Four Average CN0 needed to trigger a report */ + private static final double REPORTING_THRESHOLD_DB_HZ = 1.0; - /* BatteryStats API */ - private final IBatteryStats mBatteryStats; + /* BatteryStats API */ + private final IBatteryStats mBatteryStats; - /* Last reported Top Four Average CN0 */ - private double mLastAverageCn0; + /* Last reported Top Four Average CN0 */ + private double mLastAverageCn0; - /* Last reported signal quality bin (based on Top Four Average CN0) */ - private int mLastSignalLevel; + /* Last reported signal quality bin (based on Top Four Average CN0) */ + private int mLastSignalLevel; - public GnssPowerMetrics(IBatteryStats stats) { - mBatteryStats = stats; - // Used to initialize the variable to a very small value (unachievable in practice) so that - // the first CNO report will trigger an update to BatteryStats - mLastAverageCn0 = -100.0; - mLastSignalLevel = GPS_SIGNAL_QUALITY_UNKNOWN; - } + private GnssPowerMetrics(IBatteryStats stats) { + mBatteryStats = stats; + // Used to initialize the variable to a very small value (unachievable in practice) + // so that + // the first CNO report will trigger an update to BatteryStats + mLastAverageCn0 = -100.0; + mLastSignalLevel = GPS_SIGNAL_QUALITY_UNKNOWN; + } - /** - * Builds power metrics proto buf. This is included in the gnss proto buf. - * @return PowerMetrics - */ - public PowerMetrics buildProto() { - PowerMetrics p = new PowerMetrics(); - GpsBatteryStats stats = mGnssPowerMetrics.getGpsBatteryStats(); - if (stats != null) { - p.loggingDurationMs = stats.getLoggingDurationMs(); - p.energyConsumedMah = stats.getEnergyConsumedMaMs() / ((double) DateUtils.HOUR_IN_MILLIS); - long[] t = stats.getTimeInGpsSignalQualityLevel(); - p.timeInSignalQualityLevelMs = new long[t.length]; - for (int i = 0; i < t.length; i++) { - p.timeInSignalQualityLevelMs[i] = t[i]; + /** + * Builds power metrics proto buf. This is included in the gnss proto buf. + * + * @return PowerMetrics + */ + public PowerMetrics buildProto() { + PowerMetrics p = new PowerMetrics(); + GpsBatteryStats stats = mGnssPowerMetrics.getGpsBatteryStats(); + if (stats != null) { + p.loggingDurationMs = stats.getLoggingDurationMs(); + p.energyConsumedMah = + stats.getEnergyConsumedMaMs() / ((double) DateUtils.HOUR_IN_MILLIS); + long[] t = stats.getTimeInGpsSignalQualityLevel(); + p.timeInSignalQualityLevelMs = new long[t.length]; + for (int i = 0; i < t.length; i++) { + p.timeInSignalQualityLevelMs[i] = t[i]; + } + } + return p; } - } - return p; - } - /** - * Returns the GPS power stats - * @return GpsBatteryStats - */ - public GpsBatteryStats getGpsBatteryStats() { - try { - return mBatteryStats.getGpsBatteryStats(); - } catch (Exception e) { - Log.w(TAG, "Exception", e); - return null; - } - } + /** + * Returns the GPS power stats + * + * @return GpsBatteryStats + */ + public GpsBatteryStats getGpsBatteryStats() { + try { + return mBatteryStats.getGpsBatteryStats(); + } catch (Exception e) { + Log.w(TAG, "Exception", e); + return null; + } + } - /** - * Reports signal quality to BatteryStats. Signal quality is based on Top four average CN0. If - * the number of SVs seen is less than 4, then signal quality is the average CN0. - * Changes are reported only if the average CN0 changes by more than REPORTING_THRESHOLD_DB_HZ. - */ - public void reportSignalQuality(float[] ascendingCN0Array, int numSv) { - double avgCn0 = 0.0; - if (numSv > 0) { - for (int i = Math.max(0, numSv - 4); i < numSv; i++) { - avgCn0 += (double) ascendingCN0Array[i]; + /** + * Reports signal quality to BatteryStats. Signal quality is based on Top four average CN0. + * If + * the number of SVs seen is less than 4, then signal quality is the average CN0. + * Changes are reported only if the average CN0 changes by more than + * REPORTING_THRESHOLD_DB_HZ. + */ + public void reportSignalQuality(float[] ascendingCN0Array, int numSv) { + double avgCn0 = 0.0; + if (numSv > 0) { + for (int i = Math.max(0, numSv - 4); i < numSv; i++) { + avgCn0 += (double) ascendingCN0Array[i]; + } + avgCn0 /= Math.min(numSv, 4); + } + if (Math.abs(avgCn0 - mLastAverageCn0) < REPORTING_THRESHOLD_DB_HZ) { + return; + } + int signalLevel = getSignalLevel(avgCn0); + if (signalLevel != mLastSignalLevel) { + StatsLog.write(StatsLog.GPS_SIGNAL_QUALITY_CHANGED, signalLevel); + mLastSignalLevel = signalLevel; + } + try { + mBatteryStats.noteGpsSignalQuality(signalLevel); + mLastAverageCn0 = avgCn0; + } catch (Exception e) { + Log.w(TAG, "Exception", e); + } } - avgCn0 /= Math.min(numSv, 4); - } - if (Math.abs(avgCn0 - mLastAverageCn0) < REPORTING_THRESHOLD_DB_HZ) { - return; - } - int signalLevel = getSignalLevel(avgCn0); - if (signalLevel != mLastSignalLevel) { - StatsLog.write(StatsLog.GPS_SIGNAL_QUALITY_CHANGED, signalLevel); - mLastSignalLevel = signalLevel; - } - try { - mBatteryStats.noteGpsSignalQuality(signalLevel); - mLastAverageCn0 = avgCn0; - } catch (Exception e) { - Log.w(TAG, "Exception", e); - } - return; - } - /** - * Obtains signal level based on CN0 - */ - private int getSignalLevel(double cn0) { - if (cn0 > POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ) { - return GnssMetrics.GPS_SIGNAL_QUALITY_GOOD; - } - return GnssMetrics.GPS_SIGNAL_QUALITY_POOR; + /** + * Obtains signal level based on CN0 + */ + private int getSignalLevel(double cn0) { + if (cn0 > POOR_TOP_FOUR_AVG_CN0_THRESHOLD_DB_HZ) { + return GnssMetrics.GPS_SIGNAL_QUALITY_GOOD; + } + return GnssMetrics.GPS_SIGNAL_QUALITY_POOR; + } } - } } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 3ebe70266c71..9128ecc46162 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -97,6 +97,7 @@ import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; +import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.location.AbstractLocationProvider; import com.android.server.location.ActivityRecognitionProxy; @@ -1039,25 +1040,29 @@ public class LocationManagerService extends ILocationManager.Stub { } @GuardedBy("mLock") - public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.print(" " + mName + " provider"); + public void dumpLocked(FileDescriptor fd, IndentingPrintWriter pw, String[] args) { + pw.print(mName + " provider"); if (isMock()) { pw.print(" [mock]"); } pw.println(":"); - pw.println(" useable=" + mUseable); + pw.increaseIndent(); + + pw.println("useable=" + mUseable); if (!mUseable) { - pw.println(" attached=" + (mProvider != null)); + pw.println("attached=" + (mProvider != null)); if (mIsManagedBySettings) { - pw.println(" allowed=" + mAllowed); + pw.println("allowed=" + mAllowed); } - pw.println(" enabled=" + mEnabled); + pw.println("enabled=" + mEnabled); } - pw.println(" properties=" + mProperties); + pw.println("properties=" + mProperties); if (mProvider != null) { + // in order to be consistent with other provider APIs, this should be run on the + // location thread... but this likely isn't worth it just for dumping info. long identity = Binder.clearCallingIdentity(); try { mProvider.dump(fd, pw, args); @@ -1065,6 +1070,8 @@ public class LocationManagerService extends ILocationManager.Stub { Binder.restoreCallingIdentity(identity); } } + + pw.decreaseIndent(); } @GuardedBy("mLock") @@ -2916,6 +2923,12 @@ public class LocationManagerService extends ILocationManager.Stub { mCallerIdentity = callerIdentity; mListenerName = listenerName; } + + @Override + public String toString() { + return mListenerName + "[" + mCallerIdentity.mPackageName + "(" + mCallerIdentity.mPid + + ")]"; + } } private static class LinkedListener<TListener> extends LinkedListenerBase { @@ -3671,6 +3684,8 @@ public class LocationManagerService extends ILocationManager.Stub { protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); + synchronized (mLock) { if (args.length > 0 && args[0].equals("--gnssmetrics")) { if (mGnssMetricsProvider != null) { @@ -3678,115 +3693,133 @@ public class LocationManagerService extends ILocationManager.Stub { } return; } - pw.println("Current Location Manager state:"); - pw.print(" Current System Time: " + + ipw.println("Location Manager State:"); + ipw.increaseIndent(); + ipw.print("Current System Time: " + TimeUtils.logTimeOfDay(System.currentTimeMillis())); - pw.println(", Current Elapsed Time: " + ipw.println(", Current Elapsed Time: " + TimeUtils.formatDuration(SystemClock.elapsedRealtime())); - pw.println(" Current user: " + mCurrentUserId + " " + Arrays.toString( + ipw.println("Current user: " + mCurrentUserId + " " + Arrays.toString( mCurrentUserProfiles)); - pw.println(" Location mode: " + isLocationEnabled()); - pw.println(" Battery Saver Location Mode: " + ipw.println("Location Mode: " + isLocationEnabled()); + ipw.println("Battery Saver Location Mode: " + locationPowerSaveModeToString(mBatterySaverMode)); - pw.println(" Location Listeners:"); + + ipw.println("Location Listeners:"); + ipw.increaseIndent(); for (Receiver receiver : mReceivers.values()) { - pw.println(" " + receiver); + ipw.println(receiver); } - pw.println(" Active Records by Provider:"); + ipw.decreaseIndent(); + + ipw.println("Active Records by Provider:"); + ipw.increaseIndent(); for (Map.Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) { - pw.println(" " + entry.getKey() + ":"); + ipw.println(entry.getKey() + ":"); + ipw.increaseIndent(); for (UpdateRecord record : entry.getValue()) { - pw.println(" " + record); + ipw.println(record); } + ipw.decreaseIndent(); + } + ipw.decreaseIndent(); + + ipw.println("GnssMeasurement Listeners:"); + ipw.increaseIndent(); + for (LinkedListenerBase listener : mGnssMeasurementsListeners.values()) { + ipw.println(listener + ": " + isThrottlingExemptLocked(listener.mCallerIdentity)); + } + ipw.decreaseIndent(); + + ipw.println("GnssNavigationMessage Listeners:"); + ipw.increaseIndent(); + for (LinkedListenerBase listener : mGnssNavigationMessageListeners.values()) { + ipw.println(listener + ": " + isThrottlingExemptLocked(listener.mCallerIdentity)); } + ipw.decreaseIndent(); - pw.println(" Active GnssMeasurement Listeners:"); - dumpGnssDataListenersLocked(pw, mGnssMeasurementsListeners); - pw.println(" Active GnssNavigationMessage Listeners:"); - dumpGnssDataListenersLocked(pw, mGnssNavigationMessageListeners); - pw.println(" Active GnssStatus Listeners:"); - dumpGnssDataListenersLocked(pw, mGnssStatusListeners); + ipw.println("GnssStatus Listeners:"); + ipw.increaseIndent(); + for (LinkedListenerBase listener : mGnssStatusListeners.values()) { + ipw.println(listener + ": " + isThrottlingExemptLocked(listener.mCallerIdentity)); + } + ipw.decreaseIndent(); - pw.println(" Historical Records by Provider:"); + ipw.println("Historical Records by Provider:"); + ipw.increaseIndent(); for (Map.Entry<PackageProviderKey, PackageStatistics> entry : mRequestStatistics.statistics.entrySet()) { PackageProviderKey key = entry.getKey(); - PackageStatistics stats = entry.getValue(); - pw.println(" " + key.packageName + ": " + key.providerName + ": " + stats); + ipw.println(key.packageName + ": " + key.providerName + ": " + entry.getValue()); } - pw.println(" Last Known Locations:"); + ipw.decreaseIndent(); + + ipw.println("Last Known Locations:"); + ipw.increaseIndent(); for (Map.Entry<String, Location> entry : mLastLocation.entrySet()) { - String provider = entry.getKey(); - Location location = entry.getValue(); - pw.println(" " + provider + ": " + location); + ipw.println(entry.getKey() + ": " + entry.getValue()); } + ipw.decreaseIndent(); - pw.println(" Last Known Locations Coarse Intervals:"); + ipw.println("Last Known Coarse Locations:"); + ipw.increaseIndent(); for (Map.Entry<String, Location> entry : mLastLocationCoarseInterval.entrySet()) { - String provider = entry.getKey(); - Location location = entry.getValue(); - pw.println(" " + provider + ": " + location); + ipw.println(entry.getKey() + ": " + entry.getValue()); } + ipw.decreaseIndent(); if (mGeofenceManager != null) { - mGeofenceManager.dump(pw); - } else { - pw.println(" Geofences: null"); + ipw.println("Geofences:"); + ipw.increaseIndent(); + mGeofenceManager.dump(ipw); + ipw.decreaseIndent(); } if (mBlacklist != null) { - pw.append(" "); - mBlacklist.dump(pw); - } else { - pw.println(" mBlacklist=null"); + mBlacklist.dump(ipw); } if (mExtraLocationControllerPackage != null) { - pw.println(" Location controller extra package: " + mExtraLocationControllerPackage - + " enabled: " + mExtraLocationControllerPackageEnabled); + ipw.println("Location Controller Extra Package: " + mExtraLocationControllerPackage + + (mExtraLocationControllerPackageEnabled ? " [enabled]" : "[disabled]")); } if (!mBackgroundThrottlePackageWhitelist.isEmpty()) { - pw.println(" Throttling Whitelisted Packages:"); + ipw.println("Throttling Whitelisted Packages:"); + ipw.increaseIndent(); for (String packageName : mBackgroundThrottlePackageWhitelist) { - pw.println(" " + packageName); + ipw.println(packageName); } + ipw.decreaseIndent(); } if (!mIgnoreSettingsPackageWhitelist.isEmpty()) { - pw.println(" Bypass Whitelisted Packages:"); + ipw.println("Bypass Whitelisted Packages:"); + ipw.increaseIndent(); for (String packageName : mIgnoreSettingsPackageWhitelist) { - pw.println(" " + packageName); + ipw.println(packageName); } + ipw.decreaseIndent(); } if (mLocationFudger != null) { - pw.append(" fudger: "); - mLocationFudger.dump(fd, pw, args); - } else { - pw.println(" fudger: null"); + ipw.println("Location Fudger:"); + ipw.increaseIndent(); + mLocationFudger.dump(fd, ipw, args); + ipw.decreaseIndent(); } - if (args.length > 0 && "short".equals(args[0])) { - return; - } + ipw.println("Location Providers:"); + ipw.increaseIndent(); for (LocationProvider provider : mProviders) { - provider.dumpLocked(fd, pw, args); + provider.dumpLocked(fd, ipw, args); } + ipw.decreaseIndent(); + if (mGnssBatchingInProgress) { - pw.println(" GNSS batching in progress"); + ipw.println("GNSS batching in progress"); } } } - - @GuardedBy("mLock") - private void dumpGnssDataListenersLocked(PrintWriter pw, - ArrayMap<IBinder, ? extends LinkedListenerBase> gnssDataListeners) { - for (LinkedListenerBase listener : gnssDataListeners.values()) { - CallerIdentity callerIdentity = listener.mCallerIdentity; - pw.println(" " + callerIdentity.mPid + " " + callerIdentity.mUid + " " - + callerIdentity.mPackageName + ": " - + isThrottlingExemptLocked(callerIdentity)); - } - } } diff --git a/services/core/java/com/android/server/location/GeofenceManager.java b/services/core/java/com/android/server/location/GeofenceManager.java index fafe99c9fe18..a1922067e7cf 100644 --- a/services/core/java/com/android/server/location/GeofenceManager.java +++ b/services/core/java/com/android/server/location/GeofenceManager.java @@ -16,11 +16,6 @@ package com.android.server.location; -import java.io.PrintWriter; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - import android.app.AppOpsManager; import android.app.PendingIntent; import android.content.ContentResolver; @@ -44,6 +39,11 @@ import android.util.Slog; import com.android.server.LocationManagerService; import com.android.server.PendingIntentUtils; +import java.io.PrintWriter; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + public class GeofenceManager implements LocationListener, PendingIntent.OnFinished { private static final String TAG = "GeofenceManager"; private static final boolean D = LocationManagerService.D; @@ -79,13 +79,13 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish private final GeofenceHandler mHandler; private final LocationBlacklist mBlacklist; - private Object mLock = new Object(); + private final Object mLock = new Object(); // access to members below is synchronized on mLock /** * A list containing all registered geofences. */ - private List<GeofenceState> mFences = new LinkedList<GeofenceState>(); + private List<GeofenceState> mFences = new LinkedList<>(); /** * This is set true when we have an active request for {@link Location} updates via @@ -272,8 +272,8 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish */ // Runs on the handler. private void updateFences() { - List<PendingIntent> enterIntents = new LinkedList<PendingIntent>(); - List<PendingIntent> exitIntents = new LinkedList<PendingIntent>(); + List<PendingIntent> enterIntents = new LinkedList<>(); + List<PendingIntent> exitIntents = new LinkedList<>(); synchronized (mLock) { mPendingUpdate = false; @@ -446,14 +446,8 @@ public class GeofenceManager implements LocationListener, PendingIntent.OnFinish } public void dump(PrintWriter pw) { - pw.println(" Geofences:"); - for (GeofenceState state : mFences) { - pw.append(" "); - pw.append(state.mPackageName); - pw.append(" "); - pw.append(state.mFence.toString()); - pw.append("\n"); + pw.println(state.mPackageName + " " + state.mFence); } } diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 88576187163f..924b217170ce 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -2171,18 +2171,18 @@ public class GnssLocationProvider extends AbstractLocationProvider implements @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { StringBuilder s = new StringBuilder(); - s.append(" mStarted=").append(mStarted).append(" (changed "); + s.append("mStarted=").append(mStarted).append(" (changed "); TimeUtils.formatDuration(SystemClock.elapsedRealtime() - mStartedChangedElapsedRealtime, s); s.append(" ago)").append('\n'); - s.append(" mFixInterval=").append(mFixInterval).append('\n'); - s.append(" mLowPowerMode=").append(mLowPowerMode).append('\n'); - s.append(" mGnssMeasurementsProvider.isRegistered()=") + s.append("mFixInterval=").append(mFixInterval).append('\n'); + s.append("mLowPowerMode=").append(mLowPowerMode).append('\n'); + s.append("mGnssMeasurementsProvider.isRegistered()=") .append(mGnssMeasurementsProvider.isRegistered()).append('\n'); - s.append(" mGnssNavigationMessageProvider.isRegistered()=") + s.append("mGnssNavigationMessageProvider.isRegistered()=") .append(mGnssNavigationMessageProvider.isRegistered()).append('\n'); - s.append(" mDisableGpsForPowerManager=").append(mDisableGpsForPowerManager).append('\n'); - s.append(" mTopHalCapabilities=0x").append(Integer.toHexString(mTopHalCapabilities)); + s.append("mDisableGpsForPowerManager=").append(mDisableGpsForPowerManager).append('\n'); + s.append("mTopHalCapabilities=0x").append(Integer.toHexString(mTopHalCapabilities)); s.append(" ( "); if (hasCapability(GPS_CAPABILITY_SCHEDULING)) s.append("SCHEDULING "); if (hasCapability(GPS_CAPABILITY_MSB)) s.append("MSB "); @@ -2199,12 +2199,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } s.append(")\n"); if (hasCapability(GPS_CAPABILITY_MEASUREMENT_CORRECTIONS)) { - s.append(" SubHal=MEASUREMENT_CORRECTIONS["); + s.append("SubHal=MEASUREMENT_CORRECTIONS["); s.append(mGnssMeasurementCorrectionsProvider.toStringCapabilities()); s.append("]\n"); } s.append(mGnssMetrics.dumpGnssMetricsAsText()); - s.append(" native internal state: ").append(native_get_internal_state()); + s.append("native internal state: \n"); + s.append(" ").append(native_get_internal_state()); s.append("\n"); pw.append(s); } diff --git a/services/core/java/com/android/server/location/LocationProviderProxy.java b/services/core/java/com/android/server/location/LocationProviderProxy.java index ddbc20358a9d..3a7a249008e0 100644 --- a/services/core/java/com/android/server/location/LocationProviderProxy.java +++ b/services/core/java/com/android/server/location/LocationProviderProxy.java @@ -181,10 +181,10 @@ public class LocationProviderProxy extends AbstractLocationProvider { @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println(" service=" + mServiceWatcher); + pw.println("service=" + mServiceWatcher); synchronized (mProviderPackagesLock) { if (mProviderPackages.size() > 1) { - pw.println(" additional packages=" + mProviderPackages); + pw.println("additional packages=" + mProviderPackages); } } } diff --git a/services/core/java/com/android/server/location/MockProvider.java b/services/core/java/com/android/server/location/MockProvider.java index 6accad8a93a0..c645b5546b85 100644 --- a/services/core/java/com/android/server/location/MockProvider.java +++ b/services/core/java/com/android/server/location/MockProvider.java @@ -81,7 +81,7 @@ public class MockProvider extends AbstractLocationProvider { @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println(" last location=" + mLocation); + pw.println("last location=" + mLocation); } @Override diff --git a/services/core/java/com/android/server/location/PassiveProvider.java b/services/core/java/com/android/server/location/PassiveProvider.java index 3a841c91399e..7cba1aaca0d6 100644 --- a/services/core/java/com/android/server/location/PassiveProvider.java +++ b/services/core/java/com/android/server/location/PassiveProvider.java @@ -68,6 +68,6 @@ public class PassiveProvider extends AbstractLocationProvider { @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println(" report location=" + mReportLocation); + pw.println("report location=" + mReportLocation); } } |