Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75158ac5 authored by Bookatz's avatar Bookatz
Browse files

StatsCompanionService alarms more efficient

Use the OnAlarmListener version of alarms, instead of the broadcast
version, to save on the overhead of broadcasts.

Change-Id: I95a336324c3042d18fbb547ba3b925811c1494bf
Fixes: 73115955
Test: cts-tradefed run cts-dev -m CtsStatsdHostTestCases
parent 56b20ec6
Loading
Loading
Loading
Loading
+0 −15
Original line number Diff line number Diff line
@@ -4287,21 +4287,6 @@
            </intent-filter>
        </receiver>

        <receiver android:name="com.android.server.stats.StatsCompanionService$AnomalyAlarmReceiver"
                  android:permission="android.permission.STATSCOMPANION"
                  android:exported="false">
        </receiver>

        <receiver android:name="com.android.server.stats.StatsCompanionService$PullingAlarmReceiver"
                  android:permission="android.permission.STATSCOMPANION"
                  android:exported="false">
        </receiver>

        <receiver android:name="com.android.server.stats.StatsCompanionService$PeriodicAlarmReceiver"
                  android:permission="android.permission.STATSCOMPANION"
                  android:exported="false">
        </receiver>

        <service android:name="android.hardware.location.GeofenceHardwareService"
            android:permission="android.permission.LOCATION_HARDWARE"
            android:exported="false" />
+3 −3
Original line number Diff line number Diff line
@@ -3272,11 +3272,11 @@ Lcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;
Lcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;
Lcom/android/server/soundtrigger/SoundTriggerService;
Lcom/android/server/stats/StatsCompanionService$1;
Lcom/android/server/stats/StatsCompanionService$AnomalyAlarmReceiver;
Lcom/android/server/stats/StatsCompanionService$AnomalyAlarmListener;
Lcom/android/server/stats/StatsCompanionService$AppUpdateReceiver;
Lcom/android/server/stats/StatsCompanionService$Lifecycle;
Lcom/android/server/stats/StatsCompanionService$PeriodicAlarmReceiver;
Lcom/android/server/stats/StatsCompanionService$PullingAlarmReceiver;
Lcom/android/server/stats/StatsCompanionService$PeriodicAlarmListener;
Lcom/android/server/stats/StatsCompanionService$PullingAlarmListener;
Lcom/android/server/stats/StatsCompanionService$ShutdownEventReceiver;
Lcom/android/server/stats/StatsCompanionService$StatsdDeathRecipient;
Lcom/android/server/stats/StatsCompanionService;
+40 −42
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.stats;
import android.annotation.Nullable;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.AlarmManager.OnAlarmListener;
import android.app.PendingIntent;
import android.app.ProcessMemoryState;
import android.app.StatsManager;
@@ -124,9 +125,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
    private static IStatsManager sStatsd;
    private static final Object sStatsdLock = new Object();

    private final PendingIntent mAnomalyAlarmIntent;
    private final PendingIntent mPullingAlarmIntent;
    private final PendingIntent mPeriodicAlarmIntent;
    private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener();
    private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener();
    private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener();
    private final BroadcastReceiver mAppUpdateReceiver;
    private final BroadcastReceiver mUserUpdateReceiver;
    private final ShutdownEventReceiver mShutdownEventReceiver;
@@ -158,12 +159,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        mContext = context;
        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        mAnomalyAlarmIntent = PendingIntent.getBroadcast(mContext, 0,
                new Intent(mContext, AnomalyAlarmReceiver.class), 0);
        mPullingAlarmIntent = PendingIntent.getBroadcast(
                mContext, 0, new Intent(mContext, PullingAlarmReceiver.class), 0);
        mPeriodicAlarmIntent = PendingIntent.getBroadcast(
                mContext, 0, new Intent(mContext, PeriodicAlarmReceiver.class), 0);
        mAppUpdateReceiver = new AppUpdateReceiver();
        mUserUpdateReceiver = new BroadcastReceiver() {
            @Override
@@ -345,9 +340,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        }
    }

    public final static class AnomalyAlarmReceiver extends BroadcastReceiver {
    public final static class AnomalyAlarmListener implements OnAlarmListener {
        @Override
        public void onReceive(Context context, Intent intent) {
        public void onAlarm() {
            Slog.i(TAG, "StatsCompanionService believes an anomaly has occurred at time "
                    + System.currentTimeMillis() + "ms.");
            synchronized (sStatsdLock) {
@@ -366,9 +361,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        }
    }

    public final static class PullingAlarmReceiver extends BroadcastReceiver {
    public final static class PullingAlarmListener implements OnAlarmListener {
        @Override
        public void onReceive(Context context, Intent intent) {
        public void onAlarm() {
            if (DEBUG)
                Slog.d(TAG, "Time to poll something.");
            synchronized (sStatsdLock) {
@@ -386,9 +381,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        }
    }

    public final static class PeriodicAlarmReceiver extends BroadcastReceiver {
    public final static class PeriodicAlarmListener implements OnAlarmListener {
        @Override
        public void onReceive(Context context, Intent intent) {
        public void onAlarm() {
            if (DEBUG)
                Slog.d(TAG, "Time to trigger periodic alarm.");
            synchronized (sStatsdLock) {
@@ -442,9 +437,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        try {
            // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
            // only fire when it awakens.
            // This alarm is inexact, leaving its exactness completely up to the OS optimizations.
            // AlarmManager will automatically cancel any previous mAnomalyAlarmIntent alarm.
            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mAnomalyAlarmIntent);
            // AlarmManager will automatically cancel any previous mAnomalyAlarmListener alarm.
            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".anomaly",
                    mAnomalyAlarmListener, null);
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
@@ -456,7 +451,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        if (DEBUG) Slog.d(TAG, "Cancelling anomaly alarm");
        final long callingToken = Binder.clearCallingIdentity();
        try {
            mAlarmManager.cancel(mAnomalyAlarmIntent);
            mAlarmManager.cancel(mAnomalyAlarmListener);
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
@@ -472,7 +467,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        try {
            // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
            // only fire when it awakens.
            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent);
            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".periodic",
                    mPeriodicAlarmListener, null);
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
@@ -485,7 +481,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
            Slog.d(TAG, "Cancelling periodic alarm");
        final long callingToken = Binder.clearCallingIdentity();
        try {
            mAlarmManager.cancel(mPeriodicAlarmIntent);
            mAlarmManager.cancel(mPeriodicAlarmListener);
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
@@ -494,14 +490,16 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
    @Override // Binder call
    public void setPullingAlarm(long nextPullTimeMs) {
        enforceCallingPermission();
      if (DEBUG)
        Slog.d(TAG,
            "Setting pulling alarm in about " + (nextPullTimeMs - SystemClock.elapsedRealtime()));
        if (DEBUG) {
            Slog.d(TAG, "Setting pulling alarm in about "
                    + (nextPullTimeMs - SystemClock.elapsedRealtime()));
        }
        final long callingToken = Binder.clearCallingIdentity();
        try {
            // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
            // only fire when it awakens.
        mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextPullTimeMs, mPullingAlarmIntent);
            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextPullTimeMs, TAG + ".pull",
                    mPullingAlarmListener, null);
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
@@ -514,7 +512,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
            Slog.d(TAG, "Cancelling pulling alarm");
        final long callingToken = Binder.clearCallingIdentity();
        try {
        mAlarmManager.cancel(mPullingAlarmIntent);
            mAlarmManager.cancel(mPullingAlarmListener);
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }