Loading cmds/statsd/src/atoms.proto +66 −14 Original line number Diff line number Diff line Loading @@ -397,7 +397,7 @@ message Atom { } // Pulled events will start at field 10000. // Next: 10074 // Next: 10075 oneof pulled { WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"]; WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"]; Loading Loading @@ -478,6 +478,7 @@ message Atom { 10072 [(module) = "framework"]; PackageNotificationChannelGroupPreferences package_notification_channel_group_preferences = 10073 [(module) = "framework"]; GnssStats gnss_stats = 10074 [(module) = "framework"]; } // DO NOT USE field numbers above 100,000 in AOSP. Loading Loading @@ -8553,3 +8554,54 @@ message AppFreezeChanged { // Time since last unfrozen. optional int64 time_unfrozen_millis = 4; } /** * Logs gnss stats from location service provider * * Pulled from: * frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java */ message GnssStats { // Number of location reports since boot optional int64 location_reports = 1; // Total pulled reports of Location failures since boot optional int64 location_failure_reports = 2; // Number of time to first fix reports since boot optional int64 time_to_first_fix_reports = 3; // Total pulled reported time to first fix (in milli-seconds) since boot optional int64 time_to_first_fix_milli_s = 4; // Number of position accuracy reports since boot optional int64 position_accuracy_reports = 5; // Total pulled reported position accuracy (in meters) since boot optional int64 position_accuracy_meters = 6; // Number of top 4 average CN0 reports since boot optional int64 top_four_average_cn0_reports = 7; // Total pulled reported of top 4 average CN0 (dB-mHz) since boot optional int64 top_four_average_cn0_db_mhz = 8; // Number of l5 top 4 average CN0 reports since boot optional int64 l5_top_four_average_cn0_reports = 9; // Total pulled reported of l5 top 4 average CN0 (dB-mHz) since boot optional int64 l5_top_four_average_cn0_db_mhz = 10; // Total number of sv status messages reports since boot optional int64 sv_status_reports = 11; // Total number of sv status messages reports, where sv is used in fix since boot optional int64 sv_status_reports_used_in_fix = 12; // Total number of L5 sv status messages reports since boot optional int64 l5_sv_status_reports = 13; // Total number of L5 sv status messages reports, where sv is used in fix since boot optional int64 l5_sv_status_reports_used_in_fix = 14; } location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java +101 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.internal.location.gnssmetrics; import android.app.StatsManager; import android.content.Context; import android.location.GnssStatus; import android.os.SystemClock; import android.os.SystemProperties; Loading @@ -24,16 +26,19 @@ import android.server.location.ServerLocationProtoEnums; import android.text.format.DateUtils; import android.util.Base64; import android.util.Log; import android.util.StatsEvent; import android.util.TimeUtils; import com.android.internal.app.IBatteryStats; import com.android.internal.location.nano.GnssLogsProto.GnssLog; import com.android.internal.location.nano.GnssLogsProto.PowerMetrics; import com.android.internal.os.BackgroundThread; import com.android.internal.util.FrameworkStatsLog; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * GnssMetrics: Is used for logging GNSS metrics Loading Loading @@ -96,7 +101,34 @@ public class GnssMetrics { /** Total number of L5 sv status messages processed, where sv is used in fix */ private int mNumL5SvStatusUsedInFix; public GnssMetrics(IBatteryStats stats) { /* Statsd Logging Variables Section Start */ /** Location failure reports since boot used for statsd logging */ private Statistics mLocationFailureReportsStatistics; /** Time to first fix milli-seconds since boot used for statsd logging */ private Statistics mTimeToFirstFixMilliSReportsStatistics; /** Position accuracy meters since boot used for statsd logging */ private Statistics mPositionAccuracyMetersReportsStatistics; /** Top 4 average CN0 (db-mHz) since boot used for statsd logging */ private Statistics mTopFourAverageCn0DbmHzReportsStatistics; /** Top 4 average CN0 (db-mHz) L5 since boot used for statsd logging */ private Statistics mL5TopFourAverageCn0DbmHzReportsStatistics; /** Total number of sv status reports processed since boot used for statsd logging */ private long mSvStatusReports; /** Total number of L5 sv status reports processed since boot used for statsd logging */ private long mL5SvStatusReports; /** Total number of sv status reports processed, where sv is used in fix since boot used for * statsd logging */ private long mSvStatusReportsUsedInFix; /** Total number of L5 sv status reports processed, where sv is used in fix since boot used for * statsd logging */ private long mL5SvStatusReportsUsedInFix; /** Stats manager service for reporting atoms */ private StatsManager mStatsManager; /** Pull atom callback, this is called when atom pull request occurs */ private StatsPullAtomCallbackImpl mPullAtomCallback; /* Statds Logging Variables Section End */ public GnssMetrics(Context context, IBatteryStats stats) { mGnssPowerMetrics = new GnssPowerMetrics(stats); mLocationFailureStatistics = new Statistics(); mTimeToFirstFixSecStatistics = new Statistics(); Loading @@ -104,6 +136,13 @@ public class GnssMetrics { mTopFourAverageCn0Statistics = new Statistics(); mTopFourAverageCn0StatisticsL5 = new Statistics(); reset(); mLocationFailureReportsStatistics = new Statistics(); mTimeToFirstFixMilliSReportsStatistics = new Statistics(); mPositionAccuracyMetersReportsStatistics = new Statistics(); mTopFourAverageCn0DbmHzReportsStatistics = new Statistics(); mL5TopFourAverageCn0DbmHzReportsStatistics = new Statistics(); mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER); registerGnssStats(); } /** Loading @@ -112,9 +151,11 @@ public class GnssMetrics { public void logReceivedLocationStatus(boolean isSuccessful) { if (!isSuccessful) { mLocationFailureStatistics.addItem(1.0); mLocationFailureReportsStatistics.addItem(1.0); return; } mLocationFailureStatistics.addItem(0.0); mLocationFailureReportsStatistics.addItem(0.0); } /** Loading @@ -127,6 +168,7 @@ public class GnssMetrics { if (numReportMissed > 0) { for (int i = 0; i < numReportMissed; i++) { mLocationFailureStatistics.addItem(1.0); mLocationFailureReportsStatistics.addItem(1.0); } } } Loading @@ -136,6 +178,7 @@ public class GnssMetrics { */ public void logTimeToFirstFixMilliSecs(int timeToFirstFixMilliSeconds) { mTimeToFirstFixSecStatistics.addItem((double) (timeToFirstFixMilliSeconds / 1000)); mTimeToFirstFixMilliSReportsStatistics.addItem(timeToFirstFixMilliSeconds); } /** Loading @@ -143,6 +186,7 @@ public class GnssMetrics { */ public void logPositionAccuracyMeters(float positionAccuracyMeters) { mPositionAccuracyMeterStatistics.addItem((double) positionAccuracyMeters); mPositionAccuracyMetersReportsStatistics.addItem(positionAccuracyMeters); } /** Loading Loading @@ -174,6 +218,8 @@ public class GnssMetrics { } top4AvgCn0 /= 4; mTopFourAverageCn0Statistics.addItem(top4AvgCn0); // Convert to mHz for accuracy mTopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000); } } /* Helper function to check if a SV is L5 */ Loading @@ -191,14 +237,18 @@ public class GnssMetrics { for (int i = 0; i < status.getSatelliteCount(); i++) { if (status.hasCarrierFrequencyHz(i)) { mNumSvStatus++; mSvStatusReports++; isL5 = isL5Sv(status.getCarrierFrequencyHz(i)); if (isL5) { mNumL5SvStatus++; mL5SvStatusReports++; } if (status.usedInFix(i)) { mNumSvStatusUsedInFix++; mSvStatusReportsUsedInFix++; if (isL5) { mNumL5SvStatusUsedInFix++; mL5SvStatusReportsUsedInFix++; } } } Loading Loading @@ -233,6 +283,8 @@ public class GnssMetrics { } top4AvgCn0 /= 4; mTopFourAverageCn0StatisticsL5.addItem(top4AvgCn0); // Convert to mHz for accuracy mL5TopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000); } return; } Loading Loading @@ -421,12 +473,14 @@ public class GnssMetrics { private int mCount; private double mSum; private double mSumSquare; private long mLongSum; /** Resets statistics */ public void reset() { mCount = 0; mSum = 0.0; mSumSquare = 0.0; mLongSum = 0; } /** Adds an item */ Loading @@ -434,6 +488,7 @@ public class GnssMetrics { mCount++; mSum += item; mSumSquare += item * item; mLongSum += item; } /** Returns number of items added */ Loading @@ -456,6 +511,11 @@ public class GnssMetrics { } return 0; } /** Returns long sum */ public long getLongSum() { return mLongSum; } } /* Class for handling GNSS power related metrics */ Loading Loading @@ -561,4 +621,44 @@ public class GnssMetrics { return GnssMetrics.GPS_SIGNAL_QUALITY_POOR; } } private void registerGnssStats() { mPullAtomCallback = new StatsPullAtomCallbackImpl(); mStatsManager.registerPullAtomCallback( FrameworkStatsLog.GNSS_STATS, null, // use default PullAtomMetadata values BackgroundThread.getExecutor(), mPullAtomCallback); } /** * Stats Pull Atom Callback * Calls the pull method to fill out gnss stats */ private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback { @Override public int onPullAtom(int atomTag, List<StatsEvent> data) { if (atomTag != FrameworkStatsLog.GNSS_STATS) { throw new UnsupportedOperationException("Unknown tagId = " + atomTag); } StatsEvent e = StatsEvent.newBuilder() .setAtomId(atomTag) .writeLong(mLocationFailureReportsStatistics.getCount()) .writeLong(mLocationFailureReportsStatistics.getLongSum()) .writeLong(mTimeToFirstFixMilliSReportsStatistics.getCount()) .writeLong(mTimeToFirstFixMilliSReportsStatistics.getLongSum()) .writeLong(mPositionAccuracyMetersReportsStatistics.getCount()) .writeLong(mPositionAccuracyMetersReportsStatistics.getLongSum()) .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getCount()) .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getLongSum()) .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getCount()) .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getLongSum()) .writeLong(mSvStatusReports) .writeLong(mSvStatusReportsUsedInFix) .writeLong(mL5SvStatusReports) .writeLong(mL5SvStatusReportsUsedInFix) .build(); data.add(e); return StatsManager.PULL_SUCCESS; } } } services/core/java/com/android/server/location/GnssLocationProvider.java +1 −1 Original line number Diff line number Diff line Loading @@ -714,7 +714,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } }; mGnssMetrics = new GnssMetrics(mBatteryStats); mGnssMetrics = new GnssMetrics(mContext, mBatteryStats); mNtpTimeHelper = new NtpTimeHelper(mContext, mLooper, this); GnssSatelliteBlacklistHelper gnssSatelliteBlacklistHelper = new GnssSatelliteBlacklistHelper(mContext, Loading Loading
cmds/statsd/src/atoms.proto +66 −14 Original line number Diff line number Diff line Loading @@ -397,7 +397,7 @@ message Atom { } // Pulled events will start at field 10000. // Next: 10074 // Next: 10075 oneof pulled { WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"]; WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"]; Loading Loading @@ -478,6 +478,7 @@ message Atom { 10072 [(module) = "framework"]; PackageNotificationChannelGroupPreferences package_notification_channel_group_preferences = 10073 [(module) = "framework"]; GnssStats gnss_stats = 10074 [(module) = "framework"]; } // DO NOT USE field numbers above 100,000 in AOSP. Loading Loading @@ -8553,3 +8554,54 @@ message AppFreezeChanged { // Time since last unfrozen. optional int64 time_unfrozen_millis = 4; } /** * Logs gnss stats from location service provider * * Pulled from: * frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java */ message GnssStats { // Number of location reports since boot optional int64 location_reports = 1; // Total pulled reports of Location failures since boot optional int64 location_failure_reports = 2; // Number of time to first fix reports since boot optional int64 time_to_first_fix_reports = 3; // Total pulled reported time to first fix (in milli-seconds) since boot optional int64 time_to_first_fix_milli_s = 4; // Number of position accuracy reports since boot optional int64 position_accuracy_reports = 5; // Total pulled reported position accuracy (in meters) since boot optional int64 position_accuracy_meters = 6; // Number of top 4 average CN0 reports since boot optional int64 top_four_average_cn0_reports = 7; // Total pulled reported of top 4 average CN0 (dB-mHz) since boot optional int64 top_four_average_cn0_db_mhz = 8; // Number of l5 top 4 average CN0 reports since boot optional int64 l5_top_four_average_cn0_reports = 9; // Total pulled reported of l5 top 4 average CN0 (dB-mHz) since boot optional int64 l5_top_four_average_cn0_db_mhz = 10; // Total number of sv status messages reports since boot optional int64 sv_status_reports = 11; // Total number of sv status messages reports, where sv is used in fix since boot optional int64 sv_status_reports_used_in_fix = 12; // Total number of L5 sv status messages reports since boot optional int64 l5_sv_status_reports = 13; // Total number of L5 sv status messages reports, where sv is used in fix since boot optional int64 l5_sv_status_reports_used_in_fix = 14; }
location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java +101 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.internal.location.gnssmetrics; import android.app.StatsManager; import android.content.Context; import android.location.GnssStatus; import android.os.SystemClock; import android.os.SystemProperties; Loading @@ -24,16 +26,19 @@ import android.server.location.ServerLocationProtoEnums; import android.text.format.DateUtils; import android.util.Base64; import android.util.Log; import android.util.StatsEvent; import android.util.TimeUtils; import com.android.internal.app.IBatteryStats; import com.android.internal.location.nano.GnssLogsProto.GnssLog; import com.android.internal.location.nano.GnssLogsProto.PowerMetrics; import com.android.internal.os.BackgroundThread; import com.android.internal.util.FrameworkStatsLog; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * GnssMetrics: Is used for logging GNSS metrics Loading Loading @@ -96,7 +101,34 @@ public class GnssMetrics { /** Total number of L5 sv status messages processed, where sv is used in fix */ private int mNumL5SvStatusUsedInFix; public GnssMetrics(IBatteryStats stats) { /* Statsd Logging Variables Section Start */ /** Location failure reports since boot used for statsd logging */ private Statistics mLocationFailureReportsStatistics; /** Time to first fix milli-seconds since boot used for statsd logging */ private Statistics mTimeToFirstFixMilliSReportsStatistics; /** Position accuracy meters since boot used for statsd logging */ private Statistics mPositionAccuracyMetersReportsStatistics; /** Top 4 average CN0 (db-mHz) since boot used for statsd logging */ private Statistics mTopFourAverageCn0DbmHzReportsStatistics; /** Top 4 average CN0 (db-mHz) L5 since boot used for statsd logging */ private Statistics mL5TopFourAverageCn0DbmHzReportsStatistics; /** Total number of sv status reports processed since boot used for statsd logging */ private long mSvStatusReports; /** Total number of L5 sv status reports processed since boot used for statsd logging */ private long mL5SvStatusReports; /** Total number of sv status reports processed, where sv is used in fix since boot used for * statsd logging */ private long mSvStatusReportsUsedInFix; /** Total number of L5 sv status reports processed, where sv is used in fix since boot used for * statsd logging */ private long mL5SvStatusReportsUsedInFix; /** Stats manager service for reporting atoms */ private StatsManager mStatsManager; /** Pull atom callback, this is called when atom pull request occurs */ private StatsPullAtomCallbackImpl mPullAtomCallback; /* Statds Logging Variables Section End */ public GnssMetrics(Context context, IBatteryStats stats) { mGnssPowerMetrics = new GnssPowerMetrics(stats); mLocationFailureStatistics = new Statistics(); mTimeToFirstFixSecStatistics = new Statistics(); Loading @@ -104,6 +136,13 @@ public class GnssMetrics { mTopFourAverageCn0Statistics = new Statistics(); mTopFourAverageCn0StatisticsL5 = new Statistics(); reset(); mLocationFailureReportsStatistics = new Statistics(); mTimeToFirstFixMilliSReportsStatistics = new Statistics(); mPositionAccuracyMetersReportsStatistics = new Statistics(); mTopFourAverageCn0DbmHzReportsStatistics = new Statistics(); mL5TopFourAverageCn0DbmHzReportsStatistics = new Statistics(); mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER); registerGnssStats(); } /** Loading @@ -112,9 +151,11 @@ public class GnssMetrics { public void logReceivedLocationStatus(boolean isSuccessful) { if (!isSuccessful) { mLocationFailureStatistics.addItem(1.0); mLocationFailureReportsStatistics.addItem(1.0); return; } mLocationFailureStatistics.addItem(0.0); mLocationFailureReportsStatistics.addItem(0.0); } /** Loading @@ -127,6 +168,7 @@ public class GnssMetrics { if (numReportMissed > 0) { for (int i = 0; i < numReportMissed; i++) { mLocationFailureStatistics.addItem(1.0); mLocationFailureReportsStatistics.addItem(1.0); } } } Loading @@ -136,6 +178,7 @@ public class GnssMetrics { */ public void logTimeToFirstFixMilliSecs(int timeToFirstFixMilliSeconds) { mTimeToFirstFixSecStatistics.addItem((double) (timeToFirstFixMilliSeconds / 1000)); mTimeToFirstFixMilliSReportsStatistics.addItem(timeToFirstFixMilliSeconds); } /** Loading @@ -143,6 +186,7 @@ public class GnssMetrics { */ public void logPositionAccuracyMeters(float positionAccuracyMeters) { mPositionAccuracyMeterStatistics.addItem((double) positionAccuracyMeters); mPositionAccuracyMetersReportsStatistics.addItem(positionAccuracyMeters); } /** Loading Loading @@ -174,6 +218,8 @@ public class GnssMetrics { } top4AvgCn0 /= 4; mTopFourAverageCn0Statistics.addItem(top4AvgCn0); // Convert to mHz for accuracy mTopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000); } } /* Helper function to check if a SV is L5 */ Loading @@ -191,14 +237,18 @@ public class GnssMetrics { for (int i = 0; i < status.getSatelliteCount(); i++) { if (status.hasCarrierFrequencyHz(i)) { mNumSvStatus++; mSvStatusReports++; isL5 = isL5Sv(status.getCarrierFrequencyHz(i)); if (isL5) { mNumL5SvStatus++; mL5SvStatusReports++; } if (status.usedInFix(i)) { mNumSvStatusUsedInFix++; mSvStatusReportsUsedInFix++; if (isL5) { mNumL5SvStatusUsedInFix++; mL5SvStatusReportsUsedInFix++; } } } Loading Loading @@ -233,6 +283,8 @@ public class GnssMetrics { } top4AvgCn0 /= 4; mTopFourAverageCn0StatisticsL5.addItem(top4AvgCn0); // Convert to mHz for accuracy mL5TopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000); } return; } Loading Loading @@ -421,12 +473,14 @@ public class GnssMetrics { private int mCount; private double mSum; private double mSumSquare; private long mLongSum; /** Resets statistics */ public void reset() { mCount = 0; mSum = 0.0; mSumSquare = 0.0; mLongSum = 0; } /** Adds an item */ Loading @@ -434,6 +488,7 @@ public class GnssMetrics { mCount++; mSum += item; mSumSquare += item * item; mLongSum += item; } /** Returns number of items added */ Loading @@ -456,6 +511,11 @@ public class GnssMetrics { } return 0; } /** Returns long sum */ public long getLongSum() { return mLongSum; } } /* Class for handling GNSS power related metrics */ Loading Loading @@ -561,4 +621,44 @@ public class GnssMetrics { return GnssMetrics.GPS_SIGNAL_QUALITY_POOR; } } private void registerGnssStats() { mPullAtomCallback = new StatsPullAtomCallbackImpl(); mStatsManager.registerPullAtomCallback( FrameworkStatsLog.GNSS_STATS, null, // use default PullAtomMetadata values BackgroundThread.getExecutor(), mPullAtomCallback); } /** * Stats Pull Atom Callback * Calls the pull method to fill out gnss stats */ private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback { @Override public int onPullAtom(int atomTag, List<StatsEvent> data) { if (atomTag != FrameworkStatsLog.GNSS_STATS) { throw new UnsupportedOperationException("Unknown tagId = " + atomTag); } StatsEvent e = StatsEvent.newBuilder() .setAtomId(atomTag) .writeLong(mLocationFailureReportsStatistics.getCount()) .writeLong(mLocationFailureReportsStatistics.getLongSum()) .writeLong(mTimeToFirstFixMilliSReportsStatistics.getCount()) .writeLong(mTimeToFirstFixMilliSReportsStatistics.getLongSum()) .writeLong(mPositionAccuracyMetersReportsStatistics.getCount()) .writeLong(mPositionAccuracyMetersReportsStatistics.getLongSum()) .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getCount()) .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getLongSum()) .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getCount()) .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getLongSum()) .writeLong(mSvStatusReports) .writeLong(mSvStatusReportsUsedInFix) .writeLong(mL5SvStatusReports) .writeLong(mL5SvStatusReportsUsedInFix) .build(); data.add(e); return StatsManager.PULL_SUCCESS; } } }
services/core/java/com/android/server/location/GnssLocationProvider.java +1 −1 Original line number Diff line number Diff line Loading @@ -714,7 +714,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } }; mGnssMetrics = new GnssMetrics(mBatteryStats); mGnssMetrics = new GnssMetrics(mContext, mBatteryStats); mNtpTimeHelper = new NtpTimeHelper(mContext, mLooper, this); GnssSatelliteBlacklistHelper gnssSatelliteBlacklistHelper = new GnssSatelliteBlacklistHelper(mContext, Loading