diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index cc7ded0891814..d8f65c8a4754d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2229,6 +2229,18 @@ public class PackageManagerService extends IPackageManager.Stub { mFirstBoot = !mSettings.readLPw(sUserManager.getUsers(false)); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + // Clean up orphaned packages for which the code path doesn't exist + // and they are an update to a system app - caused by bug/32321269 + final int packageSettingCount = mSettings.mPackages.size(); + for (int i = packageSettingCount - 1; i >= 0; i--) { + PackageSetting ps = mSettings.mPackages.valueAt(i); + if (!isExternal(ps) && (ps.codePath == null || !ps.codePath.exists()) + && mSettings.getDisabledSystemPkgLPr(ps.name) != null) { + mSettings.mPackages.removeAt(i); + mSettings.enableSystemPackageLPw(ps.name); + } + } + if (mFirstBoot) { requestCopyPreoptedFiles(); } @@ -3209,8 +3221,12 @@ public class PackageManagerService extends IPackageManager.Stub { flags = updateFlagsForPackage(flags, userId, packageName); enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission */, false /* checkShell */, "get package info"); + // reader synchronized (mPackages) { + // Normalize package name to hanlde renamed packages + packageName = normalizePackageNameLPr(packageName); + final boolean matchFactoryOnly = (flags & MATCH_FACTORY_ONLY) != 0; PackageParser.Package p = null; if (matchFactoryOnly) { @@ -3413,8 +3429,12 @@ public class PackageManagerService extends IPackageManager.Stub { flags = updateFlagsForApplication(flags, userId, packageName); enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission */, false /* checkShell */, "get application info"); + // writer synchronized (mPackages) { + // Normalize package name to hanlde renamed packages + packageName = normalizePackageNameLPr(packageName); + PackageParser.Package p = mPackages.get(packageName); if (DEBUG_PACKAGE_INFO) Log.v( TAG, "getApplicationInfo " + packageName @@ -3436,6 +3456,11 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } + private String normalizePackageNameLPr(String packageName) { + String normalizedPackageName = mSettings.getRenamedPackageLPr(packageName); + return normalizedPackageName != null ? normalizedPackageName : packageName; + } + @Override public void freeStorageAndNotify(final String volumeUuid, final long freeStorageSize, final IPackageDataObserver observer) { @@ -20104,6 +20129,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); private void assertPackageKnown(String volumeUuid, String packageName) throws PackageManagerException { synchronized (mPackages) { + // Normalize package name to handle renamed packages + packageName = normalizePackageNameLPr(packageName); + final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps == null) { throw new PackageManagerException("Package " + packageName + " is unknown"); @@ -20118,6 +20146,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); private void assertPackageKnownAndInstalled(String volumeUuid, String packageName, int userId) throws PackageManagerException { synchronized (mPackages) { + // Normalize package name to handle renamed packages + packageName = normalizePackageNameLPr(packageName); + final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps == null) { throw new PackageManagerException("Package " + packageName + " is unknown");