From 8ebdcd55b4981d4a36a736e69b9d357559ab1a02 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 11 Nov 2021 17:34:28 +0800 Subject: [PATCH] [core] Move `setActivityController` to boot complete (#1387) For oddo Android 9, if activityController is set too earilier, it crashes system server. So move the set latter --- .../lspd/service/ActivityManagerService.java | 3 +- .../lsposed/lspd/service/LSPosedService.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java b/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java index 1f017196..22e1eec4 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java +++ b/core/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java @@ -63,7 +63,8 @@ public class ActivityManagerService { try { binder.linkToDeath(deathRecipient, 0); am = IActivityManager.Stub.asInterface(binder); - am.setActivityController(null, false); + // For oddo Android 9 we cannot set activity controller here... + // am.setActivityController(null, false); } catch (RemoteException e) { Log.e(TAG, Log.getStackTraceString(e)); } diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java index abc699c9..9624f716 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java @@ -301,6 +301,35 @@ public class LSPosedService extends ILSPosedService.Stub { Log.d(TAG, "registered secret code receiver"); } + private void registerBootCompleteReceiver() { + try { + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED); + + ActivityManagerService.registerReceiver("android", null, new IIntentReceiver.Stub() { + @Override + public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) { + new Thread(() -> { + try { + var am = ActivityManagerService.getActivityManager(); + if (am != null) am.setActivityController(null, false); + } catch (Throwable e) { + Log.e(TAG, "setActivityController", e); + } + }).start(); + try { + ActivityManagerService.finishReceiver(this, resultCode, data, extras, false, intent.getFlags()); + } catch (Throwable e) { + Log.e(TAG, "finish receiver", e); + } + } + }, intentFilter, null, 0, 0); + } catch (Throwable e) { + Log.e(TAG, "register boot receiver", e); + } + Log.d(TAG, "registered boot receiver"); + } + @Override public void dispatchSystemServerContext(IBinder activityThread, IBinder activityToken, String api) { Log.d(TAG, "received system context"); @@ -310,6 +339,7 @@ public class LSPosedService extends ILSPosedService.Stub { registerUnlockReceiver(); registerConfigurationReceiver(); registerSecretCodeReceiver(); + registerBootCompleteReceiver(); } @Override