diff --git a/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java b/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java index a7d90c08..01d9cdcc 100644 --- a/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java +++ b/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java @@ -761,6 +761,20 @@ public class LSPosedContext extends XposedContext { return BuildConfig.VERSION_CODE; } + @Override + public int getFrameworkPrivilege() { + try { + return service.getFrameworkPrivilege(); + } catch (RemoteException ignored) { + return -1; + } + } + + @Override + public Object featuredMethod(String name, Object... args) { + throw new UnsupportedOperationException(); + } + private MethodUnhooker doHook(U hookMethod, int priority, T callback) { if (Modifier.isAbstract(hookMethod.getModifiers())) { throw new IllegalArgumentException("Cannot hook abstract methods: " + hookMethod); diff --git a/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java b/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java index 2e824076..f027d733 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java @@ -13,6 +13,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import io.github.libxposed.service.IXposedService; + public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub { private final Module loadedModule; @@ -22,6 +24,11 @@ public class LSPInjectedModuleService extends ILSPInjectedModuleService.Stub { loadedModule = module; } + @Override + public int getFrameworkPrivilege() { + return IXposedService.FRAMEWORK_PRIVILEGE_ROOT; + } + @Override public Bundle requestRemotePreferences(String group, IRemotePreferenceCallback callback) { var bundle = new Bundle(); diff --git a/daemon/src/main/java/org/lsposed/lspd/service/LSPModuleService.java b/daemon/src/main/java/org/lsposed/lspd/service/LSPModuleService.java index 9712c29d..a4568357 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/LSPModuleService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/LSPModuleService.java @@ -137,6 +137,17 @@ public class LSPModuleService extends IXposedService.Stub { return BuildConfig.VERSION_CODE; } + @Override + public int getFrameworkPrivilege() throws RemoteException { + ensureModule(); + return IXposedService.FRAMEWORK_PRIVILEGE_ROOT; + } + + @Override + public Bundle featuredMethod(String name, Bundle args) { + throw new UnsupportedOperationException(); + } + @Override public List getScope() throws RemoteException { ensureModule(); diff --git a/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java b/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java index d9ca27f1..50ae1e67 100644 --- a/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java +++ b/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java @@ -49,6 +49,16 @@ public class XposedContextWrapper extends ContextWrapper implements XposedInterf return getBaseContext().getFrameworkVersionCode(); } + @Override + final public int getFrameworkPrivilege() { + return getBaseContext().getFrameworkPrivilege(); + } + + @Override + final public Object featuredMethod(String name, Object... args) { + return getBaseContext().featuredMethod(name, args); + } + @Override final public MethodUnhooker, Method> hookBefore(@NonNull Method origin, @NonNull BeforeHooker hooker) { return getBaseContext().hookBefore(origin, hooker); diff --git a/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java b/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java index 37d01dc1..cafa8f90 100644 --- a/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java +++ b/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java @@ -15,6 +15,11 @@ import io.github.libxposed.utils.DexParser; public interface XposedInterface { int API = 100; + int FRAMEWORK_PRIVILEGE_ROOT = 0; + int FRAMEWORK_PRIVILEGE_CONTAINER = 1; + int FRAMEWORK_PRIVILEGE_APP = 2; + int FRAMEWORK_PRIVILEGE_EMBEDDED = 3; + interface BeforeHookCallback { @NonNull T getOrigin(); @@ -104,6 +109,10 @@ public interface XposedInterface { long getFrameworkVersionCode(); + int getFrameworkPrivilege(); + + Object featuredMethod(String name, Object... args); + @Nullable MethodUnhooker, Method> hookBefore(@NonNull Method origin, @NonNull BeforeHooker hooker); diff --git a/libxposed/service/src/main/aidl/io/github/libxposed/service/IXposedService.aidl b/libxposed/service/src/main/aidl/io/github/libxposed/service/IXposedService.aidl index 02b25f11..67e8daed 100644 --- a/libxposed/service/src/main/aidl/io/github/libxposed/service/IXposedService.aidl +++ b/libxposed/service/src/main/aidl/io/github/libxposed/service/IXposedService.aidl @@ -3,6 +3,12 @@ import io.github.libxposed.service.IXposedScopeCallback; interface IXposedService { const int API = 100; + + const int FRAMEWORK_PRIVILEGE_ROOT = 0; + const int FRAMEWORK_PRIVILEGE_CONTAINER = 1; + const int FRAMEWORK_PRIVILEGE_APP = 2; + const int FRAMEWORK_PRIVILEGE_EMBEDDED = 3; + const String AUTHORITY_SUFFIX = ".XposedService"; const String SEND_BINDER = "SendBinder"; @@ -11,6 +17,8 @@ interface IXposedService { String getFrameworkName() = 2; String getFrameworkVersion() = 3; long getFrameworkVersionCode() = 4; + int getFrameworkPrivilege() = 5; + Bundle featuredMethod(String name, in Bundle args) = 6; // scope utilities List getScope() = 10; diff --git a/services/daemon-service/src/main/aidl/org/lsposed/lspd/service/ILSPInjectedModuleService.aidl b/services/daemon-service/src/main/aidl/org/lsposed/lspd/service/ILSPInjectedModuleService.aidl index 234f4756..5082f45a 100644 --- a/services/daemon-service/src/main/aidl/org/lsposed/lspd/service/ILSPInjectedModuleService.aidl +++ b/services/daemon-service/src/main/aidl/org/lsposed/lspd/service/ILSPInjectedModuleService.aidl @@ -3,6 +3,8 @@ package org.lsposed.lspd.service; import org.lsposed.lspd.service.IRemotePreferenceCallback; interface ILSPInjectedModuleService { + int getFrameworkPrivilege(); + Bundle requestRemotePreferences(String group, IRemotePreferenceCallback callback); ParcelFileDescriptor openRemoteFile(String path);