diff options
author | Jeff Sharkey <jsharkey@android.com> | 2015-11-05 10:00:05 -0800 |
---|---|---|
committer | The Android Automerger <android-build@google.com> | 2015-11-05 17:35:27 -0800 |
commit | 14083582a3fd306ce28ab2be46d61cd4d299b01c (patch) | |
tree | 31b49012bc9e180d805c4aebcb3287f36112396b | |
parent | d028ee75c5675e38ae71b7aeb32fe10637af1a98 (diff) | |
download | base-14083582a3fd306ce28ab2be46d61cd4d299b01c.tar.gz |
Kick movement preconditions onto handler thread.
The bulk of package moving already occurs on the handler thread,
but one of the precondition steps requires that we make an installd
call to calculate disk space of the app. If there was already
another long-running installd call going on, we could end up ANR'ing
the caller.
Since movePackage() is already designed to return a moveId and go
async, we can push all the precondition steps onto the handler thread
to prevent the ANR.
Bug: 25490003
Change-Id: I62d555c23bbf81b791f6f4cabc40c3d64c580cf8
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 4e493129224a..c1d091b04c1b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -15986,13 +15986,18 @@ public class PackageManagerService extends IPackageManager.Stub { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MOVE_PACKAGE, null); final int moveId = mNextMoveId.getAndIncrement(); - try { - movePackageInternal(packageName, volumeUuid, moveId); - } catch (PackageManagerException e) { - Slog.w(TAG, "Failed to move " + packageName, e); - mMoveCallbacks.notifyStatusChanged(moveId, - PackageManager.MOVE_FAILED_INTERNAL_ERROR); - } + mHandler.post(new Runnable() { + @Override + public void run() { + try { + movePackageInternal(packageName, volumeUuid, moveId); + } catch (PackageManagerException e) { + Slog.w(TAG, "Failed to move " + packageName, e); + mMoveCallbacks.notifyStatusChanged(moveId, + PackageManager.MOVE_FAILED_INTERNAL_ERROR); + } + } + }); return moveId; } |