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

Commit f34b745c authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

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

The commit got reverted because of a performance regression.
This change is trying to pinpoint it with the steps:

1. Split out the smaller optimizations that are either safe,
   or at least can be easily reverted separately

2. Put the risky optimization that changes the overlayable-
   related JNI calls in the last CL (here)

Original commit message:
    [res] Optimize idmap data initialization in OMS

    - Only load overlayable definitions for the needed apks
      intead of parsing their all resource tables
    # ^^ this is the current CL

    - Don't load any overlayable definitions for checking
      actor policies if no actor policies are defined for the
      device. Almost no one defines any
    # ^^ this part is separated

    - Reduce the number of allocations for the most common
      operations in overlay settings
    # ^^ this part is separated

Bug: 282215580
Test: system boot + perf trace

This reverts commit b63b69c5.

Change-Id: I20c89d78b8f88e60bb4050a936e0b930f6386ad8
parent c468c0ed
Loading
Loading
Loading
Loading
+49 −31
Original line number Diff line number Diff line
@@ -1143,9 +1143,10 @@ public final class OverlayManagerService extends SystemService {
    };

    private static final class PackageManagerHelperImpl implements PackageManagerHelper {
        private static class PackageStateUsers {
        private static final class PackageStateUsers {
            private PackageState mPackageState;
            private final Set<Integer> mInstalledUsers = new ArraySet<>();
            private Boolean mDefinesOverlayable = null;
            private final ArraySet<Integer> mInstalledUsers = new ArraySet<>();
            private PackageStateUsers(@NonNull PackageState packageState) {
                this.mPackageState = packageState;
            }
@@ -1195,13 +1196,11 @@ public final class OverlayManagerService extends SystemService {
            return userPackages;
        }

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

        @NonNull
        private PackageState addPackageUser(@NonNull final String packageName,
        @Override
        public PackageState getPackageStateForUser(@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 PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName);
            if (pkg == null) {
@@ -1228,20 +1233,20 @@ public final class OverlayManagerService extends SystemService {
        }

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


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

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

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

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

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

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

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

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

        @Override
        public void enforcePermission(String permission, String message) throws SecurityException {