Loading services/core/java/android/content/pm/PackageManagerInternal.java +11 −1 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.pkg.component.ParsedMainComponent; import com.android.server.pm.pkg.mutate.PackageStateMutator; import com.android.server.pm.snapshot.PackageDataSnapshot; import java.io.IOException; import java.lang.annotation.Retention; Loading Loading @@ -718,7 +719,8 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP /** * Returns a package object for the disabled system package name. */ public abstract @Nullable PackageSetting getDisabledSystemPackage(@NonNull String packageName); public abstract @Nullable PackageStateInternal getDisabledSystemPackage( @NonNull String packageName); /** * Returns the package name for the disabled system package. Loading Loading @@ -1334,4 +1336,12 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP public abstract PackageStateMutator.Result commitPackageStateMutation( @Nullable PackageStateMutator.InitialState state, @NonNull Consumer<PackageStateMutator> consumer); /** * @return package data snapshot for use with other PackageManager infrastructure. This should * only be used as a parameter passed to another PM related class. Do not call methods on this * directly. */ @NonNull public abstract PackageDataSnapshot snapshot(); } services/core/java/com/android/server/IntentResolver.java +37 −22 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.server; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; Loading @@ -32,6 +34,9 @@ import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.util.FastPrintWriter; import com.android.server.pm.Computer; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.snapshot.PackageDataSnapshot; import java.io.PrintWriter; import java.util.ArrayList; Loading @@ -51,7 +56,7 @@ public abstract class IntentResolver<F, R extends Object> { final private static boolean localLOGV = DEBUG || false; final private static boolean localVerificationLOGV = DEBUG || false; public void addFilter(F f) { public void addFilter(@Nullable PackageDataSnapshot snapshot, F f) { IntentFilter intentFilter = getIntentFilter(f); if (localLOGV) { Slog.v(TAG, "Adding filter: " + f); Loading Loading @@ -420,8 +425,9 @@ public abstract class IntentResolver<F, R extends Object> { return Collections.unmodifiableSet(mFilters); } public List<R> queryIntentFromList(Intent intent, String resolvedType, boolean defaultOnly, ArrayList<F[]> listCut, int userId) { public List<R> queryIntentFromList(@NonNull Computer computer, Intent intent, String resolvedType, boolean defaultOnly, ArrayList<F[]> listCut, int userId, long customFlags) { ArrayList<R> resultList = new ArrayList<R>(); final boolean debug = localLOGV || Loading @@ -431,16 +437,21 @@ public abstract class IntentResolver<F, R extends Object> { final String scheme = intent.getScheme(); int N = listCut.size(); for (int i = 0; i < N; ++i) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, listCut.get(i), resultList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, listCut.get(i), resultList, userId, customFlags); } filterResults(resultList); sortResults(resultList); return resultList; } public List<R> queryIntent(Intent intent, String resolvedType, boolean defaultOnly, int userId) { public List<R> queryIntent(@NonNull PackageDataSnapshot snapshot, Intent intent, String resolvedType, boolean defaultOnly, @UserIdInt int userId) { return queryIntent(snapshot, intent, resolvedType, defaultOnly, userId, 0); } protected final List<R> queryIntent(@NonNull PackageDataSnapshot snapshot, Intent intent, String resolvedType, boolean defaultOnly, @UserIdInt int userId, long customFlags) { String scheme = intent.getScheme(); ArrayList<R> finalList = new ArrayList<R>(); Loading Loading @@ -512,21 +523,22 @@ public abstract class IntentResolver<F, R extends Object> { } FastImmutableArraySet<String> categories = getFastIntentCategories(intent); Computer computer = (Computer) snapshot; if (firstTypeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, firstTypeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, firstTypeCut, finalList, userId, customFlags); } if (secondTypeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, secondTypeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, secondTypeCut, finalList, userId, customFlags); } if (thirdTypeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, thirdTypeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, thirdTypeCut, finalList, userId, customFlags); } if (schemeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, schemeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, schemeCut, finalList, userId, customFlags); } filterResults(finalList); sortResults(finalList); Loading Loading @@ -554,7 +566,7 @@ public abstract class IntentResolver<F, R extends Object> { * "stopped", that is whether it should not be included in the result * if the intent requests to excluded stopped objects. */ protected boolean isFilterStopped(F filter, int userId) { protected boolean isFilterStopped(PackageStateInternal packageState, @UserIdInt int userId) { return false; } Loading Loading @@ -584,7 +596,8 @@ public abstract class IntentResolver<F, R extends Object> { protected abstract F[] newArray(int size); @SuppressWarnings("unchecked") protected R newResult(F filter, int match, int userId) { protected R newResult(@NonNull Computer computer, F filter, int match, int userId, long customFlags) { return (R)filter; } Loading Loading @@ -764,9 +777,10 @@ public abstract class IntentResolver<F, R extends Object> { return new FastImmutableArraySet<String>(categories.toArray(new String[categories.size()])); } private void buildResolveList(Intent intent, FastImmutableArraySet<String> categories, boolean debug, boolean defaultOnly, String resolvedType, String scheme, F[] src, List<R> dest, int userId) { private void buildResolveList(@NonNull Computer computer, Intent intent, FastImmutableArraySet<String> categories, boolean debug, boolean defaultOnly, String resolvedType, String scheme, F[] src, List<R> dest, int userId, long customFlags) { final String action = intent.getAction(); final Uri data = intent.getData(); final String packageName = intent.getPackage(); Loading @@ -791,7 +805,8 @@ public abstract class IntentResolver<F, R extends Object> { int match; if (debug) Slog.v(TAG, "Matching against filter " + filter); if (excludingStopped && isFilterStopped(filter, userId)) { if (excludingStopped && isFilterStopped(computer.getPackageStateInternal(packageName), userId)) { if (debug) { Slog.v(TAG, " Filter's target is stopped; skipping"); } Loading Loading @@ -833,7 +848,7 @@ public abstract class IntentResolver<F, R extends Object> { Integer.toHexString(match) + " hasDefault=" + intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)); if (!defaultOnly || intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)) { final R oneResult = newResult(filter, match, userId); final R oneResult = newResult(computer, filter, match, userId, customFlags); if (debug) Slog.v(TAG, " Created result: " + oneResult); if (oneResult != null) { dest.add(oneResult); Loading services/core/java/com/android/server/am/ActivityManagerService.java +9 −5 Original line number Diff line number Diff line Loading @@ -395,12 +395,14 @@ import com.android.server.firewall.IntentFirewall; import com.android.server.graphics.fonts.FontManagerInternal; import com.android.server.job.JobSchedulerInternal; import com.android.server.os.NativeTombstoneManager; import com.android.server.pm.Computer; import com.android.server.pm.Installer; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.pkg.SELinuxUtil; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.snapshot.PackageDataSnapshot; import com.android.server.uri.GrantUri; import com.android.server.uri.NeededUriGrants; import com.android.server.uri.UriGrantsManagerInternal; Loading Loading @@ -1105,10 +1107,11 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override protected BroadcastFilter newResult(BroadcastFilter filter, int match, int userId) { protected BroadcastFilter newResult(@NonNull Computer computer, BroadcastFilter filter, int match, int userId, long customFlags) { if (userId == UserHandle.USER_ALL || filter.owningUserId == UserHandle.USER_ALL || userId == filter.owningUserId) { return super.newResult(filter, match, userId); return super.newResult(computer, filter, match, userId, customFlags); } return null; } Loading Loading @@ -13039,7 +13042,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (!bf.debugCheck()) { Slog.w(TAG, "==> For Dynamic broadcast"); } mReceiverResolver.addFilter(bf); mReceiverResolver.addFilter(getPackageManagerInternal().snapshot(), bf); } // Enqueue broadcasts for all existing stickies that match Loading Loading @@ -13861,6 +13864,7 @@ public class ActivityManagerService extends IActivityManager.Stub intent, resolvedType, callingUid, users, broadcastAllowList); } if (intent.getComponent() == null) { final PackageDataSnapshot snapshot = getPackageManagerInternal().snapshot(); if (userId == UserHandle.USER_ALL && callingUid == SHELL_UID) { // Query one target user at a time, excluding shell-restricted users for (int i = 0; i < users.length; i++) { Loading @@ -13869,7 +13873,7 @@ public class ActivityManagerService extends IActivityManager.Stub continue; } List<BroadcastFilter> registeredReceiversForUser = mReceiverResolver.queryIntent(intent, mReceiverResolver.queryIntent(snapshot, intent, resolvedType, false /*defaultOnly*/, users[i]); if (registeredReceivers == null) { registeredReceivers = registeredReceiversForUser; Loading @@ -13878,7 +13882,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } } else { registeredReceivers = mReceiverResolver.queryIntent(intent, registeredReceivers = mReceiverResolver.queryIntent(snapshot, intent, resolvedType, false /*defaultOnly*/, userId); } } services/core/java/com/android/server/firewall/IntentFirewall.java +18 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Environment; import android.os.FileObserver; import android.os.Handler; Loading @@ -38,6 +39,8 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.EventLogTags; import com.android.server.IntentResolver; import com.android.server.LocalServices; import com.android.server.pm.Computer; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -75,6 +78,9 @@ public class IntentFirewall { private final RuleObserver mObserver; @NonNull private PackageManagerInternal mPackageManager; private FirewallIntentResolver mActivityResolver = new FirewallIntentResolver(); private FirewallIntentResolver mBroadcastResolver = new FirewallIntentResolver(); private FirewallIntentResolver mServiceResolver = new FirewallIntentResolver(); Loading Loading @@ -123,6 +129,13 @@ public class IntentFirewall { mObserver.startWatching(); } private PackageManagerInternal getPackageManager() { if (mPackageManager == null) { mPackageManager = LocalServices.getService(PackageManagerInternal.class); } return mPackageManager; } /** * This is called from ActivityManager to check if a start activity intent should be allowed. * It is assumed the caller is already holding the global ActivityManagerService lock. Loading Loading @@ -154,7 +167,8 @@ public class IntentFirewall { // For the first pass, find all the rules that have at least one intent-filter or // component-filter that matches this intent List<Rule> candidateRules; candidateRules = resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, 0); candidateRules = resolver.queryIntent(getPackageManager().snapshot(), intent, resolvedType, false /*defaultOnly*/, 0); if (candidateRules == null) { candidateRules = new ArrayList<Rule>(); } Loading Loading @@ -375,7 +389,7 @@ public class IntentFirewall { for (int ruleIndex=0; ruleIndex<rules.size(); ruleIndex++) { Rule rule = rules.get(ruleIndex); for (int i=0; i<rule.getIntentFilterCount(); i++) { resolver.addFilter(rule.getIntentFilter(i)); resolver.addFilter(null, rule.getIntentFilter(i)); } for (int i=0; i<rule.getComponentFilterCount(); i++) { resolver.addComponentFilter(rule.getComponentFilter(i), rule); Loading Loading @@ -512,7 +526,8 @@ public class IntentFirewall { } @Override protected Rule newResult(FirewallIntentFilter filter, int match, int userId) { protected Rule newResult(@NonNull Computer computer, FirewallIntentFilter filter, int match, int userId, long customFlags) { return filter.rule; } Loading services/core/java/com/android/server/pm/Computer.java +27 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.resolution.ComponentResolverApi; import com.android.server.pm.snapshot.PackageDataSnapshot; import com.android.server.utils.WatchedArrayMap; import com.android.server.utils.WatchedLongSparseArray; Loading Loading @@ -98,7 +100,7 @@ import java.util.Set; * {@link ComputerEngine} and {@link ComputerLocked}. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public interface Computer { public interface Computer extends PackageDataSnapshot { /** * Every method must be annotated. Loading Loading @@ -178,6 +180,18 @@ public interface Computer { @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(Intent intent, String resolvedType, int userId); /** * Filters out ephemeral activities. * <p>When resolving for an ephemeral app, only activities that 1) are defined in the * ephemeral app or 2) marked with {@code visibleToEphemeral} are returned. * * @param resolveInfos The pre-filtered list of resolved activities * @param ephemeralPkgName The ephemeral package name. If {@code null}, no filtering * is performed. * @param intent * @return A filtered list of resolved activities. */ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List<ResolveInfo> applyPostResolutionFilter(@NonNull List<ResolveInfo> resolveInfos, String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid, Loading Loading @@ -648,4 +662,16 @@ public interface Computer { @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId); @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ComponentResolverApi getComponentResolver(); @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable PackageStateInternal getDisabledSystemPackage(@NonNull String packageName); @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ResolveInfo getInstantAppInstallerInfo(); } Loading
services/core/java/android/content/pm/PackageManagerInternal.java +11 −1 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.pkg.component.ParsedMainComponent; import com.android.server.pm.pkg.mutate.PackageStateMutator; import com.android.server.pm.snapshot.PackageDataSnapshot; import java.io.IOException; import java.lang.annotation.Retention; Loading Loading @@ -718,7 +719,8 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP /** * Returns a package object for the disabled system package name. */ public abstract @Nullable PackageSetting getDisabledSystemPackage(@NonNull String packageName); public abstract @Nullable PackageStateInternal getDisabledSystemPackage( @NonNull String packageName); /** * Returns the package name for the disabled system package. Loading Loading @@ -1334,4 +1336,12 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP public abstract PackageStateMutator.Result commitPackageStateMutation( @Nullable PackageStateMutator.InitialState state, @NonNull Consumer<PackageStateMutator> consumer); /** * @return package data snapshot for use with other PackageManager infrastructure. This should * only be used as a parameter passed to another PM related class. Do not call methods on this * directly. */ @NonNull public abstract PackageDataSnapshot snapshot(); }
services/core/java/com/android/server/IntentResolver.java +37 −22 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.server; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; Loading @@ -32,6 +34,9 @@ import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.util.FastPrintWriter; import com.android.server.pm.Computer; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.snapshot.PackageDataSnapshot; import java.io.PrintWriter; import java.util.ArrayList; Loading @@ -51,7 +56,7 @@ public abstract class IntentResolver<F, R extends Object> { final private static boolean localLOGV = DEBUG || false; final private static boolean localVerificationLOGV = DEBUG || false; public void addFilter(F f) { public void addFilter(@Nullable PackageDataSnapshot snapshot, F f) { IntentFilter intentFilter = getIntentFilter(f); if (localLOGV) { Slog.v(TAG, "Adding filter: " + f); Loading Loading @@ -420,8 +425,9 @@ public abstract class IntentResolver<F, R extends Object> { return Collections.unmodifiableSet(mFilters); } public List<R> queryIntentFromList(Intent intent, String resolvedType, boolean defaultOnly, ArrayList<F[]> listCut, int userId) { public List<R> queryIntentFromList(@NonNull Computer computer, Intent intent, String resolvedType, boolean defaultOnly, ArrayList<F[]> listCut, int userId, long customFlags) { ArrayList<R> resultList = new ArrayList<R>(); final boolean debug = localLOGV || Loading @@ -431,16 +437,21 @@ public abstract class IntentResolver<F, R extends Object> { final String scheme = intent.getScheme(); int N = listCut.size(); for (int i = 0; i < N; ++i) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, listCut.get(i), resultList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, listCut.get(i), resultList, userId, customFlags); } filterResults(resultList); sortResults(resultList); return resultList; } public List<R> queryIntent(Intent intent, String resolvedType, boolean defaultOnly, int userId) { public List<R> queryIntent(@NonNull PackageDataSnapshot snapshot, Intent intent, String resolvedType, boolean defaultOnly, @UserIdInt int userId) { return queryIntent(snapshot, intent, resolvedType, defaultOnly, userId, 0); } protected final List<R> queryIntent(@NonNull PackageDataSnapshot snapshot, Intent intent, String resolvedType, boolean defaultOnly, @UserIdInt int userId, long customFlags) { String scheme = intent.getScheme(); ArrayList<R> finalList = new ArrayList<R>(); Loading Loading @@ -512,21 +523,22 @@ public abstract class IntentResolver<F, R extends Object> { } FastImmutableArraySet<String> categories = getFastIntentCategories(intent); Computer computer = (Computer) snapshot; if (firstTypeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, firstTypeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, firstTypeCut, finalList, userId, customFlags); } if (secondTypeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, secondTypeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, secondTypeCut, finalList, userId, customFlags); } if (thirdTypeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, thirdTypeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, thirdTypeCut, finalList, userId, customFlags); } if (schemeCut != null) { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, schemeCut, finalList, userId); buildResolveList(computer, intent, categories, debug, defaultOnly, resolvedType, scheme, schemeCut, finalList, userId, customFlags); } filterResults(finalList); sortResults(finalList); Loading Loading @@ -554,7 +566,7 @@ public abstract class IntentResolver<F, R extends Object> { * "stopped", that is whether it should not be included in the result * if the intent requests to excluded stopped objects. */ protected boolean isFilterStopped(F filter, int userId) { protected boolean isFilterStopped(PackageStateInternal packageState, @UserIdInt int userId) { return false; } Loading Loading @@ -584,7 +596,8 @@ public abstract class IntentResolver<F, R extends Object> { protected abstract F[] newArray(int size); @SuppressWarnings("unchecked") protected R newResult(F filter, int match, int userId) { protected R newResult(@NonNull Computer computer, F filter, int match, int userId, long customFlags) { return (R)filter; } Loading Loading @@ -764,9 +777,10 @@ public abstract class IntentResolver<F, R extends Object> { return new FastImmutableArraySet<String>(categories.toArray(new String[categories.size()])); } private void buildResolveList(Intent intent, FastImmutableArraySet<String> categories, boolean debug, boolean defaultOnly, String resolvedType, String scheme, F[] src, List<R> dest, int userId) { private void buildResolveList(@NonNull Computer computer, Intent intent, FastImmutableArraySet<String> categories, boolean debug, boolean defaultOnly, String resolvedType, String scheme, F[] src, List<R> dest, int userId, long customFlags) { final String action = intent.getAction(); final Uri data = intent.getData(); final String packageName = intent.getPackage(); Loading @@ -791,7 +805,8 @@ public abstract class IntentResolver<F, R extends Object> { int match; if (debug) Slog.v(TAG, "Matching against filter " + filter); if (excludingStopped && isFilterStopped(filter, userId)) { if (excludingStopped && isFilterStopped(computer.getPackageStateInternal(packageName), userId)) { if (debug) { Slog.v(TAG, " Filter's target is stopped; skipping"); } Loading Loading @@ -833,7 +848,7 @@ public abstract class IntentResolver<F, R extends Object> { Integer.toHexString(match) + " hasDefault=" + intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)); if (!defaultOnly || intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)) { final R oneResult = newResult(filter, match, userId); final R oneResult = newResult(computer, filter, match, userId, customFlags); if (debug) Slog.v(TAG, " Created result: " + oneResult); if (oneResult != null) { dest.add(oneResult); Loading
services/core/java/com/android/server/am/ActivityManagerService.java +9 −5 Original line number Diff line number Diff line Loading @@ -395,12 +395,14 @@ import com.android.server.firewall.IntentFirewall; import com.android.server.graphics.fonts.FontManagerInternal; import com.android.server.job.JobSchedulerInternal; import com.android.server.os.NativeTombstoneManager; import com.android.server.pm.Computer; import com.android.server.pm.Installer; import com.android.server.pm.UserManagerInternal; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.pkg.SELinuxUtil; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.snapshot.PackageDataSnapshot; import com.android.server.uri.GrantUri; import com.android.server.uri.NeededUriGrants; import com.android.server.uri.UriGrantsManagerInternal; Loading Loading @@ -1105,10 +1107,11 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override protected BroadcastFilter newResult(BroadcastFilter filter, int match, int userId) { protected BroadcastFilter newResult(@NonNull Computer computer, BroadcastFilter filter, int match, int userId, long customFlags) { if (userId == UserHandle.USER_ALL || filter.owningUserId == UserHandle.USER_ALL || userId == filter.owningUserId) { return super.newResult(filter, match, userId); return super.newResult(computer, filter, match, userId, customFlags); } return null; } Loading Loading @@ -13039,7 +13042,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (!bf.debugCheck()) { Slog.w(TAG, "==> For Dynamic broadcast"); } mReceiverResolver.addFilter(bf); mReceiverResolver.addFilter(getPackageManagerInternal().snapshot(), bf); } // Enqueue broadcasts for all existing stickies that match Loading Loading @@ -13861,6 +13864,7 @@ public class ActivityManagerService extends IActivityManager.Stub intent, resolvedType, callingUid, users, broadcastAllowList); } if (intent.getComponent() == null) { final PackageDataSnapshot snapshot = getPackageManagerInternal().snapshot(); if (userId == UserHandle.USER_ALL && callingUid == SHELL_UID) { // Query one target user at a time, excluding shell-restricted users for (int i = 0; i < users.length; i++) { Loading @@ -13869,7 +13873,7 @@ public class ActivityManagerService extends IActivityManager.Stub continue; } List<BroadcastFilter> registeredReceiversForUser = mReceiverResolver.queryIntent(intent, mReceiverResolver.queryIntent(snapshot, intent, resolvedType, false /*defaultOnly*/, users[i]); if (registeredReceivers == null) { registeredReceivers = registeredReceiversForUser; Loading @@ -13878,7 +13882,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } } else { registeredReceivers = mReceiverResolver.queryIntent(intent, registeredReceivers = mReceiverResolver.queryIntent(snapshot, intent, resolvedType, false /*defaultOnly*/, userId); } }
services/core/java/com/android/server/firewall/IntentFirewall.java +18 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Environment; import android.os.FileObserver; import android.os.Handler; Loading @@ -38,6 +39,8 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.EventLogTags; import com.android.server.IntentResolver; import com.android.server.LocalServices; import com.android.server.pm.Computer; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -75,6 +78,9 @@ public class IntentFirewall { private final RuleObserver mObserver; @NonNull private PackageManagerInternal mPackageManager; private FirewallIntentResolver mActivityResolver = new FirewallIntentResolver(); private FirewallIntentResolver mBroadcastResolver = new FirewallIntentResolver(); private FirewallIntentResolver mServiceResolver = new FirewallIntentResolver(); Loading Loading @@ -123,6 +129,13 @@ public class IntentFirewall { mObserver.startWatching(); } private PackageManagerInternal getPackageManager() { if (mPackageManager == null) { mPackageManager = LocalServices.getService(PackageManagerInternal.class); } return mPackageManager; } /** * This is called from ActivityManager to check if a start activity intent should be allowed. * It is assumed the caller is already holding the global ActivityManagerService lock. Loading Loading @@ -154,7 +167,8 @@ public class IntentFirewall { // For the first pass, find all the rules that have at least one intent-filter or // component-filter that matches this intent List<Rule> candidateRules; candidateRules = resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, 0); candidateRules = resolver.queryIntent(getPackageManager().snapshot(), intent, resolvedType, false /*defaultOnly*/, 0); if (candidateRules == null) { candidateRules = new ArrayList<Rule>(); } Loading Loading @@ -375,7 +389,7 @@ public class IntentFirewall { for (int ruleIndex=0; ruleIndex<rules.size(); ruleIndex++) { Rule rule = rules.get(ruleIndex); for (int i=0; i<rule.getIntentFilterCount(); i++) { resolver.addFilter(rule.getIntentFilter(i)); resolver.addFilter(null, rule.getIntentFilter(i)); } for (int i=0; i<rule.getComponentFilterCount(); i++) { resolver.addComponentFilter(rule.getComponentFilter(i), rule); Loading Loading @@ -512,7 +526,8 @@ public class IntentFirewall { } @Override protected Rule newResult(FirewallIntentFilter filter, int match, int userId) { protected Rule newResult(@NonNull Computer computer, FirewallIntentFilter filter, int match, int userId, long customFlags) { return filter.rule; } Loading
services/core/java/com/android/server/pm/Computer.java +27 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.resolution.ComponentResolverApi; import com.android.server.pm.snapshot.PackageDataSnapshot; import com.android.server.utils.WatchedArrayMap; import com.android.server.utils.WatchedLongSparseArray; Loading Loading @@ -98,7 +100,7 @@ import java.util.Set; * {@link ComputerEngine} and {@link ComputerLocked}. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public interface Computer { public interface Computer extends PackageDataSnapshot { /** * Every method must be annotated. Loading Loading @@ -178,6 +180,18 @@ public interface Computer { @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(Intent intent, String resolvedType, int userId); /** * Filters out ephemeral activities. * <p>When resolving for an ephemeral app, only activities that 1) are defined in the * ephemeral app or 2) marked with {@code visibleToEphemeral} are returned. * * @param resolveInfos The pre-filtered list of resolved activities * @param ephemeralPkgName The ephemeral package name. If {@code null}, no filtering * is performed. * @param intent * @return A filtered list of resolved activities. */ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List<ResolveInfo> applyPostResolutionFilter(@NonNull List<ResolveInfo> resolveInfos, String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid, Loading Loading @@ -648,4 +662,16 @@ public interface Computer { @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId); @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ComponentResolverApi getComponentResolver(); @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable PackageStateInternal getDisabledSystemPackage(@NonNull String packageName); @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ResolveInfo getInstantAppInstallerInfo(); }