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

Commit e1ab9ca0 authored by Winson Chiu's avatar Winson Chiu Committed by Android (Google) Code Review
Browse files

Merge "Fix ComponentResolver Computer consistency"

parents ec3e6791 668fd622
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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.
@@ -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();
}
+37 −22
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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 ||
@@ -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>();
@@ -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);
@@ -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;
    }

@@ -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;
    }

@@ -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();
@@ -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");
                }
@@ -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);
+9 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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;
        }
@@ -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
@@ -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++) {
@@ -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;
@@ -13878,7 +13882,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    }
                }
            } else {
                registeredReceivers = mReceiverResolver.queryIntent(intent,
                registeredReceivers = mReceiverResolver.queryIntent(snapshot, intent,
                        resolvedType, false /*defaultOnly*/, userId);
            }
        }
+18 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
@@ -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.
@@ -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>();
        }
@@ -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);
@@ -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;
        }

+27 −1
Original line number Diff line number Diff line
@@ -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;

@@ -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.
@@ -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,
@@ -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