Fix deadlock when ParallelPackageParserCallback is used

Bug: 77232370
Test: succeeded building and tested with taimen
Change-Id: I425686c65a3cee88c10fceb7b5d0b5d89e49fc70
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 775fdaa..e08ec556 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -808,7 +808,7 @@
         }
 
         final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages,
-                String targetPath) {
+                String targetPath, Object installLock) {
             if (overlayPackages == null || overlayPackages.isEmpty()) {
                 return null;
             }
@@ -828,7 +828,16 @@
                     //
                     // OverlayManagerService will update each of them with a correct gid from its
                     // target package app id.
-                    synchronized (mInstallLock) {
+                    if (installLock != null) {
+                        synchronized (installLock) {
+                            mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
+                                    UserHandle.getSharedAppGid(
+                                            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)));
@@ -853,7 +862,7 @@
             }
             // It is safe to keep overlayPackages without holding mPackages because static overlay
             // packages can't be uninstalled or disabled.
-            return getStaticOverlayPaths(overlayPackages, targetPath);
+            return getStaticOverlayPaths(overlayPackages, targetPath, mInstallLock);
         }
 
         @Override public final String[] getOverlayApks(String targetPackageName) {
@@ -890,7 +899,7 @@
             return mOverlayPackages == null ? null :
                     getStaticOverlayPaths(
                             getStaticOverlayPackages(mOverlayPackages, targetPackageName),
-                            targetPath);
+                            targetPath, null);
         }
     }