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

Commit 46e9912c authored by Jaekyun Seok's avatar Jaekyun Seok Committed by android-build-merger
Browse files

Merge "Call mInstaller.idmap() without holding mPackages" into pi-dev

am: 4836f8b0

Change-Id: I62623b100213869bef67fd5a1c1d6afba34bbb8d
parents 85647449 4836f8b0
Loading
Loading
Loading
Loading
+23 −17
Original line number Diff line number Diff line
@@ -779,8 +779,14 @@ public class PackageManagerService extends IPackageManager.Stub
            return PackageManagerService.this.hasSystemFeature(feature, 0);
        }
        final List<PackageParser.Package> getStaticOverlayPackagesLocked(
        final List<PackageParser.Package> getStaticOverlayPackages(
                Collection<PackageParser.Package> allPackages, String targetPackageName) {
            if ("android".equals(targetPackageName)) {
                // Static RROs targeting to "android", ie framework-res.apk, are already applied by
                // native AssetManager.
                return null;
            }
            List<PackageParser.Package> overlayPackages = null;
            for (PackageParser.Package p : allPackages) {
                if (targetPackageName.equals(p.mOverlayTarget) && p.mOverlayIsStatic) {
@@ -801,16 +807,8 @@ public class PackageManagerService extends IPackageManager.Stub
            return overlayPackages;
        }
        @GuardedBy("mInstallLock")
        final String[] getStaticOverlayPathsLocked(Collection<PackageParser.Package> allPackages,
                String targetPackageName, String targetPath) {
            if ("android".equals(targetPackageName)) {
                // Static RROs targeting to "android", ie framework-res.apk, are already applied by
                // native AssetManager.
                return null;
            }
            List<PackageParser.Package> overlayPackages =
                    getStaticOverlayPackagesLocked(allPackages, targetPackageName);
        final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages,
                String targetPath) {
            if (overlayPackages == null || overlayPackages.isEmpty()) {
                return null;
            }
@@ -830,9 +828,11 @@ public class PackageManagerService extends IPackageManager.Stub
                    //
                    // OverlayManagerService will update each of them with a correct gid from its
                    // target package app id.
                    synchronized (mInstallLock) {
                        mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
                                UserHandle.getSharedAppGid(
                                        UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
                    }
                    if (overlayPathList == null) {
                        overlayPathList = new ArrayList<String>();
                    }
@@ -846,10 +846,14 @@ public class PackageManagerService extends IPackageManager.Stub
        }
        String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
            List<PackageParser.Package> overlayPackages;
            synchronized (mPackages) {
                return getStaticOverlayPathsLocked(
                        mPackages.values(), targetPackageName, targetPath);
                overlayPackages = getStaticOverlayPackages(
                        mPackages.values(), targetPackageName);
            }
            // It is safe to keep overlayPackages without holding mPackages because static overlay
            // packages can't be uninstalled or disabled.
            return getStaticOverlayPaths(overlayPackages, targetPath);
        }
        @Override public final String[] getOverlayApks(String targetPackageName) {
@@ -884,7 +888,9 @@ public class PackageManagerService extends IPackageManager.Stub
            // can't happen while running parallel parsing.
            // Moreover holding mPackages on each parsing thread causes dead-lock.
            return mOverlayPackages == null ? null :
                    getStaticOverlayPathsLocked(mOverlayPackages, targetPackageName, targetPath);
                    getStaticOverlayPaths(
                            getStaticOverlayPackages(mOverlayPackages, targetPackageName),
                            targetPath);
        }
    }