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

Commit b63b69c5 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi Committed by Android (Google) Code Review
Browse files

Revert "[res] Optimize idmap data initialization in OMS"

This reverts commit f30fff25.

Reason for revert: boot performance regression b/321954244

Change-Id: I4ed2cc481462be458f6e2ab829219198502fd136
parent f30fff25
Loading
Loading
Loading
Loading
+0 −7
Original line number Original line Diff line number Diff line
@@ -49,13 +49,6 @@ public class OverlayPaths {
    public static class Builder {
    public static class Builder {
        final OverlayPaths mPaths = new OverlayPaths();
        final OverlayPaths mPaths = new OverlayPaths();


        public Builder() {}

        public Builder(@NonNull OverlayPaths base) {
            mPaths.mResourceDirs.addAll(base.getResourceDirs());
            mPaths.mOverlayPaths.addAll(base.getOverlayPaths());
        }

        /**
        /**
         * Adds a non-APK path to the contents of {@link OverlayPaths#getOverlayPaths()}.
         * Adds a non-APK path to the contents of {@link OverlayPaths#getOverlayPaths()}.
         */
         */
+1 −1
Original line number Original line Diff line number Diff line
@@ -257,7 +257,7 @@ final class IdmapManager {
    private boolean matchesActorSignature(@NonNull AndroidPackage targetPackage,
    private boolean matchesActorSignature(@NonNull AndroidPackage targetPackage,
            @NonNull AndroidPackage overlayPackage, int userId) {
            @NonNull AndroidPackage overlayPackage, int userId) {
        String targetOverlayableName = overlayPackage.getOverlayTargetOverlayableName();
        String targetOverlayableName = overlayPackage.getOverlayTargetOverlayableName();
        if (targetOverlayableName != null && !mPackageManager.getNamedActors().isEmpty()) {
        if (targetOverlayableName != null) {
            try {
            try {
                OverlayableInfo overlayableInfo = mPackageManager.getOverlayableForTarget(
                OverlayableInfo overlayableInfo = mPackageManager.getOverlayableForTarget(
                        targetPackage.getPackageName(), targetOverlayableName, userId);
                        targetPackage.getPackageName(), targetOverlayableName, userId);
+47 −68
Original line number Original line Diff line number Diff line
@@ -32,7 +32,6 @@ import static android.os.Process.INVALID_UID;
import static android.os.Trace.TRACE_TAG_RRO;
import static android.os.Trace.TRACE_TAG_RRO;
import static android.os.Trace.traceBegin;
import static android.os.Trace.traceBegin;
import static android.os.Trace.traceEnd;
import static android.os.Trace.traceEnd;

import static com.android.server.om.OverlayManagerServiceImpl.OperationFailedException;
import static com.android.server.om.OverlayManagerServiceImpl.OperationFailedException;


import android.annotation.NonNull;
import android.annotation.NonNull;
@@ -363,7 +362,7 @@ public final class OverlayManagerService extends SystemService {
                defaultPackages.add(packageName);
                defaultPackages.add(packageName);
            }
            }
        }
        }
        return defaultPackages.toArray(new String[0]);
        return defaultPackages.toArray(new String[defaultPackages.size()]);
    }
    }


    private final class OverlayManagerPackageMonitor extends PackageMonitor {
    private final class OverlayManagerPackageMonitor extends PackageMonitor {
@@ -1144,10 +1143,9 @@ public final class OverlayManagerService extends SystemService {
    };
    };


    private static final class PackageManagerHelperImpl implements PackageManagerHelper {
    private static final class PackageManagerHelperImpl implements PackageManagerHelper {
        private static final class PackageStateUsers {
        private static class PackageStateUsers {
            private PackageState mPackageState;
            private PackageState mPackageState;
            private Boolean mDefinesOverlayable = null;
            private final Set<Integer> mInstalledUsers = new ArraySet<>();
            private final ArraySet<Integer> mInstalledUsers = new ArraySet<>();
            private PackageStateUsers(@NonNull PackageState packageState) {
            private PackageStateUsers(@NonNull PackageState packageState) {
                this.mPackageState = packageState;
                this.mPackageState = packageState;
            }
            }
@@ -1162,7 +1160,7 @@ public final class OverlayManagerService extends SystemService {
        // state may lead to contradictions within OMS. Better then to lag
        // state may lead to contradictions within OMS. Better then to lag
        // behind until all pending intents have been processed.
        // behind until all pending intents have been processed.
        private final ArrayMap<String, PackageStateUsers> mCache = new ArrayMap<>();
        private final ArrayMap<String, PackageStateUsers> mCache = new ArrayMap<>();
        private final ArraySet<Integer> mInitializedUsers = new ArraySet<>();
        private final Set<Integer> mInitializedUsers = new ArraySet<>();


        PackageManagerHelperImpl(Context context) {
        PackageManagerHelperImpl(Context context) {
            mContext = context;
            mContext = context;
@@ -1178,7 +1176,8 @@ public final class OverlayManagerService extends SystemService {
         */
         */
        @NonNull
        @NonNull
        public ArrayMap<String, PackageState> initializeForUser(final int userId) {
        public ArrayMap<String, PackageState> initializeForUser(final int userId) {
            if (mInitializedUsers.add(userId)) {
            if (!mInitializedUsers.contains(userId)) {
                mInitializedUsers.add(userId);
                mPackageManagerInternal.forEachPackageState((packageState -> {
                mPackageManagerInternal.forEachPackageState((packageState -> {
                    if (packageState.getPkg() != null
                    if (packageState.getPkg() != null
                            && packageState.getUserStateOrDefault(userId).isInstalled()) {
                            && packageState.getUserStateOrDefault(userId).isInstalled()) {
@@ -1197,11 +1196,13 @@ public final class OverlayManagerService extends SystemService {
            return userPackages;
            return userPackages;
        }
        }


        private PackageStateUsers getRawPackageStateForUser(@NonNull final String packageName,
        @Override
        @Nullable
        public PackageState getPackageStateForUser(@NonNull final String packageName,
                final int userId) {
                final int userId) {
            final PackageStateUsers pkg = mCache.get(packageName);
            final PackageStateUsers pkg = mCache.get(packageName);
            if (pkg != null && pkg.mInstalledUsers.contains(userId)) {
            if (pkg != null && pkg.mInstalledUsers.contains(userId)) {
                return pkg;
                return pkg.mPackageState;
            }
            }
            try {
            try {
                if (!mPackageManager.isPackageAvailable(packageName, userId)) {
                if (!mPackageManager.isPackageAvailable(packageName, userId)) {
@@ -1215,14 +1216,8 @@ public final class OverlayManagerService extends SystemService {
            return addPackageUser(packageName, userId);
            return addPackageUser(packageName, userId);
        }
        }


        @Override
        @NonNull
        public PackageState getPackageStateForUser(@NonNull final String packageName,
        private PackageState addPackageUser(@NonNull final String packageName,
                final int userId) {
            final PackageStateUsers pkg = getRawPackageStateForUser(packageName, userId);
            return pkg != null ? pkg.mPackageState : null;
        }

        private PackageStateUsers addPackageUser(@NonNull final String packageName,
                final int user) {
                final int user) {
            final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName);
            final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName);
            if (pkg == null) {
            if (pkg == null) {
@@ -1234,20 +1229,20 @@ public final class OverlayManagerService extends SystemService {
        }
        }


        @NonNull
        @NonNull
        private PackageStateUsers addPackageUser(@NonNull final PackageState pkg,
        private PackageState addPackageUser(@NonNull final PackageState pkg,
                final int user) {
                final int user) {
            PackageStateUsers pkgUsers = mCache.get(pkg.getPackageName());
            PackageStateUsers pkgUsers = mCache.get(pkg.getPackageName());
            if (pkgUsers == null) {
            if (pkgUsers == null) {
                pkgUsers = new PackageStateUsers(pkg);
                pkgUsers = new PackageStateUsers(pkg);
                mCache.put(pkg.getPackageName(), pkgUsers);
                mCache.put(pkg.getPackageName(), pkgUsers);
            } else if (pkgUsers.mPackageState != pkg) {
            } else {
                pkgUsers.mPackageState = pkg;
                pkgUsers.mPackageState = pkg;
                pkgUsers.mDefinesOverlayable = null;
            }
            }
            pkgUsers.mInstalledUsers.add(user);
            pkgUsers.mInstalledUsers.add(user);
            return pkgUsers;
            return pkgUsers.mPackageState;
        }
        }



        @NonNull
        @NonNull
        private void removePackageUser(@NonNull final String packageName, final int user) {
        private void removePackageUser(@NonNull final String packageName, final int user) {
            final PackageStateUsers pkgUsers = mCache.get(packageName);
            final PackageStateUsers pkgUsers = mCache.get(packageName);
@@ -1265,15 +1260,15 @@ public final class OverlayManagerService extends SystemService {
            }
            }
        }
        }


        @Nullable
        public PackageState onPackageAdded(@NonNull final String packageName, final int userId) {
        public PackageState onPackageAdded(@NonNull final String packageName, final int userId) {
            final var pu = addPackageUser(packageName, userId);
            return addPackageUser(packageName, userId);
            return pu != null ? pu.mPackageState : null;
        }
        }


        @Nullable
        public PackageState onPackageUpdated(@NonNull final String packageName,
        public PackageState onPackageUpdated(@NonNull final String packageName,
                final int userId) {
                final int userId) {
            final var pu = addPackageUser(packageName, userId);
            return addPackageUser(packageName, userId);
            return pu != null ? pu.mPackageState : null;
        }
        }


        public void onPackageRemoved(@NonNull final String packageName, final int userId) {
        public void onPackageRemoved(@NonNull final String packageName, final int userId) {
@@ -1313,30 +1308,22 @@ public final class OverlayManagerService extends SystemService {
            return (pkgs.length == 0) ? null : pkgs[0];
            return (pkgs.length == 0) ? null : pkgs[0];
        }
        }


        @Nullable
        @Override
        @Override
        public OverlayableInfo getOverlayableForTarget(@NonNull String packageName,
        public OverlayableInfo getOverlayableForTarget(@NonNull String packageName,
                @NonNull String targetOverlayableName, int userId)
                @NonNull String targetOverlayableName, int userId)
                throws IOException {
                throws IOException {
            final var psu = getRawPackageStateForUser(packageName, userId);
            var packageState = getPackageStateForUser(packageName, userId);
            final var pkg = (psu == null || psu.mPackageState == null)
            var pkg = packageState == null ? null : packageState.getAndroidPackage();
                    ? null : psu.mPackageState.getAndroidPackage();
            if (pkg == null) {
            if (pkg == null) {
                throw new IOException("Unable to get target package");
                throw new IOException("Unable to get target package");
            }
            }


            if (Boolean.FALSE.equals(psu.mDefinesOverlayable)) {
                return null;
            }

            ApkAssets apkAssets = null;
            ApkAssets apkAssets = null;
            try {
            try {
                apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(),
                apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(),
                        ApkAssets.PROPERTY_ONLY_OVERLAYABLES);
                        ApkAssets.PROPERTY_ONLY_OVERLAYABLES);
                if (psu.mDefinesOverlayable == null) {
                return apkAssets.getOverlayableInfo(targetOverlayableName);
                    psu.mDefinesOverlayable = apkAssets.definesOverlayable();
                }
                return Boolean.FALSE.equals(psu.mDefinesOverlayable)
                        ? null : apkAssets.getOverlayableInfo(targetOverlayableName);
            } finally {
            } finally {
                if (apkAssets != null) {
                if (apkAssets != null) {
                    try {
                    try {
@@ -1350,19 +1337,16 @@ public final class OverlayManagerService extends SystemService {
        @Override
        @Override
        public boolean doesTargetDefineOverlayable(String targetPackageName, int userId)
        public boolean doesTargetDefineOverlayable(String targetPackageName, int userId)
                throws IOException {
                throws IOException {
            final var psu = getRawPackageStateForUser(targetPackageName, userId);
            var packageState = getPackageStateForUser(targetPackageName, userId);
            var pkg = (psu == null || psu.mPackageState == null)
            var pkg = packageState == null ? null : packageState.getAndroidPackage();
                    ? null : psu.mPackageState.getAndroidPackage();
            if (pkg == null) {
            if (pkg == null) {
                throw new IOException("Unable to get target package");
                throw new IOException("Unable to get target package");
            }
            }


            if (psu.mDefinesOverlayable == null) {
            ApkAssets apkAssets = null;
            ApkAssets apkAssets = null;
            try {
            try {
                    apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath(),
                apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath());
                            ApkAssets.PROPERTY_ONLY_OVERLAYABLES);
                return apkAssets.definesOverlayable();
                    psu.mDefinesOverlayable = apkAssets.definesOverlayable();
            } finally {
            } finally {
                if (apkAssets != null) {
                if (apkAssets != null) {
                    try {
                    try {
@@ -1372,8 +1356,6 @@ public final class OverlayManagerService extends SystemService {
                }
                }
            }
            }
        }
        }
            return psu.mDefinesOverlayable;
        }


        @Override
        @Override
        public void enforcePermission(String permission, String message) throws SecurityException {
        public void enforcePermission(String permission, String message) throws SecurityException {
@@ -1563,7 +1545,8 @@ public final class OverlayManagerService extends SystemService {
                final OverlayPaths frameworkOverlays =
                final OverlayPaths frameworkOverlays =
                        mImpl.getEnabledOverlayPaths("android", userId, false);
                        mImpl.getEnabledOverlayPaths("android", userId, false);
                for (final String targetPackageName : targetPackageNames) {
                for (final String targetPackageName : targetPackageNames) {
                    final var list = new OverlayPaths.Builder(frameworkOverlays);
                    final OverlayPaths.Builder list = new OverlayPaths.Builder();
                    list.addAll(frameworkOverlays);
                    if (!"android".equals(targetPackageName)) {
                    if (!"android".equals(targetPackageName)) {
                        list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId, true));
                        list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId, true));
                    }
                    }
@@ -1575,23 +1558,19 @@ public final class OverlayManagerService extends SystemService {
            final HashSet<String> invalidPackages = new HashSet<>();
            final HashSet<String> invalidPackages = new HashSet<>();
            pm.setEnabledOverlayPackages(userId, pendingChanges, updatedPackages, invalidPackages);
            pm.setEnabledOverlayPackages(userId, pendingChanges, updatedPackages, invalidPackages);


            if (DEBUG || !invalidPackages.isEmpty()) {
            for (final String targetPackageName : targetPackageNames) {
            for (final String targetPackageName : targetPackageNames) {
                if (DEBUG) {
                if (DEBUG) {
                        Slog.d(TAG,
                    Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=["
                                "-> Updating overlay: target=" + targetPackageName + " overlays=["
                            + pendingChanges.get(targetPackageName)
                            + pendingChanges.get(targetPackageName)
                            + "] userId=" + userId);
                            + "] userId=" + userId);
                }
                }


                if (invalidPackages.contains(targetPackageName)) {
                if (invalidPackages.contains(targetPackageName)) {
                    Slog.e(TAG, TextUtils.formatSimple(
                    Slog.e(TAG, TextUtils.formatSimple(
                                "Failed to change enabled overlays for %s user %d",
                            "Failed to change enabled overlays for %s user %d", targetPackageName,
                                targetPackageName,
                            userId));
                            userId));
                }
                }
            }
            }
            }
            return new ArrayList<>(updatedPackages);
            return new ArrayList<>(updatedPackages);
        } finally {
        } finally {
            traceEnd(TRACE_TAG_RRO);
            traceEnd(TRACE_TAG_RRO);
+9 −5
Original line number Original line Diff line number Diff line
@@ -772,20 +772,24 @@ final class OverlayManagerServiceImpl {


    OverlayPaths getEnabledOverlayPaths(@NonNull final String targetPackageName,
    OverlayPaths getEnabledOverlayPaths(@NonNull final String targetPackageName,
            final int userId, boolean includeImmutableOverlays) {
            final int userId, boolean includeImmutableOverlays) {
        final var paths = new OverlayPaths.Builder();
        final List<OverlayInfo> overlays = mSettings.getOverlaysForTarget(targetPackageName,
        mSettings.forEachMatching(userId, null, targetPackageName, oi -> {
                userId);
        final OverlayPaths.Builder paths = new OverlayPaths.Builder();
        final int n = overlays.size();
        for (int i = 0; i < n; i++) {
            final OverlayInfo oi = overlays.get(i);
            if (!oi.isEnabled()) {
            if (!oi.isEnabled()) {
                return;
                continue;
            }
            }
            if (!includeImmutableOverlays && !oi.isMutable) {
            if (!includeImmutableOverlays && !oi.isMutable) {
                return;
                continue;
            }
            }
            if (oi.isFabricated()) {
            if (oi.isFabricated()) {
                paths.addNonApkPath(oi.baseCodePath);
                paths.addNonApkPath(oi.baseCodePath);
            } else {
            } else {
                paths.addApkPath(oi.baseCodePath);
                paths.addApkPath(oi.baseCodePath);
            }
            }
        });
        }
        return paths.build();
        return paths.build();
    }
    }


+0 −18
Original line number Original line Diff line number Diff line
@@ -47,7 +47,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.List;
import java.util.Objects;
import java.util.Objects;
import java.util.Set;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.Stream;


@@ -183,23 +182,6 @@ final class OverlayManagerSettings {
        return CollectionUtils.map(items, SettingsItem::getOverlayInfo);
        return CollectionUtils.map(items, SettingsItem::getOverlayInfo);
    }
    }


    void forEachMatching(int userId, String overlayName, String targetPackageName,
            @NonNull Consumer<OverlayInfo> consumer) {
        for (int i = 0, n = mItems.size(); i < n; i++) {
            final SettingsItem item = mItems.get(i);
            if (item.getUserId() != userId) {
                continue;
            }
            if (overlayName != null && !item.mOverlay.getPackageName().equals(overlayName)) {
                continue;
            }
            if (targetPackageName != null && !item.mTargetPackageName.equals(targetPackageName)) {
                continue;
            }
            consumer.accept(item.getOverlayInfo());
        }
    }

    ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) {
    ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) {
        final List<SettingsItem> items = selectWhereUser(userId);
        final List<SettingsItem> items = selectWhereUser(userId);