diff --git a/core/src/main/java/io/github/lsposed/lspd/service/ActivityManagerService.java b/core/src/main/java/io/github/lsposed/lspd/service/ActivityManagerService.java index 6ea5ad72..b60a9599 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/ActivityManagerService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/ActivityManagerService.java @@ -27,6 +27,9 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; +import android.util.Log; + +import static io.github.lsposed.lspd.service.ServiceManager.TAG; public class ActivityManagerService { private static IActivityManager am = null; @@ -35,6 +38,20 @@ public class ActivityManagerService { public static IActivityManager getActivityManager() { if (binder == null && am == null) { binder = ServiceManager.getService("activity"); + if (binder == null) return null; + try { + binder.linkToDeath(new IBinder.DeathRecipient() { + @Override + public void binderDied() { + Log.w(TAG, "am is dead"); + binder.unlinkToDeath(this, 0); + binder = null; + am = null; + } + }, 0); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } am = IActivityManager.Stub.asInterface(binder); } return am; diff --git a/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java b/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java index 28e35adc..690ed903 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java @@ -97,6 +97,7 @@ public class BridgeService { } bridgeService.unlinkToDeath(this, 0); + listener.onSystemServerDied(); sendToBridge(serviceBinder, true); } } @@ -113,6 +114,8 @@ public class BridgeService { void onSystemServerRestarted(); void onResponseFromBridgeService(boolean response); + + void onSystemServerDied(); } private static Listener listener; diff --git a/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java b/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java index 2369cb6d..a3af8dfb 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java @@ -42,6 +42,10 @@ public class ServiceManager { } } + private static void putBinderForSystemServer() { + android.os.ServiceManager.addService("serial", (IBinder) mainService); + } + // call by ourselves public static void start() { Log.i(TAG, "starting server..."); @@ -56,7 +60,7 @@ public class ServiceManager { applicationService = new LSPApplicationService(); managerService = new LSPManagerService(); - android.os.ServiceManager.addService("serial", (IBinder) mainService); + putBinderForSystemServer(); waitSystemService("package"); waitSystemService("activity"); @@ -77,6 +81,12 @@ public class ServiceManager { Log.w(TAG, "no response from bridge"); } } + + @Override + public void onSystemServerDied() { + Log.w(TAG, "system server died"); + putBinderForSystemServer(); + } }); try { diff --git a/core/src/main/java/io/github/lsposed/lspd/service/UserService.java b/core/src/main/java/io/github/lsposed/lspd/service/UserService.java index 16b8b5b2..3cfb408f 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/UserService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/UserService.java @@ -25,9 +25,12 @@ import android.os.IBinder; import android.os.IUserManager; import android.os.RemoteException; import android.os.ServiceManager; +import android.util.Log; import java.util.List; +import static io.github.lsposed.lspd.service.ServiceManager.TAG; + public class UserService { private static IUserManager um = null; private static IBinder binder = null; @@ -35,6 +38,20 @@ public class UserService { public static IUserManager getUserManager() { if (binder == null && um == null) { binder = ServiceManager.getService("user"); + if (binder == null) return null; + try { + binder.linkToDeath(new IBinder.DeathRecipient() { + @Override + public void binderDied() { + Log.w(TAG, "um is dead"); + binder.unlinkToDeath(this, 0); + binder = null; + um = null; + } + }, 0); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } um = IUserManager.Stub.asInterface(binder); } return um;