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

Commit b692f4a0 authored by Todd Kennedy's avatar Todd Kennedy Committed by android-build-merger
Browse files

Merge "Save overlay paths as user state" into oc-dev

am: 508a5bad

Change-Id: If46b58323883dcdeef72f0a394f79becca134c23
parents 7cb007c6 508a5bad
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -6852,7 +6852,7 @@ public class PackageParser {
            ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName);
        }
        ai.seInfoUser = SELinuxUtil.assignSeinfoUser(state);
        ai.resourceDirs = state.resourceDirs;
        ai.resourceDirs = state.overlayPaths;
    }

    public static ApplicationInfo generateApplicationInfo(Package p, int flags,
@@ -7000,6 +7000,7 @@ public class PackageParser {
            return null;
        }
        if (!copyNeeded(flags, a.owner, state, a.metaData, userId)) {
            updateApplicationInfo(a.info.applicationInfo, flags, state);
            return a.info;
        }
        // Make shallow copies so we can store the metadata safely
@@ -7088,6 +7089,7 @@ public class PackageParser {
            return null;
        }
        if (!copyNeeded(flags, s.owner, state, s.metaData, userId)) {
            updateApplicationInfo(s.info.applicationInfo, flags, state);
            return s.info;
        }
        // Make shallow copies so we can store the metadata safely
@@ -7183,6 +7185,7 @@ public class PackageParser {
        if (!copyNeeded(flags, p.owner, state, p.metaData, userId)
                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
                        || p.info.uriPermissionPatterns == null)) {
            updateApplicationInfo(p.info.applicationInfo, flags, state);
            return p.info;
        }
        // Make shallow copies so we can store the metadata safely
+3 −3
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public class PackageUserState {
    public ArraySet<String> disabledComponents;
    public ArraySet<String> enabledComponents;

    public String[] resourceDirs;
    public String[] overlayPaths;

    public PackageUserState() {
        installed = true;
@@ -83,8 +83,8 @@ public class PackageUserState {
        installReason = o.installReason;
        disabledComponents = ArrayUtils.cloneOrNull(o.disabledComponents);
        enabledComponents = ArrayUtils.cloneOrNull(o.enabledComponents);
        resourceDirs =
            o.resourceDirs == null ? null : Arrays.copyOf(o.resourceDirs, o.resourceDirs.length);
        overlayPaths =
            o.overlayPaths == null ? null : Arrays.copyOf(o.overlayPaths, o.overlayPaths.length);
    }

    /**
+22 −107
Original line number Diff line number Diff line
@@ -678,13 +678,6 @@ public class PackageManagerService extends IPackageManager.Stub
    @GuardedBy("mPackages")
    final SparseIntArray mIsolatedOwners = new SparseIntArray();
    // List of APK paths to load for each user and package. This data is never
    // persisted by the package manager. Instead, the overlay manager will
    // ensure the data is up-to-date in runtime.
    @GuardedBy("mPackages")
    final SparseArray<ArrayMap<String, ArrayList<String>>> mEnabledOverlayPaths =
        new SparseArray<ArrayMap<String, ArrayList<String>>>();
    /**
     * Tracks new system packages [received in an OTA] that we expect to
     * find updated user-installed versions. Keys are package name, values
@@ -3585,8 +3578,6 @@ public class PackageManagerService extends IPackageManager.Stub
            return null;
        }
        rebaseEnabledOverlays(packageInfo.applicationInfo, userId);
        packageInfo.packageName = packageInfo.applicationInfo.packageName =
                resolveExternalPackageNameLPr(p);
@@ -4098,7 +4089,6 @@ public class PackageManagerService extends IPackageManager.Stub
            ApplicationInfo ai = PackageParser.generateApplicationInfo(ps.pkg, flags,
                    ps.readUserState(userId), userId);
            if (ai != null) {
                rebaseEnabledOverlays(ai, userId);
                ai.packageName = resolveExternalPackageNameLPr(ps.pkg);
            }
            return ai;
@@ -4147,7 +4137,6 @@ public class PackageManagerService extends IPackageManager.Stub
                ApplicationInfo ai = PackageParser.generateApplicationInfo(
                        p, flags, ps.readUserState(userId), userId);
                if (ai != null) {
                    rebaseEnabledOverlays(ai, userId);
                    ai.packageName = resolveExternalPackageNameLPr(p);
                }
                return ai;
@@ -4164,26 +4153,6 @@ public class PackageManagerService extends IPackageManager.Stub
        return null;
    }
    private void rebaseEnabledOverlays(@NonNull ApplicationInfo ai, int userId) {
        List<String> paths = new ArrayList<>();
        ArrayMap<String, ArrayList<String>> userSpecificOverlays =
            mEnabledOverlayPaths.get(userId);
        if (userSpecificOverlays != null) {
            if (!"android".equals(ai.packageName)) {
                ArrayList<String> frameworkOverlays = userSpecificOverlays.get("android");
                if (frameworkOverlays != null) {
                    paths.addAll(frameworkOverlays);
                }
            }
            ArrayList<String> appOverlays = userSpecificOverlays.get(ai.packageName);
            if (appOverlays != null) {
                paths.addAll(appOverlays);
            }
        }
        ai.resourceDirs = paths.size() > 0 ? paths.toArray(new String[paths.size()]) : null;
    }
    private String normalizePackageNameLPr(String packageName) {
        String normalizedPackageName = mSettings.getRenamedPackageLPr(packageName);
        return normalizedPackageName != null ? normalizedPackageName : packageName;
@@ -4565,24 +4534,6 @@ public class PackageManagerService extends IPackageManager.Stub
        return updateFlagsForComponent(flags, userId, intent /*cookie*/);
    }
    private ActivityInfo generateActivityInfo(ActivityInfo ai, int flags, PackageUserState state,
            int userId) {
        ActivityInfo ret = PackageParser.generateActivityInfo(ai, flags, state, userId);
        if (ret != null) {
            rebaseEnabledOverlays(ret.applicationInfo, userId);
        }
        return ret;
    }
    private ActivityInfo generateActivityInfo(PackageParser.Activity a, int flags,
            PackageUserState state, int userId) {
        ActivityInfo ai = PackageParser.generateActivityInfo(a, flags, state, userId);
        if (ai != null) {
            rebaseEnabledOverlays(ai.applicationInfo, userId);
        }
        return ai;
    }
    @Override
    public ActivityInfo getActivityInfo(ComponentName component, int flags, int userId) {
        return getActivityInfoInternal(component, flags, Binder.getCallingUid(), userId);
@@ -4610,11 +4561,12 @@ public class PackageManagerService extends IPackageManager.Stub
                if (filterAppAccessLPr(ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) {
                    return null;
                }
                return generateActivityInfo(a, flags, ps.readUserState(userId), userId);
                return PackageParser.generateActivityInfo(
                        a, flags, ps.readUserState(userId), userId);
            }
            if (mResolveComponentName.equals(component)) {
                return generateActivityInfo(mResolveActivity, flags, new PackageUserState(),
                        userId);
                return PackageParser.generateActivityInfo(
                        mResolveActivity, flags, new PackageUserState(), userId);
            }
        }
        return null;
@@ -4668,7 +4620,8 @@ public class PackageManagerService extends IPackageManager.Stub
                if (filterAppAccessLPr(ps, callingUid, component, TYPE_RECEIVER, userId)) {
                    return null;
                }
                return generateActivityInfo(a, flags, ps.readUserState(userId), userId);
                return PackageParser.generateActivityInfo(
                        a, flags, ps.readUserState(userId), userId);
            }
        }
        return null;
