Loading services/core/java/com/android/server/pm/PackageManagerService.java +96 −74 Original line number Diff line number Diff line Loading @@ -1603,6 +1603,10 @@ public class PackageManagerService extends IPackageManager.Stub final boolean didRestore = (msg.arg2 != 0); mRunningInstalls.delete(msg.arg1); if (data != null && data.res.freezer != null) { data.res.freezer.close(); } if (data != null && data.mPostInstallRunnable != null) { data.mPostInstallRunnable.run(); } else if (data != null) { Loading Loading @@ -13434,6 +13438,38 @@ public class PackageManagerService extends IPackageManager.Stub // restore if appropriate, then pass responsibility back to the // Package Manager to run the post-install observer callbacks // and broadcasts. if (res.freezer != null) { res.freezer.close(); } doRestore = performBackupManagerRestore(userId, token, res); } // If this is an update to a package that might be potentially downgraded, then we // need to check with the rollback manager whether there's any userdata that might // need to be snapshotted or restored for the package. // // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. if (res.returnCode == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) { doRestore = performRollbackManagerRestore(userId, token, res, data); } if (!doRestore) { // No restore possible, or the Backup Manager was mysteriously not // available -- just fire the post-install work request directly. if (DEBUG_INSTALL) Log.v(TAG, "No restore - queue post-install for " + token); Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "postInstall", token); Message msg = mHandler.obtainMessage(POST_INSTALL, token, 0); mHandler.sendMessage(msg); } } /** * Perform Backup Manager restore for a given {@link PackageInstalledInfo}. * Returns whether the restore successfully completed. */ private boolean performBackupManagerRestore(int userId, int token, PackageInstalledInfo res) { IBackupManager bm = IBackupManager.Stub.asInterface( ServiceManager.getService(Context.BACKUP_SERVICE)); if (bm != null) { Loading @@ -13451,26 +13487,27 @@ public class PackageManagerService extends IPackageManager.Stub bm.restoreAtInstallForUser( userId, res.pkg.getAppInfoPackageName(), token); } else { doRestore = false; return false; } } catch (RemoteException e) { // can't happen; the backup manager is local } catch (Exception e) { Slog.e(TAG, "Exception trying to enqueue restore", e); doRestore = false; return false; } } else { Slog.e(TAG, "Backup Manager not found!"); doRestore = false; return false; } return true; } // If this is an update to a package that might be potentially downgraded, then we // need to check with the rollback manager whether there's any userdata that might // need to be snapshotted or restored for the package. // // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. if (res.returnCode == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) { /** * Perform Rollback Manager restore for a given {@link PackageInstalledInfo}. * Returns whether the restore successfully completed. */ private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res, PostInstallData data) { IRollbackManager rm = IRollbackManager.Stub.asInterface( ServiceManager.getService(Context.ROLLBACK_SERVICE)); Loading Loading @@ -13504,21 +13541,11 @@ public class PackageManagerService extends IPackageManager.Stub seInfo, token); } catch (RemoteException re) { Log.e(TAG, "Error snapshotting/restoring user data: " + re); return false; } doRestore = true; } } if (!doRestore) { // No restore possible, or the Backup Manager was mysteriously not // available -- just fire the post-install work request directly. if (DEBUG_INSTALL) Log.v(TAG, "No restore - queue post-install for " + token); Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "postInstall", token); Message msg = mHandler.obtainMessage(POST_INSTALL, token, 0); mHandler.sendMessage(msg); return true; } return false; } /** Loading Loading @@ -14802,6 +14829,7 @@ public class PackageManagerService extends IPackageManager.Stub ArrayMap<String, PackageInstalledInfo> addedChildPackages; // The set of packages consuming this shared library or null if no consumers exist. ArrayList<AndroidPackage> libraryConsumers; PackageFreezer freezer; public void setError(int code, String msg) { setReturnCode(code); Loading Loading @@ -15675,16 +15703,12 @@ public class PackageManagerService extends IPackageManager.Stub // TODO(patb): create a more descriptive reason than unknown in future release // mark all non-failure installs as UNKNOWN so we do not treat them as success for (InstallRequest request : requests) { request.installResult.freezer.close(); if (request.installResult.returnCode == PackageManager.INSTALL_SUCCEEDED) { request.installResult.returnCode = PackageManager.INSTALL_UNKNOWN; } } } for (PrepareResult result : prepareResults.values()) { if (result.freezer != null) { result.freezer.close(); } } Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } } Loading Loading @@ -15792,15 +15816,13 @@ public class PackageManagerService extends IPackageManager.Stub public final ParsedPackage packageToScan; public final boolean clearCodeCache; public final boolean system; public final PackageFreezer freezer; public final PackageSetting originalPs; public final PackageSetting disabledPs; private PrepareResult(boolean replace, int scanFlags, int parseFlags, AndroidPackage existingPackage, ParsedPackage packageToScan, boolean clearCodeCache, boolean system, PackageFreezer freezer, PackageSetting originalPs, PackageSetting disabledPs) { PackageSetting originalPs, PackageSetting disabledPs) { this.replace = replace; this.scanFlags = scanFlags; this.parseFlags = parseFlags; Loading @@ -15808,7 +15830,6 @@ public class PackageManagerService extends IPackageManager.Stub this.packageToScan = packageToScan; this.clearCodeCache = clearCodeCache; this.system = system; this.freezer = freezer; this.originalPs = originalPs; this.disabledPs = disabledPs; } Loading Loading @@ -16437,9 +16458,10 @@ public class PackageManagerService extends IPackageManager.Stub shouldCloseFreezerBeforeReturn = false; return new PrepareResult(replace, targetScanFlags, targetParseFlags, existingPackage, parsedPackage, replace /* clearCodeCache */, sysPkg, freezer, existingPackage, parsedPackage, replace /* clearCodeCache */, sysPkg, ps, disabledPs); } finally { res.freezer = freezer; if (shouldCloseFreezerBeforeReturn) { freezer.close(); } Loading
services/core/java/com/android/server/pm/PackageManagerService.java +96 −74 Original line number Diff line number Diff line Loading @@ -1603,6 +1603,10 @@ public class PackageManagerService extends IPackageManager.Stub final boolean didRestore = (msg.arg2 != 0); mRunningInstalls.delete(msg.arg1); if (data != null && data.res.freezer != null) { data.res.freezer.close(); } if (data != null && data.mPostInstallRunnable != null) { data.mPostInstallRunnable.run(); } else if (data != null) { Loading Loading @@ -13434,6 +13438,38 @@ public class PackageManagerService extends IPackageManager.Stub // restore if appropriate, then pass responsibility back to the // Package Manager to run the post-install observer callbacks // and broadcasts. if (res.freezer != null) { res.freezer.close(); } doRestore = performBackupManagerRestore(userId, token, res); } // If this is an update to a package that might be potentially downgraded, then we // need to check with the rollback manager whether there's any userdata that might // need to be snapshotted or restored for the package. // // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. if (res.returnCode == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) { doRestore = performRollbackManagerRestore(userId, token, res, data); } if (!doRestore) { // No restore possible, or the Backup Manager was mysteriously not // available -- just fire the post-install work request directly. if (DEBUG_INSTALL) Log.v(TAG, "No restore - queue post-install for " + token); Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "postInstall", token); Message msg = mHandler.obtainMessage(POST_INSTALL, token, 0); mHandler.sendMessage(msg); } } /** * Perform Backup Manager restore for a given {@link PackageInstalledInfo}. * Returns whether the restore successfully completed. */ private boolean performBackupManagerRestore(int userId, int token, PackageInstalledInfo res) { IBackupManager bm = IBackupManager.Stub.asInterface( ServiceManager.getService(Context.BACKUP_SERVICE)); if (bm != null) { Loading @@ -13451,26 +13487,27 @@ public class PackageManagerService extends IPackageManager.Stub bm.restoreAtInstallForUser( userId, res.pkg.getAppInfoPackageName(), token); } else { doRestore = false; return false; } } catch (RemoteException e) { // can't happen; the backup manager is local } catch (Exception e) { Slog.e(TAG, "Exception trying to enqueue restore", e); doRestore = false; return false; } } else { Slog.e(TAG, "Backup Manager not found!"); doRestore = false; return false; } return true; } // If this is an update to a package that might be potentially downgraded, then we // need to check with the rollback manager whether there's any userdata that might // need to be snapshotted or restored for the package. // // TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL. if (res.returnCode == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) { /** * Perform Rollback Manager restore for a given {@link PackageInstalledInfo}. * Returns whether the restore successfully completed. */ private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res, PostInstallData data) { IRollbackManager rm = IRollbackManager.Stub.asInterface( ServiceManager.getService(Context.ROLLBACK_SERVICE)); Loading Loading @@ -13504,21 +13541,11 @@ public class PackageManagerService extends IPackageManager.Stub seInfo, token); } catch (RemoteException re) { Log.e(TAG, "Error snapshotting/restoring user data: " + re); return false; } doRestore = true; } } if (!doRestore) { // No restore possible, or the Backup Manager was mysteriously not // available -- just fire the post-install work request directly. if (DEBUG_INSTALL) Log.v(TAG, "No restore - queue post-install for " + token); Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "postInstall", token); Message msg = mHandler.obtainMessage(POST_INSTALL, token, 0); mHandler.sendMessage(msg); return true; } return false; } /** Loading Loading @@ -14802,6 +14829,7 @@ public class PackageManagerService extends IPackageManager.Stub ArrayMap<String, PackageInstalledInfo> addedChildPackages; // The set of packages consuming this shared library or null if no consumers exist. ArrayList<AndroidPackage> libraryConsumers; PackageFreezer freezer; public void setError(int code, String msg) { setReturnCode(code); Loading Loading @@ -15675,16 +15703,12 @@ public class PackageManagerService extends IPackageManager.Stub // TODO(patb): create a more descriptive reason than unknown in future release // mark all non-failure installs as UNKNOWN so we do not treat them as success for (InstallRequest request : requests) { request.installResult.freezer.close(); if (request.installResult.returnCode == PackageManager.INSTALL_SUCCEEDED) { request.installResult.returnCode = PackageManager.INSTALL_UNKNOWN; } } } for (PrepareResult result : prepareResults.values()) { if (result.freezer != null) { result.freezer.close(); } } Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } } Loading Loading @@ -15792,15 +15816,13 @@ public class PackageManagerService extends IPackageManager.Stub public final ParsedPackage packageToScan; public final boolean clearCodeCache; public final boolean system; public final PackageFreezer freezer; public final PackageSetting originalPs; public final PackageSetting disabledPs; private PrepareResult(boolean replace, int scanFlags, int parseFlags, AndroidPackage existingPackage, ParsedPackage packageToScan, boolean clearCodeCache, boolean system, PackageFreezer freezer, PackageSetting originalPs, PackageSetting disabledPs) { PackageSetting originalPs, PackageSetting disabledPs) { this.replace = replace; this.scanFlags = scanFlags; this.parseFlags = parseFlags; Loading @@ -15808,7 +15830,6 @@ public class PackageManagerService extends IPackageManager.Stub this.packageToScan = packageToScan; this.clearCodeCache = clearCodeCache; this.system = system; this.freezer = freezer; this.originalPs = originalPs; this.disabledPs = disabledPs; } Loading Loading @@ -16437,9 +16458,10 @@ public class PackageManagerService extends IPackageManager.Stub shouldCloseFreezerBeforeReturn = false; return new PrepareResult(replace, targetScanFlags, targetParseFlags, existingPackage, parsedPackage, replace /* clearCodeCache */, sysPkg, freezer, existingPackage, parsedPackage, replace /* clearCodeCache */, sysPkg, ps, disabledPs); } finally { res.freezer = freezer; if (shouldCloseFreezerBeforeReturn) { freezer.close(); }