From e844450b23ce84092a25b8fbadd55754298c8ae2 Mon Sep 17 00:00:00 2001 From: tehcneko <7764726+tehcneko@users.noreply.github.com> Date: Wed, 24 Feb 2021 20:13:05 +0800 Subject: [PATCH] [core] Add reboot and force stop --- .../lspd/service/LSPManagerService.java | 10 +++++ .../lsposed/lspd/service/PowerService.java | 42 +++++++++++++++++++ .../java/android/app/IActivityManager.java | 2 + .../main/java/android/os/IPowerManager.java | 12 ++++++ .../lsposed/lspd/ILSPManagerService.aidl | 4 ++ 5 files changed, 70 insertions(+) create mode 100644 core/src/main/java/io/github/lsposed/lspd/service/PowerService.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/IPowerManager.java diff --git a/core/src/main/java/io/github/lsposed/lspd/service/LSPManagerService.java b/core/src/main/java/io/github/lsposed/lspd/service/LSPManagerService.java index 4b55c119..afcf7178 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/LSPManagerService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/LSPManagerService.java @@ -145,4 +145,14 @@ public class LSPManagerService extends ILSPManagerService.Stub { public PackageInfo getPackageInfo(String packageName, int flags, int uid) throws RemoteException { return PackageService.getPackageInfo(packageName, flags, uid); } + + @Override + public void forceStopPackage(String packageName, int userId) throws RemoteException { + ActivityManagerService.forceStopPackage(packageName, userId); + } + + @Override + public void reboot(boolean confirm, String reason, boolean wait) throws RemoteException { + PowerService.reboot(confirm, reason, wait); + } } diff --git a/core/src/main/java/io/github/lsposed/lspd/service/PowerService.java b/core/src/main/java/io/github/lsposed/lspd/service/PowerService.java new file mode 100644 index 00000000..199b2433 --- /dev/null +++ b/core/src/main/java/io/github/lsposed/lspd/service/PowerService.java @@ -0,0 +1,42 @@ +package io.github.lsposed.lspd.service; + +import android.os.IBinder; +import android.os.IPowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +import static io.github.lsposed.lspd.service.ServiceManager.TAG; + +public class PowerService { + private static IPowerManager pm = null; + private static IBinder binder = null; + + public static IPowerManager getPowerManager() { + if (binder == null && pm == null) { + binder = ServiceManager.getService("power"); + if (binder == null) return null; + try { + binder.linkToDeath(new IBinder.DeathRecipient() { + @Override + public void binderDied() { + Log.w(TAG, "pm is dead"); + binder.unlinkToDeath(this, 0); + binder = null; + pm = null; + } + }, 0); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + pm = IPowerManager.Stub.asInterface(binder); + } + return pm; + } + + public static void reboot(boolean confirm, String reason, boolean wait) { + IPowerManager pm = getPowerManager(); + if (pm == null) return; + pm.reboot(confirm, reason, wait); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java b/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java index 72dbfb7d..6c4915b8 100644 --- a/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java +++ b/hiddenapi-stubs/src/main/java/android/app/IActivityManager.java @@ -32,6 +32,8 @@ public interface IActivityManager extends IInterface { String resultData, Bundle map, String[] requiredPermissions, int appOp, Bundle options, boolean serialized, boolean sticky, int userId); + void forceStopPackage(String packageName, int userId); + abstract class Stub extends Binder implements IActivityManager { public static IActivityManager asInterface(IBinder obj) { diff --git a/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java b/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java new file mode 100644 index 00000000..3baf2206 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java @@ -0,0 +1,12 @@ +package android.os; + +public interface IPowerManager extends IInterface { + void reboot(boolean confirm, String reason, boolean wait); + + abstract class Stub extends Binder implements IPowerManager { + + public static IPowerManager asInterface(IBinder obj) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/manager-service/src/main/aidl/io/github/lsposed/lspd/ILSPManagerService.aidl b/manager-service/src/main/aidl/io/github/lsposed/lspd/ILSPManagerService.aidl index 31261080..305abf44 100644 --- a/manager-service/src/main/aidl/io/github/lsposed/lspd/ILSPManagerService.aidl +++ b/manager-service/src/main/aidl/io/github/lsposed/lspd/ILSPManagerService.aidl @@ -44,4 +44,8 @@ interface ILSPManagerService { boolean clearLogs(boolean verbose) = 21; PackageInfo getPackageInfo(String packageName, int flags, int uid) = 22; + + void forceStopPackage(String packageName, int userId) = 23; + + void reboot(boolean confirm, String reason, boolean wait) = 24; }