@@ -4804,12 +4757,8 @@ public class PackageManagerService extends IPackageManager.Stub
                if (filterAppAccessLPr(ps, callingUid, component, TYPE_SERVICE, userId)) {
                    return null;
                }
                ServiceInfo si = PackageParser.generateServiceInfo(s, flags,
                        ps.readUserState(userId), userId);
                if (si != null) {
                    rebaseEnabledOverlays(si.applicationInfo, userId);
                }
                return si;
                return PackageParser.generateServiceInfo(
                        s, flags, ps.readUserState(userId), userId);
            }
        }
        return null;
@@ -4832,12 +4781,8 @@ public class PackageManagerService extends IPackageManager.Stub
                if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) {
                    return null;
                }
                ProviderInfo pi = PackageParser.generateProviderInfo(p, flags,
                        ps.readUserState(userId), userId);
                if (pi != null) {
                    rebaseEnabledOverlays(pi.applicationInfo, userId);
                }
                return pi;
                return PackageParser.generateProviderInfo(
                        p, flags, ps.readUserState(userId), userId);
            }
        }
        return null;
@@ -8263,7 +8208,6 @@ public class PackageManagerService extends IPackageManager.Stub
                        ai = PackageParser.generateApplicationInfo(ps.pkg, effectiveFlags,
                                ps.readUserState(userId), userId);
                        if (ai != null) {
                            rebaseEnabledOverlays(ai, userId);
                            ai.packageName = resolveExternalPackageNameLPr(ps.pkg);
                        }
                    } else {
@@ -8290,7 +8234,6 @@ public class PackageManagerService extends IPackageManager.Stub
                        ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags,
                                ps.readUserState(userId), userId);
                        if (ai != null) {
                            rebaseEnabledOverlays(ai, userId);
                            ai.packageName = resolveExternalPackageNameLPr(p);
                            list.add(ai);
                        }
@@ -8444,7 +8387,6 @@ public class PackageManagerService extends IPackageManager.Stub
                        ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags,
                                ps.readUserState(userId), userId);
                        if (ai != null) {
                            rebaseEnabledOverlays(ai, userId);
                            finalList.add(ai);
                        }
                    }
@@ -13368,7 +13310,8 @@ public class PackageManagerService extends IPackageManager.Stub
                return null;
            }
            final PackageUserState userState = ps.readUserState(userId);
            ActivityInfo ai = generateActivityInfo(activity, mFlags, userState, userId);
            ActivityInfo ai =
                    PackageParser.generateActivityInfo(activity, mFlags, userState, userId);
            if (ai == null) {
                return null;
            }
