Block activity starts from background when realCallingUid is
a persistent system process and the start wasn't explicitly
whitelisted by the sender
Also, adds mechanism to temporary whitelist processes when
broadcast-based PendingIntent was whitelisted, so that
activities can be opened for the duration of the broadcast
being processed.
For now, all this is only wired for notifications.
Note: those whitelists are separate - only UI elements like
notifications will leverage both in order to support trampolines.
Other system-based PendingIntent senders should only use the
activity-based whitelist when they want an activity to be opened
from background.
Bug: 110956953
Test: atest WmTests:ActivityStarterTests
Test: manual with Play notifications that are known
for doing trampolines
Change-Id: Ibab91cdbe7afc0aed29d430dd41327272020925b
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index c15b7c7..6f0a562 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -249,6 +249,9 @@
final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
// All ContentProviderRecord process is using
final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();
+ // A set of tokens that currently contribute to this process being temporarily whitelisted
+ // to start activities even if it's not in the foreground
+ final ArraySet<Binder> mAllowBackgroundActivityStartsTokens = new ArraySet<>();
String isolatedEntryPoint; // Class to run on start if this is a special isolated process.
String[] isolatedEntryPointArgs; // Arguments to pass to isolatedEntryPoint's main().
@@ -1135,6 +1138,17 @@
return mUsingWrapper;
}
+ void addAllowBackgroundActivityStartsToken(Binder entity) {
+ mAllowBackgroundActivityStartsTokens.add(entity);
+ mWindowProcessController.setAllowBackgroundActivityStarts(true);
+ }
+
+ void removeAllowBackgroundActivityStartsToken(Binder entity) {
+ mAllowBackgroundActivityStartsTokens.remove(entity);
+ mWindowProcessController.setAllowBackgroundActivityStarts(
+ !mAllowBackgroundActivityStartsTokens.isEmpty());
+ }
+
void setActiveInstrumentation(ActiveInstrumentation instr) {
mInstr = instr;
mWindowProcessController.setInstrumenting(instr != null);