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

Commit 7fc46d8b authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Add tracking of bg check violations in broadcast stats.

Test: manually booted and checked output

Change-Id: Ie29a8424ae80c2b193645dcb2b1f4f6a8779ff6a
parent 89f423d3
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -18938,8 +18938,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        return ActivityManager.BROADCAST_SUCCESS;
    }
    final void addBroadcastStatLocked(String action, String srcPackage, int receiveCount,
            int skipCount, long dispatchTime) {
    final void rotateBroadcastStatsIfNeededLocked() {
        final long now = SystemClock.elapsedRealtime();
        if (mCurBroadcastStats == null ||
                (mCurBroadcastStats.mStartRealtime +(24*60*60*1000) < now)) {
@@ -18950,9 +18949,19 @@ public class ActivityManagerService extends IActivityManager.Stub
            }
            mCurBroadcastStats = new BroadcastStats();
        }
    }
    final void addBroadcastStatLocked(String action, String srcPackage, int receiveCount,
            int skipCount, long dispatchTime) {
        rotateBroadcastStatsIfNeededLocked();
        mCurBroadcastStats.addBroadcast(action, srcPackage, receiveCount, skipCount, dispatchTime);
    }
    final void addBackgroundCheckViolationLocked(String action, String targetPackage) {
        rotateBroadcastStatsIfNeededLocked();
        mCurBroadcastStats.addBackgroundCheckViolation(action, targetPackage);
    }
    final Intent verifyBroadcastLocked(Intent intent) {
        // Refuse possible leaked file descriptors
        if (intent != null && intent.hasFileDescriptors() == true) {
+2 −0
Original line number Diff line number Diff line
@@ -1158,6 +1158,8 @@ public final class BroadcastQueue {
                                && r.intent.getPackage() == null
                                && ((r.intent.getFlags()
                                        & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0))) {
                        mService.addBackgroundCheckViolationLocked(r.intent.getAction(),
                                component.getPackageName());
                        Slog.w(TAG, "Background execution not allowed: receiving "
                                + r.intent + " to "
                                + component.flattenToShortString());
+36 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ public final class BroadcastStats {
    static final class ActionEntry {
        final String mAction;
        final ArrayMap<String, PackageEntry> mPackages = new ArrayMap<>();
        final ArrayMap<String, ViolationEntry> mBackgroundCheckViolations = new ArrayMap<>();
        int mReceiveCount;
        int mSkipCount;
        long mTotalDispatchTime;
@@ -61,6 +62,10 @@ public final class BroadcastStats {
        int mSendCount;
    }

    static final class ViolationEntry {
        int mCount;
    }

    public BroadcastStats() {
        mStartRealtime = SystemClock.elapsedRealtime();
        mStartUptime = SystemClock.uptimeMillis();
@@ -87,6 +92,20 @@ public final class BroadcastStats {
        pe.mSendCount++;
    }

    public void addBackgroundCheckViolation(String action, String targetPackage) {
        ActionEntry ae = mActions.get(action);
        if (ae == null) {
            ae = new ActionEntry(action);
            mActions.put(action, ae);
        }
        ViolationEntry ve = ae.mBackgroundCheckViolations.get(targetPackage);
        if (ve == null) {
            ve = new ViolationEntry();
            ae.mBackgroundCheckViolations.put(targetPackage, ve);
        }
        ve.mCount++;
    }

    public boolean dumpStats(PrintWriter pw, String prefix, String dumpPackage) {
        boolean printedSomething = false;
        ArrayList<ActionEntry> actions = new ArrayList<>(mActions.size());
@@ -123,6 +142,15 @@ public final class BroadcastStats {
                pw.print(pe.mSendCount);
                pw.println(" times");
            }
            for (int j=ae.mBackgroundCheckViolations.size()-1; j>=0; j--) {
                pw.print(prefix);
                pw.print("  Bg Check Violation ");
                pw.print(ae.mBackgroundCheckViolations.keyAt(j));
                pw.print(": ");
                ViolationEntry ve = ae.mBackgroundCheckViolations.valueAt(j);
                pw.print(ve.mCount);
                pw.println(" times");
            }
        }
        return printedSomething;
    }
@@ -158,6 +186,14 @@ public final class BroadcastStats {
                pw.print(pe.mSendCount);
                pw.println();
            }
            for (int j=ae.mBackgroundCheckViolations.size()-1; j>=0; j--) {
                pw.print("v,");
                pw.print(ae.mBackgroundCheckViolations.keyAt(j));
                ViolationEntry ve = ae.mBackgroundCheckViolations.valueAt(j);
                pw.print(",");
                pw.print(ve.mCount);
                pw.println();
            }
        }
    }
}