Loading services/core/java/com/android/server/pm/PackageManagerService.java +16 −23 Original line number Original line Diff line number Diff line Loading @@ -808,7 +808,7 @@ public class PackageManagerService extends IPackageManager.Stub } } final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages, final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages, String targetPath, Object installLock) { String targetPath) { if (overlayPackages == null || overlayPackages.isEmpty()) { if (overlayPackages == null || overlayPackages.isEmpty()) { return null; return null; } } Loading @@ -828,20 +828,9 @@ public class PackageManagerService extends IPackageManager.Stub // // // OverlayManagerService will update each of them with a correct gid from its // OverlayManagerService will update each of them with a correct gid from its // target package app id. // target package app id. if (installLock != null) { synchronized (installLock) { mInstaller.idmap(targetPath, overlayPackage.baseCodePath, mInstaller.idmap(targetPath, overlayPackage.baseCodePath, UserHandle.getSharedAppGid( UserHandle.getSharedAppGid( UserHandle.getUserGid(UserHandle.USER_SYSTEM))); UserHandle.getUserGid(UserHandle.USER_SYSTEM))); } } else { // We can call mInstaller without holding mInstallLock because mInstallLock // is held before running parallel parsing. // Moreover holding mInstallLock on each parsing thread causes dead-lock. mInstaller.idmap(targetPath, overlayPackage.baseCodePath, UserHandle.getSharedAppGid( UserHandle.getUserGid(UserHandle.USER_SYSTEM))); } if (overlayPathList == null) { if (overlayPathList == null) { overlayPathList = new ArrayList<String>(); overlayPathList = new ArrayList<String>(); } } Loading @@ -856,13 +845,15 @@ public class PackageManagerService extends IPackageManager.Stub String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { List<PackageParser.Package> overlayPackages; List<PackageParser.Package> overlayPackages; synchronized (mInstallLock) { synchronized (mPackages) { synchronized (mPackages) { overlayPackages = getStaticOverlayPackages( overlayPackages = getStaticOverlayPackages( mPackages.values(), targetPackageName); mPackages.values(), targetPackageName); } } // It is safe to keep overlayPackages without holding mPackages because static overlay // It is safe to keep overlayPackages without holding mPackages because static overlay // packages can't be uninstalled or disabled. // packages can't be uninstalled or disabled. return getStaticOverlayPaths(overlayPackages, targetPath, mInstallLock); return getStaticOverlayPaths(overlayPackages, targetPath); } } } @Override public final String[] getOverlayApks(String targetPackageName) { @Override public final String[] getOverlayApks(String targetPackageName) { Loading Loading @@ -895,11 +886,13 @@ public class PackageManagerService extends IPackageManager.Stub synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { // We can trust mOverlayPackages without holding mPackages because package uninstall // We can trust mOverlayPackages without holding mPackages because package uninstall // can't happen while running parallel parsing. // can't happen while running parallel parsing. // Moreover holding mPackages on each parsing thread causes dead-lock. // And we can call mInstaller inside getStaticOverlayPaths without holding mInstallLock // because mInstallLock is held before running parallel parsing. // Moreover holding mPackages or mInstallLock on each parsing thread causes dead-lock. return mOverlayPackages == null ? null : return mOverlayPackages == null ? null : getStaticOverlayPaths( getStaticOverlayPaths( getStaticOverlayPackages(mOverlayPackages, targetPackageName), getStaticOverlayPackages(mOverlayPackages, targetPackageName), targetPath, null); targetPath); } } } } Loading
services/core/java/com/android/server/pm/PackageManagerService.java +16 −23 Original line number Original line Diff line number Diff line Loading @@ -808,7 +808,7 @@ public class PackageManagerService extends IPackageManager.Stub } } final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages, final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages, String targetPath, Object installLock) { String targetPath) { if (overlayPackages == null || overlayPackages.isEmpty()) { if (overlayPackages == null || overlayPackages.isEmpty()) { return null; return null; } } Loading @@ -828,20 +828,9 @@ public class PackageManagerService extends IPackageManager.Stub // // // OverlayManagerService will update each of them with a correct gid from its // OverlayManagerService will update each of them with a correct gid from its // target package app id. // target package app id. if (installLock != null) { synchronized (installLock) { mInstaller.idmap(targetPath, overlayPackage.baseCodePath, mInstaller.idmap(targetPath, overlayPackage.baseCodePath, UserHandle.getSharedAppGid( UserHandle.getSharedAppGid( UserHandle.getUserGid(UserHandle.USER_SYSTEM))); UserHandle.getUserGid(UserHandle.USER_SYSTEM))); } } else { // We can call mInstaller without holding mInstallLock because mInstallLock // is held before running parallel parsing. // Moreover holding mInstallLock on each parsing thread causes dead-lock. mInstaller.idmap(targetPath, overlayPackage.baseCodePath, UserHandle.getSharedAppGid( UserHandle.getUserGid(UserHandle.USER_SYSTEM))); } if (overlayPathList == null) { if (overlayPathList == null) { overlayPathList = new ArrayList<String>(); overlayPathList = new ArrayList<String>(); } } Loading @@ -856,13 +845,15 @@ public class PackageManagerService extends IPackageManager.Stub String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { List<PackageParser.Package> overlayPackages; List<PackageParser.Package> overlayPackages; synchronized (mInstallLock) { synchronized (mPackages) { synchronized (mPackages) { overlayPackages = getStaticOverlayPackages( overlayPackages = getStaticOverlayPackages( mPackages.values(), targetPackageName); mPackages.values(), targetPackageName); } } // It is safe to keep overlayPackages without holding mPackages because static overlay // It is safe to keep overlayPackages without holding mPackages because static overlay // packages can't be uninstalled or disabled. // packages can't be uninstalled or disabled. return getStaticOverlayPaths(overlayPackages, targetPath, mInstallLock); return getStaticOverlayPaths(overlayPackages, targetPath); } } } @Override public final String[] getOverlayApks(String targetPackageName) { @Override public final String[] getOverlayApks(String targetPackageName) { Loading Loading @@ -895,11 +886,13 @@ public class PackageManagerService extends IPackageManager.Stub synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) { // We can trust mOverlayPackages without holding mPackages because package uninstall // We can trust mOverlayPackages without holding mPackages because package uninstall // can't happen while running parallel parsing. // can't happen while running parallel parsing. // Moreover holding mPackages on each parsing thread causes dead-lock. // And we can call mInstaller inside getStaticOverlayPaths without holding mInstallLock // because mInstallLock is held before running parallel parsing. // Moreover holding mPackages or mInstallLock on each parsing thread causes dead-lock. return mOverlayPackages == null ? null : return mOverlayPackages == null ? null : getStaticOverlayPaths( getStaticOverlayPaths( getStaticOverlayPackages(mOverlayPackages, targetPackageName), getStaticOverlayPackages(mOverlayPackages, targetPackageName), targetPath, null); targetPath); } } } }