Loading services/core/java/com/android/server/pm/DeletePackageAction.java +3 −1 Original line number Diff line number Diff line Loading @@ -16,17 +16,19 @@ package com.android.server.pm; import android.annotation.NonNull; import android.os.UserHandle; final class DeletePackageAction { public final PackageSetting mDeletingPs; public final PackageSetting mDisabledPs; @NonNull public final PackageRemovedInfo mRemovedInfo; public final int mFlags; public final UserHandle mUser; DeletePackageAction(PackageSetting deletingPs, PackageSetting disabledPs, PackageRemovedInfo removedInfo, int flags, UserHandle user) { @NonNull PackageRemovedInfo removedInfo, int flags, UserHandle user) { mDeletingPs = deletingPs; mDisabledPs = disabledPs; mRemovedInfo = removedInfo; Loading services/core/java/com/android/server/pm/DeletePackageHelper.java +29 −32 Original line number Diff line number Diff line Loading @@ -370,7 +370,7 @@ final class DeletePackageHelper { @GuardedBy("mPm.mInstallLock") public boolean deletePackageLIF(@NonNull String packageName, UserHandle user, boolean deleteCodeAndResources, @NonNull int[] allUserHandles, int flags, PackageRemovedInfo outInfo, boolean writeSettings) { @NonNull PackageRemovedInfo outInfo, boolean writeSettings) { final DeletePackageAction action; synchronized (mPm.mLock) { final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName); Loading Loading @@ -410,8 +410,8 @@ final class DeletePackageHelper { * deleted, {@code null} otherwise. */ @Nullable public static DeletePackageAction mayDeletePackageLocked( PackageRemovedInfo outInfo, PackageSetting ps, @Nullable PackageSetting disabledPs, public static DeletePackageAction mayDeletePackageLocked(@NonNull PackageRemovedInfo outInfo, PackageSetting ps, @Nullable PackageSetting disabledPs, int flags, UserHandle user) { if (ps == null) { return null; Loading Loading @@ -460,12 +460,18 @@ final class DeletePackageHelper { } final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier(); if (outInfo != null) { // Remember which users are affected, before the installed states are modified outInfo.mRemovedUsers = (systemApp || userId == UserHandle.USER_ALL) ? ps.queryUsersInstalledOrHasData(allUserHandles) : new int[]{userId}; } outInfo.populateBroadcastUsers(ps); outInfo.mDataRemoved = (flags & PackageManager.DELETE_KEEP_DATA) == 0; outInfo.mRemovedPackage = ps.getPackageName(); outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName; outInfo.mIsStaticSharedLib = ps.getPkg() != null && ps.getPkg().getStaticSharedLibraryName() != null; outInfo.mIsExternal = ps.isExternalStorage(); outInfo.mRemovedPackageVersionCode = ps.getVersionCode(); if ((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0) && userId != UserHandle.USER_ALL) { Loading Loading @@ -503,7 +509,8 @@ final class DeletePackageHelper { } } if (clearPackageStateAndReturn) { mRemovePackageHelper.clearPackageStateForUserLIF(ps, userId, outInfo, flags); mRemovePackageHelper.clearPackageStateForUserLIF(ps, userId, flags); outInfo.mRemovedAppId = ps.getAppId(); mPm.scheduleWritePackageRestrictions(user); return; } Loading @@ -529,12 +536,8 @@ final class DeletePackageHelper { // If the package removed had SUSPEND_APPS, unset any restrictions that might have been in // place for all affected users. int[] affectedUserIds = (outInfo != null) ? outInfo.mRemovedUsers : null; if (affectedUserIds == null) { affectedUserIds = mPm.resolveUserIds(userId); } final Computer snapshot = mPm.snapshotComputer(); for (final int affectedUserId : affectedUserIds) { for (final int affectedUserId : outInfo.mRemovedUsers) { if (hadSuspendAppsPermission.get(affectedUserId)) { mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId); mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId); Loading @@ -542,32 +545,28 @@ final class DeletePackageHelper { } // Take a note whether we deleted the package for all users if (outInfo != null) { synchronized (mPm.mLock) { outInfo.mRemovedForAllUsers = mPm.mPackages.get(ps.getPackageName()) == null; } } } @GuardedBy("mPm.mInstallLock") private void deleteInstalledPackageLIF(PackageSetting ps, boolean deleteCodeAndResources, int flags, @NonNull int[] allUserHandles, PackageRemovedInfo outInfo, boolean writeSettings) { @NonNull PackageRemovedInfo outInfo, boolean writeSettings) { synchronized (mPm.mLock) { if (outInfo != null) { outInfo.mUid = ps.getAppId(); outInfo.mBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList( mPm.snapshotComputer(), ps, allUserHandles, mPm.mSettings.getPackagesLocked()); } } // Delete package data from internal structures and also remove data if flag is set mRemovePackageHelper.removePackageDataLIF( ps, allUserHandles, outInfo, flags, writeSettings); // Delete application code and resources only for parent packages if (deleteCodeAndResources && (outInfo != null)) { if (deleteCodeAndResources) { outInfo.mArgs = new InstallArgs( ps.getPathString(), getAppDexInstructionSets( ps.getPrimaryCpuAbiLegacy(), ps.getSecondaryCpuAbiLegacy())); Loading Loading @@ -639,7 +638,7 @@ final class DeletePackageHelper { int flags = action.mFlags; final PackageSetting deletedPs = action.mDeletingPs; final PackageRemovedInfo outInfo = action.mRemovedInfo; final boolean applyUserRestrictions = outInfo != null && (outInfo.mOrigUsers != null); final boolean applyUserRestrictions = outInfo.mOrigUsers != null; final AndroidPackage deletedPkg = deletedPs.getPkg(); // Confirm if the system package has been updated // An updated system app can be deleted. This will also have to restore Loading @@ -662,10 +661,8 @@ final class DeletePackageHelper { } } if (outInfo != null) { // Delete the updated package outInfo.mIsRemovedPackageSystemUpdate = true; } if (disabledPs.getVersionCode() < deletedPs.getVersionCode() || disabledPs.getAppId() != deletedPs.getAppId()) { Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +1 −1 Original line number Diff line number Diff line Loading @@ -4126,7 +4126,7 @@ final class InstallPackageHelper { null /* request */)) { mDeletePackageHelper.deletePackageLIF( parsedPackage.getPackageName(), null, true, mPm.mUserManager.getUserIds(), 0, null, false); mPm.mUserManager.getUserIds(), 0, new PackageRemovedInfo(), false); } } else if (newPkgVersionGreater || newSharedUserSetting) { // The application on /system is newer than the application on /data. Loading services/core/java/com/android/server/pm/PackageManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -3044,6 +3044,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } @NonNull int[] resolveUserIds(int userId) { return (userId == UserHandle.USER_ALL) ? mUserManager.getUserIds() : new int[] { userId }; } Loading services/core/java/com/android/server/pm/RemovePackageHelper.java +8 −35 Original line number Diff line number Diff line Loading @@ -252,8 +252,7 @@ final class RemovePackageHelper { } } public void clearPackageStateForUserLIF(PackageSetting ps, int userId, PackageRemovedInfo outInfo, int flags) { public void clearPackageStateForUserLIF(PackageSetting ps, int userId, int flags) { final AndroidPackage pkg; final SharedUserSetting sus; synchronized (mPm.mLock) { Loading Loading @@ -287,25 +286,12 @@ final class RemovePackageHelper { } mPermissionManager.onPackageUninstalled(ps.getPackageName(), ps.getAppId(), ps, pkg, sharedUserPkgs, userId); if (outInfo != null) { if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) { outInfo.mDataRemoved = true; } outInfo.mRemovedPackage = ps.getPackageName(); outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName; outInfo.mIsStaticSharedLib = pkg != null && pkg.getStaticSharedLibraryName() != null; outInfo.mRemovedAppId = ps.getAppId(); outInfo.mBroadcastUsers = outInfo.mRemovedUsers; outInfo.mIsExternal = ps.isExternalStorage(); outInfo.mRemovedPackageVersionCode = ps.getVersionCode(); } } // Called to clean up disabled system packages public void removePackageData(final PackageSetting deletedPs, @NonNull int[] allUserHandles) { synchronized (mPm.mInstallLock) { removePackageDataLIF(deletedPs, allUserHandles, /* outInfo= */ null, removePackageDataLIF(deletedPs, allUserHandles, new PackageRemovedInfo(), /* flags= */ 0, /* writeSettings= */ false); } } Loading @@ -318,20 +304,11 @@ final class RemovePackageHelper { */ @GuardedBy("mPm.mInstallLock") public void removePackageDataLIF(final PackageSetting deletedPs, @NonNull int[] allUserHandles, PackageRemovedInfo outInfo, int flags, boolean writeSettings) { @NonNull PackageRemovedInfo outInfo, int flags, boolean writeSettings) { String packageName = deletedPs.getPackageName(); if (DEBUG_REMOVE) Slog.d(TAG, "removePackageDataLI: " + deletedPs); // Retrieve object to delete permissions for shared user later on final AndroidPackage deletedPkg = deletedPs.getPkg(); if (outInfo != null) { outInfo.mRemovedPackage = packageName; outInfo.mInstallerPackageName = deletedPs.getInstallSource().mInstallerPackageName; outInfo.mIsStaticSharedLib = deletedPkg != null && deletedPkg.getStaticSharedLibraryName() != null; outInfo.populateBroadcastUsers(deletedPs); outInfo.mIsExternal = deletedPs.isExternalStorage(); outInfo.mRemovedPackageVersionCode = deletedPs.getVersionCode(); } removePackageLI(deletedPs.getPackageName(), (flags & PackageManager.DELETE_CHATTY) != 0); if (!deletedPs.isSystem()) { Loading @@ -355,9 +332,6 @@ final class RemovePackageHelper { mAppDataHelper.destroyAppDataLIF(resolvedPkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL); mAppDataHelper.destroyAppProfilesLIF(resolvedPkg.getPackageName()); if (outInfo != null) { outInfo.mDataRemoved = true; } } int removedAppId = -1; Loading @@ -373,9 +347,8 @@ final class RemovePackageHelper { mPm.mAppsFilter.removePackage(snapshot, snapshot.getPackageStateInternal(packageName)); removedAppId = mPm.mSettings.removePackageLPw(packageName); if (outInfo != null) { outInfo.mRemovedAppId = removedAppId; } if (!mPm.mSettings.isDisabledSystemPackageLPr(packageName)) { // If we don't have a disabled system package to reinstall, the package is // really gone and its permission state should be removed. Loading Loading @@ -403,8 +376,8 @@ final class RemovePackageHelper { mBroadcastHelper.sendPreferredActivityChangedBroadcast(UserHandle.USER_ALL); }); } } else if (!deletedPs.isSystem() && outInfo != null && !outInfo.mIsUpdate && outInfo.mRemovedUsers != null && !outInfo.mIsExternal) { } else if (!deletedPs.isSystem() && !outInfo.mIsUpdate && outInfo.mRemovedUsers != null && !deletedPs.isExternalStorage()) { // For non-system uninstalls with DELETE_KEEP_DATA, set the installed state to false // for affected users. This does not apply to app updates where the old apk is replaced // but the old data remains. Loading @@ -424,7 +397,7 @@ final class RemovePackageHelper { // make sure to preserve per-user installed state if this removal was just // a downgrade of a system app to the factory package boolean installedStateChanged = false; if (outInfo != null && outInfo.mOrigUsers != null && deletedPs.isSystem()) { if (outInfo.mOrigUsers != null && deletedPs.isSystem()) { if (DEBUG_REMOVE) { Slog.d(TAG, "Propagating install state across downgrade"); } Loading Loading
services/core/java/com/android/server/pm/DeletePackageAction.java +3 −1 Original line number Diff line number Diff line Loading @@ -16,17 +16,19 @@ package com.android.server.pm; import android.annotation.NonNull; import android.os.UserHandle; final class DeletePackageAction { public final PackageSetting mDeletingPs; public final PackageSetting mDisabledPs; @NonNull public final PackageRemovedInfo mRemovedInfo; public final int mFlags; public final UserHandle mUser; DeletePackageAction(PackageSetting deletingPs, PackageSetting disabledPs, PackageRemovedInfo removedInfo, int flags, UserHandle user) { @NonNull PackageRemovedInfo removedInfo, int flags, UserHandle user) { mDeletingPs = deletingPs; mDisabledPs = disabledPs; mRemovedInfo = removedInfo; Loading
services/core/java/com/android/server/pm/DeletePackageHelper.java +29 −32 Original line number Diff line number Diff line Loading @@ -370,7 +370,7 @@ final class DeletePackageHelper { @GuardedBy("mPm.mInstallLock") public boolean deletePackageLIF(@NonNull String packageName, UserHandle user, boolean deleteCodeAndResources, @NonNull int[] allUserHandles, int flags, PackageRemovedInfo outInfo, boolean writeSettings) { @NonNull PackageRemovedInfo outInfo, boolean writeSettings) { final DeletePackageAction action; synchronized (mPm.mLock) { final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName); Loading Loading @@ -410,8 +410,8 @@ final class DeletePackageHelper { * deleted, {@code null} otherwise. */ @Nullable public static DeletePackageAction mayDeletePackageLocked( PackageRemovedInfo outInfo, PackageSetting ps, @Nullable PackageSetting disabledPs, public static DeletePackageAction mayDeletePackageLocked(@NonNull PackageRemovedInfo outInfo, PackageSetting ps, @Nullable PackageSetting disabledPs, int flags, UserHandle user) { if (ps == null) { return null; Loading Loading @@ -460,12 +460,18 @@ final class DeletePackageHelper { } final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier(); if (outInfo != null) { // Remember which users are affected, before the installed states are modified outInfo.mRemovedUsers = (systemApp || userId == UserHandle.USER_ALL) ? ps.queryUsersInstalledOrHasData(allUserHandles) : new int[]{userId}; } outInfo.populateBroadcastUsers(ps); outInfo.mDataRemoved = (flags & PackageManager.DELETE_KEEP_DATA) == 0; outInfo.mRemovedPackage = ps.getPackageName(); outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName; outInfo.mIsStaticSharedLib = ps.getPkg() != null && ps.getPkg().getStaticSharedLibraryName() != null; outInfo.mIsExternal = ps.isExternalStorage(); outInfo.mRemovedPackageVersionCode = ps.getVersionCode(); if ((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0) && userId != UserHandle.USER_ALL) { Loading Loading @@ -503,7 +509,8 @@ final class DeletePackageHelper { } } if (clearPackageStateAndReturn) { mRemovePackageHelper.clearPackageStateForUserLIF(ps, userId, outInfo, flags); mRemovePackageHelper.clearPackageStateForUserLIF(ps, userId, flags); outInfo.mRemovedAppId = ps.getAppId(); mPm.scheduleWritePackageRestrictions(user); return; } Loading @@ -529,12 +536,8 @@ final class DeletePackageHelper { // If the package removed had SUSPEND_APPS, unset any restrictions that might have been in // place for all affected users. int[] affectedUserIds = (outInfo != null) ? outInfo.mRemovedUsers : null; if (affectedUserIds == null) { affectedUserIds = mPm.resolveUserIds(userId); } final Computer snapshot = mPm.snapshotComputer(); for (final int affectedUserId : affectedUserIds) { for (final int affectedUserId : outInfo.mRemovedUsers) { if (hadSuspendAppsPermission.get(affectedUserId)) { mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId); mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId); Loading @@ -542,32 +545,28 @@ final class DeletePackageHelper { } // Take a note whether we deleted the package for all users if (outInfo != null) { synchronized (mPm.mLock) { outInfo.mRemovedForAllUsers = mPm.mPackages.get(ps.getPackageName()) == null; } } } @GuardedBy("mPm.mInstallLock") private void deleteInstalledPackageLIF(PackageSetting ps, boolean deleteCodeAndResources, int flags, @NonNull int[] allUserHandles, PackageRemovedInfo outInfo, boolean writeSettings) { @NonNull PackageRemovedInfo outInfo, boolean writeSettings) { synchronized (mPm.mLock) { if (outInfo != null) { outInfo.mUid = ps.getAppId(); outInfo.mBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList( mPm.snapshotComputer(), ps, allUserHandles, mPm.mSettings.getPackagesLocked()); } } // Delete package data from internal structures and also remove data if flag is set mRemovePackageHelper.removePackageDataLIF( ps, allUserHandles, outInfo, flags, writeSettings); // Delete application code and resources only for parent packages if (deleteCodeAndResources && (outInfo != null)) { if (deleteCodeAndResources) { outInfo.mArgs = new InstallArgs( ps.getPathString(), getAppDexInstructionSets( ps.getPrimaryCpuAbiLegacy(), ps.getSecondaryCpuAbiLegacy())); Loading Loading @@ -639,7 +638,7 @@ final class DeletePackageHelper { int flags = action.mFlags; final PackageSetting deletedPs = action.mDeletingPs; final PackageRemovedInfo outInfo = action.mRemovedInfo; final boolean applyUserRestrictions = outInfo != null && (outInfo.mOrigUsers != null); final boolean applyUserRestrictions = outInfo.mOrigUsers != null; final AndroidPackage deletedPkg = deletedPs.getPkg(); // Confirm if the system package has been updated // An updated system app can be deleted. This will also have to restore Loading @@ -662,10 +661,8 @@ final class DeletePackageHelper { } } if (outInfo != null) { // Delete the updated package outInfo.mIsRemovedPackageSystemUpdate = true; } if (disabledPs.getVersionCode() < deletedPs.getVersionCode() || disabledPs.getAppId() != deletedPs.getAppId()) { Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +1 −1 Original line number Diff line number Diff line Loading @@ -4126,7 +4126,7 @@ final class InstallPackageHelper { null /* request */)) { mDeletePackageHelper.deletePackageLIF( parsedPackage.getPackageName(), null, true, mPm.mUserManager.getUserIds(), 0, null, false); mPm.mUserManager.getUserIds(), 0, new PackageRemovedInfo(), false); } } else if (newPkgVersionGreater || newSharedUserSetting) { // The application on /system is newer than the application on /data. Loading
services/core/java/com/android/server/pm/PackageManagerService.java +1 −0 Original line number Diff line number Diff line Loading @@ -3044,6 +3044,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } @NonNull int[] resolveUserIds(int userId) { return (userId == UserHandle.USER_ALL) ? mUserManager.getUserIds() : new int[] { userId }; } Loading
services/core/java/com/android/server/pm/RemovePackageHelper.java +8 −35 Original line number Diff line number Diff line Loading @@ -252,8 +252,7 @@ final class RemovePackageHelper { } } public void clearPackageStateForUserLIF(PackageSetting ps, int userId, PackageRemovedInfo outInfo, int flags) { public void clearPackageStateForUserLIF(PackageSetting ps, int userId, int flags) { final AndroidPackage pkg; final SharedUserSetting sus; synchronized (mPm.mLock) { Loading Loading @@ -287,25 +286,12 @@ final class RemovePackageHelper { } mPermissionManager.onPackageUninstalled(ps.getPackageName(), ps.getAppId(), ps, pkg, sharedUserPkgs, userId); if (outInfo != null) { if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) { outInfo.mDataRemoved = true; } outInfo.mRemovedPackage = ps.getPackageName(); outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName; outInfo.mIsStaticSharedLib = pkg != null && pkg.getStaticSharedLibraryName() != null; outInfo.mRemovedAppId = ps.getAppId(); outInfo.mBroadcastUsers = outInfo.mRemovedUsers; outInfo.mIsExternal = ps.isExternalStorage(); outInfo.mRemovedPackageVersionCode = ps.getVersionCode(); } } // Called to clean up disabled system packages public void removePackageData(final PackageSetting deletedPs, @NonNull int[] allUserHandles) { synchronized (mPm.mInstallLock) { removePackageDataLIF(deletedPs, allUserHandles, /* outInfo= */ null, removePackageDataLIF(deletedPs, allUserHandles, new PackageRemovedInfo(), /* flags= */ 0, /* writeSettings= */ false); } } Loading @@ -318,20 +304,11 @@ final class RemovePackageHelper { */ @GuardedBy("mPm.mInstallLock") public void removePackageDataLIF(final PackageSetting deletedPs, @NonNull int[] allUserHandles, PackageRemovedInfo outInfo, int flags, boolean writeSettings) { @NonNull PackageRemovedInfo outInfo, int flags, boolean writeSettings) { String packageName = deletedPs.getPackageName(); if (DEBUG_REMOVE) Slog.d(TAG, "removePackageDataLI: " + deletedPs); // Retrieve object to delete permissions for shared user later on final AndroidPackage deletedPkg = deletedPs.getPkg(); if (outInfo != null) { outInfo.mRemovedPackage = packageName; outInfo.mInstallerPackageName = deletedPs.getInstallSource().mInstallerPackageName; outInfo.mIsStaticSharedLib = deletedPkg != null && deletedPkg.getStaticSharedLibraryName() != null; outInfo.populateBroadcastUsers(deletedPs); outInfo.mIsExternal = deletedPs.isExternalStorage(); outInfo.mRemovedPackageVersionCode = deletedPs.getVersionCode(); } removePackageLI(deletedPs.getPackageName(), (flags & PackageManager.DELETE_CHATTY) != 0); if (!deletedPs.isSystem()) { Loading @@ -355,9 +332,6 @@ final class RemovePackageHelper { mAppDataHelper.destroyAppDataLIF(resolvedPkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL); mAppDataHelper.destroyAppProfilesLIF(resolvedPkg.getPackageName()); if (outInfo != null) { outInfo.mDataRemoved = true; } } int removedAppId = -1; Loading @@ -373,9 +347,8 @@ final class RemovePackageHelper { mPm.mAppsFilter.removePackage(snapshot, snapshot.getPackageStateInternal(packageName)); removedAppId = mPm.mSettings.removePackageLPw(packageName); if (outInfo != null) { outInfo.mRemovedAppId = removedAppId; } if (!mPm.mSettings.isDisabledSystemPackageLPr(packageName)) { // If we don't have a disabled system package to reinstall, the package is // really gone and its permission state should be removed. Loading Loading @@ -403,8 +376,8 @@ final class RemovePackageHelper { mBroadcastHelper.sendPreferredActivityChangedBroadcast(UserHandle.USER_ALL); }); } } else if (!deletedPs.isSystem() && outInfo != null && !outInfo.mIsUpdate && outInfo.mRemovedUsers != null && !outInfo.mIsExternal) { } else if (!deletedPs.isSystem() && !outInfo.mIsUpdate && outInfo.mRemovedUsers != null && !deletedPs.isExternalStorage()) { // For non-system uninstalls with DELETE_KEEP_DATA, set the installed state to false // for affected users. This does not apply to app updates where the old apk is replaced // but the old data remains. Loading @@ -424,7 +397,7 @@ final class RemovePackageHelper { // make sure to preserve per-user installed state if this removal was just // a downgrade of a system app to the factory package boolean installedStateChanged = false; if (outInfo != null && outInfo.mOrigUsers != null && deletedPs.isSystem()) { if (outInfo.mOrigUsers != null && deletedPs.isSystem()) { if (DEBUG_REMOVE) { Slog.d(TAG, "Propagating install state across downgrade"); } Loading