@@ -22348,11 +22291,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                dumpCompilerStatsLPr(pw, packageName);
            }
            if (!checkin && dumpState.isDumping(DumpState.DUMP_ENABLED_OVERLAYS)) {
                if (dumpState.onTitlePrinted()) pw.println();
                dumpEnabledOverlaysLPr(pw);
            }
            if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) {
                if (dumpState.onTitlePrinted()) pw.println();
                mSettings.dumpReadMessagesLPr(pw, dumpState);
@@ -22549,23 +22487,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
        }
    }
    private void dumpEnabledOverlaysLPr(PrintWriter pw) {
        pw.println("Enabled overlay paths:");
        final int N = mEnabledOverlayPaths.size();
        for (int i = 0; i < N; i++) {
            final int userId = mEnabledOverlayPaths.keyAt(i);
            pw.println(String.format("    User %d:", userId));
            final ArrayMap<String, ArrayList<String>> userSpecificOverlays =
                mEnabledOverlayPaths.valueAt(i);
            final int M = userSpecificOverlays.size();
            for (int j = 0; j < M; j++) {
                final String targetPackageName = userSpecificOverlays.keyAt(j);
                final ArrayList<String> overlayPackagePaths = userSpecificOverlays.valueAt(j);
                pw.println(String.format("        %s: %s", targetPackageName, overlayPackagePaths));
            }
        }
    }
    private String dumpDomainString(String packageName) {
        List<IntentFilterVerificationInfo> iviList = getIntentFilterVerifications(packageName)
                .getList();
@@ -24743,11 +24664,10 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                    Slog.e(TAG, "failed to find package " + targetPackageName);
                    return false;
                }
                ArrayList<String> paths = null;
                if (overlayPackageNames != null) {
                ArrayList<String> overlayPaths = null;
                if (overlayPackageNames != null && overlayPackageNames.size() > 0) {
                    final int N = overlayPackageNames.size();
                    paths = new ArrayList<>(N);
                    overlayPaths = new ArrayList<>(N);
                    for (int i = 0; i < N; i++) {
                        final String packageName = overlayPackageNames.get(i);
                        final PackageParser.Package pkg = mPackages.get(packageName);
@@ -24755,22 +24675,17 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                            Slog.e(TAG, "failed to find package " + packageName);
                            return false;
                        }
                        paths.add(pkg.baseCodePath);
                        overlayPaths.add(pkg.baseCodePath);
                    }
                }
                ArrayMap<String, ArrayList<String>> userSpecificOverlays =
                    mEnabledOverlayPaths.get(userId);
                if (userSpecificOverlays == null) {
                    userSpecificOverlays = new ArrayMap<>();
                    mEnabledOverlayPaths.put(userId, userSpecificOverlays);
                }
                if (paths != null && paths.size() > 0) {
                    userSpecificOverlays.put(targetPackageName, paths);
                } else {
                    userSpecificOverlays.remove(targetPackageName);
                final PackageSetting ps = mSettings.mPackages.get(targetPackageName);
                String[] frameworkOverlayPaths = null;
                if (!"android".equals(targetPackageName)) {
                    frameworkOverlayPaths =
                            mSettings.mPackages.get("android").getOverlayPaths(userId);
                }
                ps.setOverlayPaths(overlayPaths, frameworkOverlayPaths, userId);
                return true;
            }
        }
+22 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
import com.google.android.collect.Lists;

import java.io.File;
import java.util.ArrayList;
@@ -329,6 +330,27 @@ abstract class PackageSettingBase extends SettingBase {
        modifyUserState(userId).installReason = installReason;
    }

    void setOverlayPaths(List<String> overlayPaths, String[] frameworkOverlayPaths, int userId) {
        if (overlayPaths == null && frameworkOverlayPaths == null) {
            modifyUserState(userId).overlayPaths = null;
            return;
        }
        final List<String> paths;
        if (frameworkOverlayPaths == null) {
            paths = overlayPaths;
        } else {
            paths = Lists.newArrayList(frameworkOverlayPaths);
            if (overlayPaths != null) {
                paths.addAll(overlayPaths);
            }
        }
        modifyUserState(userId).overlayPaths = paths.toArray(new String[paths.size()]);
    }

    String[] getOverlayPaths(int userId) {
        return readUserState(userId).overlayPaths;
    }

    /** Only use for testing. Do NOT use in production code. */
    @VisibleForTesting
    SparseArray<PackageUserState> getUserState() {
+9 −0
Original line number Diff line number Diff line
@@ -4858,6 +4858,15 @@ final class Settings {
            pw.print(ps.getEnabled(user.id));
            pw.print(" instant=");
            pw.println(ps.getInstantApp(user.id));

            String[] overlayPaths = ps.getOverlayPaths(user.id);
            if (overlayPaths != null && overlayPaths.length > 0) {
                pw.println("Overlay paths:");
                for (String path : overlayPaths) {
                    pw.println(path);
                }
            }

            String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
            if (lastDisabledAppCaller != null) {
                pw.print(prefix); pw.print("    lastDisabledCaller: ");