From aaa8d9fe67ee4f47393aa8609295dcdbac9ce095 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Mon, 13 Jul 2020 14:31:22 -0700 Subject: [PATCH] Run Binder.dump away from main thread Fixes: 158212653 Test: ensure .dump() is no longer run on main thread Change-Id: I7c6e1c9f54c65c21e411813ffda636377a1c2bbe --- .../android/permission/PermissionControllerManager.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index 43bd76de1f46e..17a78a8f301e6 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -21,6 +21,7 @@ import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DENIE import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED; import static android.permission.PermissionControllerService.SERVICE_INTERFACE; +import static com.android.internal.util.FunctionalUtils.uncheckExceptions; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; @@ -56,6 +57,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.infra.AndroidFuture; import com.android.internal.infra.RemoteStream; import com.android.internal.infra.ServiceConnector; +import com.android.internal.os.BackgroundThread; import com.android.internal.util.CollectionUtils; import libcore.util.EmptyArray; @@ -497,8 +499,11 @@ public final class PermissionControllerManager { */ public void dump(@NonNull FileDescriptor fd, @Nullable String[] args) { try { - mRemoteService.post(service -> service.asBinder().dump(fd, args)) - .get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); + mRemoteService.postAsync(service -> { + return AndroidFuture.runAsync(uncheckExceptions(() -> { + service.asBinder().dump(fd, args); + }), BackgroundThread.getExecutor()); + }).get(REQUEST_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } catch (Exception e) { Log.e(TAG, "Could not get dump", e); }