Ignore sharedUserId when package already left shared UID

After a package has left shared UID, its non-shared UID state should be
preserved after the next scan (e.g. reboot or an APK upgrade), or else
the app would observe data loss.

Bug: 235460457
Test: atest CtsSharedUserMigrationTestCases
Change-Id: I692fe3ff59b43f2fc0ee53de0ce8a2f38cd29f02
(cherry picked from commit 84ba40de12dac4efa6b90197e910dcdf432009f5)
Merged-In: I692fe3ff59b43f2fc0ee53de0ce8a2f38cd29f02
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index e90a5db..7da5f51 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -3701,8 +3701,9 @@
                     parsedPackage.getPackageName());
 
             boolean ignoreSharedUserId = false;
-            if (installedPkgSetting == null) {
-                // We can directly ignore sharedUserSetting for new installs
+            if (installedPkgSetting == null || !installedPkgSetting.hasSharedUser()) {
+                // Directly ignore sharedUserSetting for new installs, or if the app has
+                // already left shared UID
                 ignoreSharedUserId = parsedPackage.isLeavingSharedUid();
             }