From 409fcc7207afb14cc42c4a6e995bfde7a9411b4b Mon Sep 17 00:00:00 2001 From: yuxi1 Date: Tue, 23 Feb 2021 17:55:54 +0800 Subject: [PATCH] [Bugfix] Fix after performing adb shell am hang and kill this process, the phone can not resume from hang state After performing adb shell am hang and kill this process, the phone can not resume from hang state. The reason is that the IBinder object in runHang(PrintWriter pw) of ActivityManagerShellCommand.java is not the IBinder object of client. Bug: 180949375 Fixes: 180949375 Test: Run adb shell am hang, and open some APPs, then the phone will hang. Then perform ctrl + c, the phone can resume from hang state. Signed-off-by: yuxi1 Change-Id: Ie1153df2e21fc267fd131994422b7c263a17372a --- core/java/android/os/ShellCallback.java | 4 ++++ .../android/server/am/ActivityManagerShellCommand.java | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/java/android/os/ShellCallback.java b/core/java/android/os/ShellCallback.java index 632f6c8694ce9..be9fb89649d0b 100644 --- a/core/java/android/os/ShellCallback.java +++ b/core/java/android/os/ShellCallback.java @@ -102,6 +102,10 @@ public class ShellCallback implements Parcelable { } } + public IBinder getShellCallbackBinder() { + return mShellCallback.asBinder(); + } + ShellCallback(Parcel in) { mLocal = false; mShellCallback = IShellCallback.Stub.asInterface(in.readStrongBinder()); diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 149e3baa90e7a..af89907787734 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -1690,7 +1690,14 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println("Hanging the system..."); pw.flush(); - mInterface.hang(new Binder(), allowRestart); + try { + mInterface.hang(getShellCallback().getShellCallbackBinder(), allowRestart); + } catch (NullPointerException e) { + pw.println("Hanging failed, since caller " + Binder.getCallingPid() + + " did not provide a ShellCallback!"); + pw.flush(); + return 1; + } return 0; }