summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2015-11-05 10:00:05 -0800
committerThe Android Automerger <android-build@google.com>2015-11-05 17:35:27 -0800
commit14083582a3fd306ce28ab2be46d61cd4d299b01c (patch)
tree31b49012bc9e180d805c4aebcb3287f36112396b
parentd028ee75c5675e38ae71b7aeb32fe10637af1a98 (diff)
downloadbase-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.java19
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;
}