Loading services/core/java/com/android/server/am/ActivityManagerService.java +11 −2 Original line number Diff line number Diff line Loading @@ -19019,8 +19019,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)) { Loading @@ -19031,9 +19030,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) { services/core/java/com/android/server/am/BroadcastQueue.java +2 −0 Original line number Diff line number Diff line Loading @@ -1195,6 +1195,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()); Loading services/core/java/com/android/server/am/BroadcastStats.java +36 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -61,6 +62,10 @@ public final class BroadcastStats { int mSendCount; } static final class ViolationEntry { int mCount; } public BroadcastStats() { mStartRealtime = SystemClock.elapsedRealtime(); mStartUptime = SystemClock.uptimeMillis(); Loading @@ -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()); Loading Loading @@ -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; } Loading Loading @@ -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(); } } } } Loading
services/core/java/com/android/server/am/ActivityManagerService.java +11 −2 Original line number Diff line number Diff line Loading @@ -19019,8 +19019,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)) { Loading @@ -19031,9 +19030,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) {
services/core/java/com/android/server/am/BroadcastQueue.java +2 −0 Original line number Diff line number Diff line Loading @@ -1195,6 +1195,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()); Loading
services/core/java/com/android/server/am/BroadcastStats.java +36 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -61,6 +62,10 @@ public final class BroadcastStats { int mSendCount; } static final class ViolationEntry { int mCount; } public BroadcastStats() { mStartRealtime = SystemClock.elapsedRealtime(); mStartUptime = SystemClock.uptimeMillis(); Loading @@ -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()); Loading Loading @@ -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; } Loading Loading @@ -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(); } } } }