diff options
4 files changed, 60 insertions, 17 deletions
diff --git a/services/core/Android.bp b/services/core/Android.bp index 167c38418058..53730e317ac6 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -227,6 +227,7 @@ java_library_static { "connectivity_flags_lib", "dreams_flags_lib", "aconfig_new_storage_flags_lib", + "powerstats_flags_lib", ], javac_shard_size: 50, javacflags: [ diff --git a/services/core/java/com/android/server/powerstats/Android.bp b/services/core/java/com/android/server/powerstats/Android.bp new file mode 100644 index 000000000000..7f3b091f8969 --- /dev/null +++ b/services/core/java/com/android/server/powerstats/Android.bp @@ -0,0 +1,11 @@ +aconfig_declarations { + name: "powerstats_flags", + package: "com.android.server.powerstats", + container: "system", + srcs: ["*.aconfig"], +} + +java_aconfig_library { + name: "powerstats_flags_lib", + aconfig_declarations: "powerstats_flags", +} diff --git a/services/core/java/com/android/server/powerstats/TimerTrigger.java b/services/core/java/com/android/server/powerstats/TimerTrigger.java index f8a4135b9d66..817a40d80d04 100644 --- a/services/core/java/com/android/server/powerstats/TimerTrigger.java +++ b/services/core/java/com/android/server/powerstats/TimerTrigger.java @@ -16,8 +16,10 @@ package com.android.server.powerstats; +import android.app.AlarmManager; import android.content.Context; import android.os.Handler; +import android.os.SystemClock; import android.util.Slog; /** @@ -33,37 +35,53 @@ public final class TimerTrigger extends PowerStatsLogTrigger { private static final long LOG_PERIOD_MS_HIGH_FREQUENCY = 2 * 60 * 1000; // 2 minutes private final Handler mHandler; + private final AlarmManager mAlarmManager; + + class PeriodicTimer implements Runnable, AlarmManager.OnAlarmListener { + private final String mName; + private final long mPeriodMs; + private final int mMsgType; + + PeriodicTimer(String name, long periodMs, int msgType) { + mName = name; + mPeriodMs = periodMs; + mMsgType = msgType; + } - private Runnable mLogDataLowFrequency = new Runnable() { @Override - public void run() { - // Do not wake the device for these messages. Opportunistically log rail data every - // LOG_PERIOD_MS_LOW_FREQUENCY. - mHandler.postDelayed(mLogDataLowFrequency, LOG_PERIOD_MS_LOW_FREQUENCY); - if (DEBUG) Slog.d(TAG, "Received delayed message. Log rail data low frequency"); - logPowerStatsData(PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY); + public void onAlarm() { + run(); } - }; - private Runnable mLogDataHighFrequency = new Runnable() { @Override public void run() { - // Do not wake the device for these messages. Opportunistically log rail data every - // LOG_PERIOD_MS_HIGH_FREQUENCY. - mHandler.postDelayed(mLogDataHighFrequency, LOG_PERIOD_MS_HIGH_FREQUENCY); - if (DEBUG) Slog.d(TAG, "Received delayed message. Log rail data high frequency"); - logPowerStatsData(PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY); + if (Flags.alarmBasedPowerstatsLogging()) { + final long nextAlarmMs = SystemClock.elapsedRealtime() + mPeriodMs; + mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextAlarmMs, + AlarmManager.WINDOW_EXACT, 0, mName, this, mHandler, null); + } else { + mHandler.postDelayed(this, mPeriodMs); + } + if (DEBUG) Slog.d(TAG, "Received delayed message (" + mName + "). Logging rail data"); + logPowerStatsData(mMsgType); } - }; + } public TimerTrigger(Context context, PowerStatsLogger powerStatsLogger, boolean triggerEnabled) { super(context, powerStatsLogger); mHandler = mContext.getMainThreadHandler(); + mAlarmManager = mContext.getSystemService(AlarmManager.class); if (triggerEnabled) { - mLogDataLowFrequency.run(); - mLogDataHighFrequency.run(); + final PeriodicTimer logDataLowFrequency = new PeriodicTimer("PowerStatsLowFreqLog", + LOG_PERIOD_MS_LOW_FREQUENCY, + PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY); + final PeriodicTimer logDataHighFrequency = new PeriodicTimer("PowerStatsHighFreqLog", + LOG_PERIOD_MS_HIGH_FREQUENCY, + PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY); + logDataLowFrequency.run(); + logDataHighFrequency.run(); } } } diff --git a/services/core/java/com/android/server/powerstats/flags.aconfig b/services/core/java/com/android/server/powerstats/flags.aconfig new file mode 100644 index 000000000000..0a4a7510aab8 --- /dev/null +++ b/services/core/java/com/android/server/powerstats/flags.aconfig @@ -0,0 +1,13 @@ + +package: "com.android.server.powerstats" +container: "system" + +flag { + name: "alarm_based_powerstats_logging" + namespace: "backstage_power" + description: "Utilize new OomAdjuster implementation" + bug: "294598168" + metadata { + purpose: PURPOSE_BUGFIX + } +}
\ No newline at end of file |