Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hooking base Java class in SystemUI #742

Open
Mikanoshi opened this issue Dec 19, 2020 · 52 comments
Open

Hooking base Java class in SystemUI #742

Mikanoshi opened this issue Dec 19, 2020 · 52 comments
Labels
bug Something isn't working confirmed This issue have been confirmed by developer help wanted Extra attention is needed

Comments

@Mikanoshi
Copy link

EdXposed 0.4.6.4
I need to hook java.lang.Math.min(int.class,int.class) method, but only inside SystemUI, so hook is in handleLoadPackage().
Hooking does not return any errors, but hook's code is not being executed.
Using hookAllMethods() results in all methods being hooked (returns a Set of 4 for int/long/float/double params).
Hook for a method with floats is working, but not for ints.

@kotori2
Copy link
Contributor

kotori2 commented Dec 19, 2020

Can confirm this on latest Canary.

12-19 21:55:22.074  2133  2133 D EdXposed: LoadedApk#getClassLoader starts: pkg=com.android.systemui, prc=com.android.systemui
12-19 21:55:22.074  2133  2133 D EdXposed: LoadedApk#getClassLoader ends: /system_ext/priv-app/SystemUIGoogle/SystemUIGoogle.apk -> dalvik.system.PathClassLoader[DexPathList[[zip file "/system_ext/priv-app/SystemUIGoogle/SystemUIGoogle.apk"],nativeLibraryDirectories=[/system_ext/priv-app/SystemUIGoogle/lib/arm64, /system_ext/priv-app/SystemUIGoogle/SystemUIGoogle.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64, /system/lib64, /system_ext/lib64]]]: pkg=com.android.systemui, prc=com.android.systemui
12-19 21:55:22.074  2133  2133 I EdXposed-Bridge: Injecting into SystemUI...
12-19 21:55:22.074  2133  2133 D EdXposed: hooking public static double java.lang.Math.min(double,double)
12-19 21:55:22.074  2133  2133 D EdXposed: start to generate class for: public static double java.lang.Math.min(double,double)

@kotori2 kotori2 closed this as completed Dec 19, 2020
@kotori2 kotori2 reopened this Dec 19, 2020
@kotori2
Copy link
Contributor

kotori2 commented Dec 19, 2020

Sorry wrong click

@kotori2 kotori2 added bug Something isn't working confirmed This issue have been confirmed by developer labels Dec 19, 2020
@kotori2
Copy link
Contributor

kotori2 commented Dec 19, 2020

It's so weird that I can only reproduce this with SystemUI. It works fine with any other package. Any idea on Java's magic?

@kotori2 kotori2 added the help wanted Extra attention is needed label Dec 19, 2020
@elesbb
Copy link

elesbb commented Dec 19, 2020

@kotori2
@Mikanoshi

Have either of you looked inside the smali of SystemUI to see where this is called? My guess is you are hooking one where the return value is different than the one being called. Can you post a snippet of the SystemUI method you are trying to change where this min method on the Math class is called from inside SystemUI?

@kotori2
Copy link
Contributor

kotori2 commented Dec 19, 2020 via email

@Mikanoshi
Copy link
Author

Mikanoshi commented Dec 19, 2020

You don't even need return value type when you hook a method with a known name.

@elesbb
Copy link

elesbb commented Dec 19, 2020

@kotori2
It didn't even hook anything? But didn't say it wasn't found? I always thought to hook main classes you had to pass a null class loader because those base classes are loaded at boot - not call time.

@Mikanoshi
The return value is determined by the parameters being passed to it. That is why I was wondering if you looked at the Smali part of the SystemUI so you can check what parameters are being passed.

@Mikanoshi
Copy link
Author

Parameters are ints, so values passed are ints :) To hook Math class you can just do this:

XposedBridge.hookAllMethods(Math.class, "min", new MethodHook() {
	@Override
	protected void before(MethodHookParam param) throws Throwable {
		XposedBridge.log("Math.min: " + param.args[0] + ", " + param.args[1]);
	}
});

I tried findClass("java.lang.Math", null) and findClass("java.lang.Math", lpparam.classLoader) - same result.
Also tried hooking after Application.attach().
EdXposed hooks without errors, but does not invoke the hooks.

@elesbb
Copy link

elesbb commented Dec 19, 2020

@Mikanoshi

Actually, the code snippet you provided theoretically would not be found, there is no method "min" that takes zero arguments.

You would need something like this:

XposedBridge.hookAllMethods(Math.class, "min", Integer.TYPE, Integer.TYPE, new MethodHook() {
	@Override
	protected void before(MethodHookParam param) throws Throwable {
		XposedBridge.log("Math.min: " + param.args[0] + ", " + param.args[1]);
	}
});

That would hook the min method that returns an int type back. However, SystemUI might be using the min(float, float) method or min(double, double) method, etc.

You would have to hook all of them:

XC_MethodHook myHook = new XC_MethodHook() {
    @Override
    proteted void beforeHookedMethod(MethodHookParam param) throws Throwable {
        XposedBridge.log("Hooked: " + param.args[0].getClass().getName() " min method");
    }
}

XposedBridge.hookAllMethods(Math.class, "min", Integer.TYPE, Integer.TYPE, myHook);
XposedBridge.hookAllMethods(Math.class, "min", Float.TYPE, Float.TYPE, myHook);
XposedBridge.hookAllMethods(Math.class, "min", Double.TYPE, Double.TYPE, myHook);
XposedBridge.hookAllMethods(Math.class, "min", Long.TYPE, Long.TYPE, myHook);

Then you can hook all the methods of "min" and see what is getting called.

@Mikanoshi
Copy link
Author

No, check the syntax of hookAllMethods() method.

@yujincheng08
Copy link
Contributor

yujincheng08 commented Dec 19, 2020

@elesbb
plz read the document carefully.

public static Set<XC_MethodHook.Unhook> hookAllMethods (Class<?> hookClass, String methodName, XC_MethodHook callback)

Hooks all methods with a certain name that were declared in the specified class. Inherited methods and constructors are not considered. For constructors, use hookAllConstructors(Class, XC_MethodHook) instead

@elesbb
Copy link

elesbb commented Dec 19, 2020

@Mikanoshi
@yujincheng08
I completely misread Mikanoshi's comment.. I totally know about hookAllMethods()

However, have you tried it the way I presented? Maybe there is a problem with hookAllMethods()?

Secondly, I think the problem here is that the hook is not loaded fast enough when limiting to "com.android.systemui" package context only. I always thought main java methods had to be hooked at start of zygote or they wouldn't be hooked?

For example, I have a hook that hooks ViewConfigureation.getLongPressTimeout(). If I call this hook on a package only basis, it does nothing. If I call this hook at startup, it works perfectly.

@yujincheng08
Copy link
Contributor

ur presented hookAllMethods code snippet wont compile. how come u know it?

@elesbb
Copy link

elesbb commented Dec 20, 2020

ur presented hookAllMethods code snippet wont compile. how come u know it?

Correct. I misread Mikanoshi's post, thought it simply said "hookMethod". I copied and pasted his code ignorant of what was actually typed out. :)

@Mikanoshi
Copy link
Author

Mikanoshi commented Dec 20, 2020

I tried XposedHelpers.findAndHookMethod() with param types, there is no difference. Hooks are correct, EdXposed is the problem.
I cannot move it to zygote because then it will be applied to every single process and it actually makes my system crash :) Even if it was working it would be too much code being executed (I'll also have to add calling package check inside the hook then).

@elesbb
Copy link

elesbb commented Dec 20, 2020

I tried XposedHelpers.findAndHookMethod() with param types, there is no difference. Hooks are correct, EdXposed is the problem.
I cannot move it to zygote because then it will be applied to every single process and it actually makes my system crash :) Even if it was working it would be too much code being executed (I'll also have to add calling package check inside the hook then).

Well, I didn't think hooking base level code was possible on a per-package bias. I never could get that to work. I always had to hook it first thing. And by hook it before zygote, I don't mean in the initZygote method, I am talking about simply not filtering out the packages in the handleLoadPackage method. Something like this:

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        XposedBridge.hookAllMethods(Math.class, "min", new MethodHook() {
	    @Override
	    protected void before(MethodHookParam param) throws Throwable {
		XposedBridge.log("Math.min: " + param.args[0] + ", " + param.args[1]);
	    }
        });
    }

Now it is hooked regardless of package loaded. I believe the actual package name is "android". That is the only way I have experience hooking such a method in the barebones of java/android.

I agree, you would have to do some sort of filtering in you before method to only hook what you want. That is why I was wondering if you could post a snippet of smali code you are trying to change from the SystemUI apk.

@Mikanoshi
Copy link
Author

Package name "android" is for system_server process where all the service classes are, it's a separate process that doesn't fork into anything, so it won't work for hooking SystemUI. When you don't check loadPackageParam.packageName you are hooking all the apps, don't see how it's different from if (loadPackageParam.packageName.equals("com.android.systemui")).

How can a smali snippet help? It just uses Math.min(int.class,int.class) like any app would.
And I don't read smali, I decompile it to java :)
com.android.systemui.statusbar.phone.NotificationIconContainer

public void calculateIconTranslations() {
    ...
    int childCount = getChildCount();
    int min = Math.min(childCount, 3);
    ...
}

I need to replace 3, it's inside a huge method and rewriting it would be a compatibility nightmare as my module must support Android 7-11 and multiple MIUI versions. I wanted to hook Math.min() inside SystemUI and then check stack trace for calculateIconTranslations.

@elesbb
Copy link

elesbb commented Dec 20, 2020

@Mikanoshi

If I try to hook this method, it completely halts booting. Gives an android runtime crash

12-19 22:06:21.785: E/AndroidRuntime(14523): Process: com.elesbb.s10xposed, PID: 14523
12-19 22:06:21.785: E/AndroidRuntime(14523): java.lang.ArrayIndexOutOfBoundsException: src.length=3334 srcPos=0 dst.length=2220 dstPos=0 length=3334
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at java.lang.System.arraycopy(Native Method)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at java.util.Arrays.copyOfRange(Arrays.java:3590)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at java.lang.StringBuffer.toString(StringBuffer.java:669)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at java.io.StringWriter.toString(StringWriter.java:210)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.util.Log.getStackTraceString(Log.java:486)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at de.robv.android.xposed.XposedBridge.log(XposedBridge.java:173)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at com.swift.sandhook.xposedcompat.hookstub.HookStubManager.hookBridge(HookStubManager.java:391)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at SandHookerNew_35f4vrpdo2vmlbkhbqk0r22p8o.hook(Unknown Source:46)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.LoadedApk.getResources(LoadedApk.java:1248)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.ContextImpl.createAppContext(ContextImpl.java:2618)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.ContextImpl.createAppContext(ContextImpl.java:2610)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7027)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at java.lang.reflect.Method.invoke(Native Method)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at com.swift.sandhook.SandHook.callOriginMethod(SandHook.java:185)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at com.swift.sandhook.xposedcompat.hookstub.HookStubManager.hookBridge(HookStubManager.java:376)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at SandHookerNew_5sm3dthec8858ee0to4kj3c1ge.hook(Unknown Source:51)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.ActivityThread.access$1600(ActivityThread.java:274)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2102)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.os.Handler.dispatchMessage(Handler.java:107)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.os.Looper.loop(Looper.java:237)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at android.app.ActivityThread.main(ActivityThread.java:8167)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at java.lang.reflect.Method.invoke(Native Method)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
12-19 22:06:21.785: E/AndroidRuntime(14523): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
12-19 22:06:21.786: E/AndroidRuntime(14523): Error reporting crash
12-19 22:06:21.786: E/AndroidRuntime(14523): java.lang.ArrayIndexOutOfBoundsException: src.length=1762 srcPos=0 dst.length=1674 dstPos=0 length=1762
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.lang.System.arraycopy(Native Method)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.util.Arrays.copyOfRange(Arrays.java:3590)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.lang.StringBuffer.toString(StringBuffer.java:669)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.io.StringWriter.toString(StringWriter.java:210)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at android.app.ApplicationErrorReport$CrashInfo.<init>(ApplicationErrorReport.java:404)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at android.app.ApplicationErrorReport$ParcelableCrashInfo.<init>(ApplicationErrorReport.java:532)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at com.android.internal.os.RuntimeInit$KillApplicationHandler.uncaughtException(RuntimeInit.java:150)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1073)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
12-19 22:06:21.786: E/AndroidRuntime(14523): 	at java.lang.Thread.dispatchUncaughtException(Thread.java:2187)

I have no idea why? I don't change anything. All I do is write a log? I am trying to change it in my own app. Like when I make that call

@Mikanoshi
Copy link
Author

Yep, that's what happens. Either in initZygote or in handleLoadPackage without filters.
Some packages don't like it, apps like Camera and Google Play Services start to crash for me.
It's ExceptionInInitializerError, if I wrap hook in another hook of Application.attach() then it's this ArrayIndexOutOfBoundsException.
Just don't do it :)

@elesbb
Copy link

elesbb commented Dec 20, 2020

Yep, that's what happens. Either in initZygote or in handleLoadPackage without filters.
Some packages don't like it, apps like Camera and Google Play Services start to crash for me.
It's ExceptionInInitializerError, if I wrap hook in another hook of Application.attach() then it's this ArrayIndexOutOfBoundsException.
Just don't do it :)

Even if I filtered to just my application it crashes and prevents my application from loading. Even if the hooked method has nothing in it it crashes xD

This is surely bizarre.

I thought you were having troubles with it not hooking. Like, no errors or anything, it just didn't hook.

However,

in your app, can't you just replace getChildCount() with your own value? I'm missing a lot of context so i'm just wingin it here xD

I wonder if that is a viewgroup you are hooking.

Also, how you decompile to java?

@Mikanoshi
Copy link
Author

Mikanoshi commented Dec 20, 2020

Filtering to com.android.systemui has no errors or crashes.
getChildCount() is used further in the code to iterate through children. I cannot do anything post factum, this method changes children positions based on tons of conditions.
Decompile with jadx.

@kotori2
Copy link
Contributor

kotori2 commented Dec 20, 2020

It didn't even hook anything? But didn't say it wasn't found?

It hooked 1 out of 4 method with same name.

If I try to hook this method, it completely halts booting. Gives an android runtime crash

Sound like crashing when figuring out stack trace.

@kotori2
Copy link
Contributor

kotori2 commented Dec 20, 2020

Well I smh can't reproduce it anymore.
From the log it obviously hooked all 4 functions.

12-20 14:27:47.008  1275  1335 I ActivityManager: Start proc 2465:com.android.systemui/u0a211 for added application com.android.systemui
...
12-20 14:27:47.567  2465  2465 D EdXposed: hooking public static double java.lang.Math.min(double,double)
12-20 14:27:47.567  2465  2465 D EdXposed: start to generate class for: public static double java.lang.Math.min(double,double)
12-20 14:27:47.581  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e6f4408
12-20 14:27:47.581  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.581  2465  2465 D EdXposed: target=public static double java.lang.Math.min(double,double), hook=public static double EdHooker_java.lang.Math.hook(double,double), backup=public static double EdHooker_java.lang.Math.backup(double,double)
12-20 14:27:47.581  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bb98
12-20 14:27:47.581  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e6f4430
12-20 14:27:47.581  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e6f43e0
12-20 14:27:47.581  2465  2465 I EdXposed: target method is at 0x7088bb98, hook method is at 0x7c8e6f4430, backup method is at 0x7c8e6f43e0
12-20 14:27:47.581  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x93080009 to 0x93080009
12-20 14:27:47.581  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.581  2465  2465 I EdXposed: replace entry point from 0x7ca9cbcfa0 to 0x7f3acf1008
12-20 14:27:47.581  2465  2465 I EdXposed: replace entry point from 0x70b770b0 to 0x7f3acaa008
12-20 14:27:47.581  2465  2465 I EdXposed: hook and backup done
12-20 14:27:47.581  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bb98
12-20 14:27:47.581  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e6f43e0
12-20 14:27:47.581  2465  2465 D EdXposed: hooking public static float java.lang.Math.min(float,float)
12-20 14:27:47.581  2465  2465 D EdXposed: start to generate class for: public static float java.lang.Math.min(float,float)
12-20 14:27:47.594  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e63a408
12-20 14:27:47.594  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.594  2465  2465 D EdXposed: target=public static float java.lang.Math.min(float,float), hook=public static float EdHooker_java.lang.Math.hook(float,float), backup=public static float EdHooker_java.lang.Math.backup(float,float)
12-20 14:27:47.594  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bbc0
12-20 14:27:47.594  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e63a430
12-20 14:27:47.594  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e63a3e0
12-20 14:27:47.594  2465  2465 I EdXposed: target method is at 0x7088bbc0, hook method is at 0x7c8e63a430, backup method is at 0x7c8e63a3e0
12-20 14:27:47.594  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x93880009 to 0x93880009
12-20 14:27:47.594  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.594  2465  2465 I EdXposed: replace entry point from 0x7ca9cbcfa0 to 0x7f3aafc008
12-20 14:27:47.594  2465  2465 I EdXposed: replace entry point from 0x70b770d0 to 0x7f3aa7d008
12-20 14:27:47.594  2465  2465 I EdXposed: hook and backup done
12-20 14:27:47.594  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bbc0
12-20 14:27:47.594  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e63a3e0
12-20 14:27:47.595  2465  2465 D EdXposed: hooking public static int java.lang.Math.min(int,int)
12-20 14:27:47.595  2465  2465 D EdXposed: start to generate class for: public static int java.lang.Math.min(int,int)
12-20 14:27:47.606  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e53d408
12-20 14:27:47.606  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.606  2465  2465 D EdXposed: target=public static int java.lang.Math.min(int,int), hook=public static int EdHooker_java.lang.Math.hook(int,int), backup=public static int EdHooker_java.lang.Math.backup(int,int)
12-20 14:27:47.606  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bbe8
12-20 14:27:47.606  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e53d430
12-20 14:27:47.606  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e53d3e0
12-20 14:27:47.606  2465  2465 I EdXposed: target method is at 0x7088bbe8, hook method is at 0x7c8e53d430, backup method is at 0x7c8e53d3e0
12-20 14:27:47.606  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x94880009 to 0x96880009
12-20 14:27:47.606  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.607  2465  2465 I EdXposed: replace entry point from 0x7ca9cbcfa0 to 0x7f3a8c0008
12-20 14:27:47.607  2465  2465 I EdXposed: replace entry point from 0x70b770f0 to 0x7f3a8bf008
12-20 14:27:47.607  2465  2465 I EdXposed: hook and backup done
12-20 14:27:47.607  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bbe8
12-20 14:27:47.607  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e53d3e0
12-20 14:27:47.607  2465  2465 D EdXposed: hooking public static long java.lang.Math.min(long,long)
12-20 14:27:47.607  2465  2465 D EdXposed: start to generate class for: public static long java.lang.Math.min(long,long)
12-20 14:27:47.617  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e516408
12-20 14:27:47.617  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.617  2465  2465 D EdXposed: target=public static long java.lang.Math.min(long,long), hook=public static long EdHooker_java.lang.Math.hook(long,long), backup=public static long EdHooker_java.lang.Math.backup(long,long)
12-20 14:27:47.617  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bc10
12-20 14:27:47.617  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e516430
12-20 14:27:47.617  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e5163e0
12-20 14:27:47.617  2465  2465 I EdXposed: target method is at 0x7088bc10, hook method is at 0x7c8e516430, backup method is at 0x7c8e5163e0
12-20 14:27:47.617  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x94080009 to 0x96080009
12-20 14:27:47.617  2465  2465 I EdXposed: setNonCompilable: change access flags from 0x10080009 to 0x12080009
12-20 14:27:47.617  2465  2465 I EdXposed: replace entry point from 0x7ca9cbcfa0 to 0x7f3a5a7008
12-20 14:27:47.617  2465  2465 I EdXposed: replace entry point from 0x70b77120 to 0x7f3a5a6008
12-20 14:27:47.617  2465  2465 I EdXposed: hook and backup done
12-20 14:27:47.617  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7088bc10
12-20 14:27:47.617  2465  2465 I EdXposed: HookMain: getArtMethod: 0x7c8e5163e0

My code

public class HookMain implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        if (lpparam.packageName.equals("com.android.systemui")) {
            XposedBridge.log("Injecting into SystemUI...");
            
            Class<?> at = Class.forName("java.lang.Math", false, lpparam.classLoader);
            for (Member method : at.getDeclaredMethods()) XposedBridge.log(method.getName());

            XposedBridge.hookAllMethods(at, "min", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) {
                    XposedBridge.log("java.lang.Math.min: beforeHookedMethod");
                    if (param.args[0].getClass() == Integer.class){
                        XposedBridge.log("Type is int");
                    } else if (param.args[0].getClass() == Float.class) {
                        XposedBridge.log("Type is float");
                    } else {
                        XposedBridge.log("Type is unknown");
                    }
                }
            });
        }
    }
}

@Mikanoshi
Copy link
Author

Mikanoshi commented Dec 20, 2020

Still only float forks for me.
How to enable these debug logs?

@kotori2
Copy link
Contributor

kotori2 commented Dec 20, 2020

@Mikanoshi

Still only float forks for me.

Try canary build? We are pushing them to Alpha very soon.

How to enable these debug logs?

They mostly broken on v0.4.x and they were fixed in v0.5.x

@Mikanoshi
Copy link
Author

Currently only interested in 0.4, module is not working with 0.5 anyway.

@MlgmXyysd
Copy link
Member

0.4.x is no longer maintained

@elesbb
Copy link

elesbb commented Dec 20, 2020

@kotori2

How does this work:
Class<?> at = Class.forName("java.lang.Math", false, lpparam.classLoader);

It uses the class loader that belongs to com.android.systemui, and the java.lang.Math class belongs to package java.lang

How is it still able to find that class from a different package class loader?

@kotori2
Copy link
Contributor

kotori2 commented Dec 20, 2020

It uses the class loader that belongs to com.android.systemui, and the java.lang.Math class belongs to package java.lang

class loader that belongs to com.android.systemui loaded package java.lang.
Of course you shouldn't hook the module's class loader, or it just meaningless

@Mikanoshi
Copy link
Author

The resulting Class<?> has the same classloader as Math.class.getClassLoader().
@kotori2 Was it the trick with disabled class initialization that did it? or it just magically started working on 0.5?

@kotori2
Copy link
Contributor

kotori2 commented Dec 20, 2020

@Mikanoshi TBH I have no idea, I just grabbed those code on internet and it works

@Mikanoshi
Copy link
Author

Mikanoshi commented Dec 20, 2020

Class<?> at = Class.forName("java.lang.Math", false, lpparam.classLoader);
for (Member method : at.getDeclaredMethods()) XposedBridge.log(method.getName());

This code only lists 2 "min" methods for me, getMethods() instead of getDeclaredMethods() too.
Looks like a logging problem, it still finds 4.

@yujincheng08
Copy link
Contributor

Good, problem solved.

@Mikanoshi
Copy link
Author

@yujincheng08 LOL, what? Nothing is solved. When XposedBridge.log() is called with the same text twice it prints only 1 line in the log, that's another issue, not a solution. Hook is still not working.

@kotori2
Copy link
Contributor

kotori2 commented Dec 20, 2020

When XposedBridge.log() is called with the same text twice it prints only 1 line in the log, that's another issue

Android will hide them and you will see a chatty thing in log

@Mikanoshi
Copy link
Author

Yeah, so they don't go into Xposed log, that's why I was seeing only 2 out of 4 methods.

@Mikanoshi
Copy link
Author

Please reopen this, it's not working on 0.5.1.3 (4653)

@kotori2
Copy link
Contributor

kotori2 commented Dec 27, 2020

Please reopen this, it's not working on 0.5.1.3 (4653)

Try debug build and attach logs pls.
Most probably because they got inline optimized.

@Mikanoshi
Copy link
Author

I can see 3 Math.min() in log except the one (float,float) that is actually working.
log.txt

@kotori2 kotori2 reopened this Dec 27, 2020
@tiann
Copy link

tiann commented Dec 28, 2020

@XspeedPL
Copy link
Contributor

Hooking native methods from Java code is never a fun practice.
By unoptimizing it you might cause more issues than you'd expect.

I'd suggest either hooking one level higher, or if it's a huge method bytecode injection might be a better bet.

@kotori2
Copy link
Contributor

kotori2 commented Jan 1, 2021

By unoptimizing it you might cause more issues than you'd expect.

deoptimize is actually meant to kill inline-compiled methods. That always happens in EdXposed Manager so lots of ppl got yellow warning.

@kotori2
Copy link
Contributor

kotori2 commented Jan 1, 2021

http://aospxref.com/android-10.0.0_r47/xref/art/runtime/interpreter/interpreter_intrinsics.cc#470
http://aospxref.com/android-10.0.0_r47/xref/art/runtime/interpreter/interpreter_intrinsics.cc#472

@tiann Thanks but I kinda not understand how this work here.
From the references it seems this branch will only be used when the callee function is being interpretered and the target methods are implemented (aka INTRINSIC_CASE)
So the missing functions should be MathMinLongLong and MathMinIntInt because they are not being interpretered.
Also MathMinFloatFloat is actually implemented here.
Also I tried to search keywords in Epic but no luck.
Is there any tech blog/article that I could read about this issue?

@tiann
Copy link

tiann commented Jan 2, 2021

@kotori2 Both interpreter and compiler implement the intrinsics, the compiler is more powerful but interpreter only support some limited method. In theory, if the min(float, float) run in AOT mode, it can not be hooked too. You can try to disable the intrinsics.

There is little article/slides about ART intrinsics optimization, you can only read the FUCKING source code :(

If interested, this book is the only one telling some optimization details about ART: https://item.jd.com/12510921.html

@kotori2
Copy link
Contributor

kotori2 commented Jan 2, 2021

@tiann I still think the unimplemented compile time intrinsics should not be blamed.
From the conversation above, the point is even with reflection, we can't find the target methods. So runtime intrinsics are missing.
I check the code and the runtime intrinsics are initialized as soon as art::Runtime starts.
Also they might successfully hook 1 or 3 methods which doesn't exactly match with the amount of compile time intrinsics.
So my guess is, ART inline compiled all Math.min(float, float) and tells ART not to initialize those methods for speed. But I didn't found any supporting code anyway.

@Mikanoshi Could you please try deoptimize SystemUI and see if they start working? Because I can't really reproduce this bug now.

@Mikanoshi
Copy link
Author

It executes min(float,float) 3 times and then crashes, so no idea if (int,int) is working. How to fix it with adb shell now? :D

@XspeedPL
Copy link
Contributor

XspeedPL commented Jan 2, 2021

Fix with adb shell? You mean disable the module? :P

@Mikanoshi
Copy link
Author

I mean deoptimization

@kotori2
Copy link
Contributor

kotori2 commented Jan 2, 2021

I mean deoptimization

cmd package compile --reset com.your.package

@Mikanoshi
Copy link
Author

cmd package compile --reset com.your.package

No, my module makes SystemUI crash when it's deoptimized. This fixes it:
cmd package compile -m speed com.android.systemui

@Mikanoshi
Copy link
Author

It crashes on this line in SystemUI, so something is happening with Math.min(int,int), but it's not good :)

return list.subList(0, Math.min(list.size(), i));

@Mikanoshi
Copy link
Author

Debug log
log_crash.txt

SekiBetu added a commit to SekiBetu/SekiBetu that referenced this issue Apr 2, 2021
…—mlgmxyysd(ElderDrivers/EdXposed/issues/837)

ElderDrivers/EdXposed#1
ElderDrivers/EdXposed#2
ElderDrivers/EdXposed#3
ElderDrivers/EdXposed#4
ElderDrivers/EdXposed#5
ElderDrivers/EdXposed#6
ElderDrivers/EdXposed#7
ElderDrivers/EdXposed#8
ElderDrivers/EdXposed#9
ElderDrivers/EdXposed#10
ElderDrivers/EdXposed#11
ElderDrivers/EdXposed#12
ElderDrivers/EdXposed#13
ElderDrivers/EdXposed#14
ElderDrivers/EdXposed#15
ElderDrivers/EdXposed#16
ElderDrivers/EdXposed#17
ElderDrivers/EdXposed#18
ElderDrivers/EdXposed#19
ElderDrivers/EdXposed#20
ElderDrivers/EdXposed#21
ElderDrivers/EdXposed#22
ElderDrivers/EdXposed#23
ElderDrivers/EdXposed#24
ElderDrivers/EdXposed#25
ElderDrivers/EdXposed#26
ElderDrivers/EdXposed#27
ElderDrivers/EdXposed#28
ElderDrivers/EdXposed#29
ElderDrivers/EdXposed#30
ElderDrivers/EdXposed#31
ElderDrivers/EdXposed#32
ElderDrivers/EdXposed#33
ElderDrivers/EdXposed#34
ElderDrivers/EdXposed#35
ElderDrivers/EdXposed#36
ElderDrivers/EdXposed#37
ElderDrivers/EdXposed#38
ElderDrivers/EdXposed#39
ElderDrivers/EdXposed#40
ElderDrivers/EdXposed#41
ElderDrivers/EdXposed#42
ElderDrivers/EdXposed#43
ElderDrivers/EdXposed#44
ElderDrivers/EdXposed#45
ElderDrivers/EdXposed#46
ElderDrivers/EdXposed#47
ElderDrivers/EdXposed#48
ElderDrivers/EdXposed#49
ElderDrivers/EdXposed#50
ElderDrivers/EdXposed#51
ElderDrivers/EdXposed#52
ElderDrivers/EdXposed#53
ElderDrivers/EdXposed#54
ElderDrivers/EdXposed#55
ElderDrivers/EdXposed#56
ElderDrivers/EdXposed#57
ElderDrivers/EdXposed#58
ElderDrivers/EdXposed#59
ElderDrivers/EdXposed#60
ElderDrivers/EdXposed#61
ElderDrivers/EdXposed#62
ElderDrivers/EdXposed#63
ElderDrivers/EdXposed#64
ElderDrivers/EdXposed#65
ElderDrivers/EdXposed#66
ElderDrivers/EdXposed#67
ElderDrivers/EdXposed#68
ElderDrivers/EdXposed#69
ElderDrivers/EdXposed#70
ElderDrivers/EdXposed#71
ElderDrivers/EdXposed#72
ElderDrivers/EdXposed#73
ElderDrivers/EdXposed#74
ElderDrivers/EdXposed#75
ElderDrivers/EdXposed#76
ElderDrivers/EdXposed#77
ElderDrivers/EdXposed#78
ElderDrivers/EdXposed#79
ElderDrivers/EdXposed#80
ElderDrivers/EdXposed#81
ElderDrivers/EdXposed#82
ElderDrivers/EdXposed#83
ElderDrivers/EdXposed#84
ElderDrivers/EdXposed#85
ElderDrivers/EdXposed#86
ElderDrivers/EdXposed#87
ElderDrivers/EdXposed#88
ElderDrivers/EdXposed#89
ElderDrivers/EdXposed#90
ElderDrivers/EdXposed#91
ElderDrivers/EdXposed#92
ElderDrivers/EdXposed#93
ElderDrivers/EdXposed#94
ElderDrivers/EdXposed#95
ElderDrivers/EdXposed#96
ElderDrivers/EdXposed#97
ElderDrivers/EdXposed#98
ElderDrivers/EdXposed#99
ElderDrivers/EdXposed#100
ElderDrivers/EdXposed#101
ElderDrivers/EdXposed#102
ElderDrivers/EdXposed#103
ElderDrivers/EdXposed#104
ElderDrivers/EdXposed#105
ElderDrivers/EdXposed#106
ElderDrivers/EdXposed#107
ElderDrivers/EdXposed#108
ElderDrivers/EdXposed#109
ElderDrivers/EdXposed#110
ElderDrivers/EdXposed#111
ElderDrivers/EdXposed#112
ElderDrivers/EdXposed#113
ElderDrivers/EdXposed#114
ElderDrivers/EdXposed#115
ElderDrivers/EdXposed#116
ElderDrivers/EdXposed#117
ElderDrivers/EdXposed#118
ElderDrivers/EdXposed#119
ElderDrivers/EdXposed#120
ElderDrivers/EdXposed#121
ElderDrivers/EdXposed#122
ElderDrivers/EdXposed#123
ElderDrivers/EdXposed#124
ElderDrivers/EdXposed#125
ElderDrivers/EdXposed#126
ElderDrivers/EdXposed#127
ElderDrivers/EdXposed#128
ElderDrivers/EdXposed#129
ElderDrivers/EdXposed#130
ElderDrivers/EdXposed#131
ElderDrivers/EdXposed#132
ElderDrivers/EdXposed#133
ElderDrivers/EdXposed#134
ElderDrivers/EdXposed#135
ElderDrivers/EdXposed#136
ElderDrivers/EdXposed#137
ElderDrivers/EdXposed#138
ElderDrivers/EdXposed#139
ElderDrivers/EdXposed#140
ElderDrivers/EdXposed#141
ElderDrivers/EdXposed#142
ElderDrivers/EdXposed#143
ElderDrivers/EdXposed#144
ElderDrivers/EdXposed#145
ElderDrivers/EdXposed#146
ElderDrivers/EdXposed#147
ElderDrivers/EdXposed#148
ElderDrivers/EdXposed#149
ElderDrivers/EdXposed#150
ElderDrivers/EdXposed#151
ElderDrivers/EdXposed#152
ElderDrivers/EdXposed#153
ElderDrivers/EdXposed#154
ElderDrivers/EdXposed#155
ElderDrivers/EdXposed#156
ElderDrivers/EdXposed#157
ElderDrivers/EdXposed#158
ElderDrivers/EdXposed#159
ElderDrivers/EdXposed#160
ElderDrivers/EdXposed#161
ElderDrivers/EdXposed#162
ElderDrivers/EdXposed#163
https://github.com/ElderDrivers/EdXposed/issues/164
https://github.com/ElderDrivers/EdXposed/issues/165
ElderDrivers/EdXposed#166
ElderDrivers/EdXposed#167
ElderDrivers/EdXposed#168
https://github.com/ElderDrivers/EdXposed/issues/169
ElderDrivers/EdXposed#170
ElderDrivers/EdXposed#171
ElderDrivers/EdXposed#172
ElderDrivers/EdXposed#173
ElderDrivers/EdXposed#174
ElderDrivers/EdXposed#175
ElderDrivers/EdXposed#176
ElderDrivers/EdXposed#177
ElderDrivers/EdXposed#178
ElderDrivers/EdXposed#179
ElderDrivers/EdXposed#180
ElderDrivers/EdXposed#181
ElderDrivers/EdXposed#182
ElderDrivers/EdXposed#183
ElderDrivers/EdXposed#184
ElderDrivers/EdXposed#185
ElderDrivers/EdXposed#186
ElderDrivers/EdXposed#187
ElderDrivers/EdXposed#188
ElderDrivers/EdXposed#189
ElderDrivers/EdXposed#190
ElderDrivers/EdXposed#191
ElderDrivers/EdXposed#192
ElderDrivers/EdXposed#193
ElderDrivers/EdXposed#194
ElderDrivers/EdXposed#195
ElderDrivers/EdXposed#196
ElderDrivers/EdXposed#197
ElderDrivers/EdXposed#198
ElderDrivers/EdXposed#199
ElderDrivers/EdXposed#200
ElderDrivers/EdXposed#201
ElderDrivers/EdXposed#202
ElderDrivers/EdXposed#203
ElderDrivers/EdXposed#204
ElderDrivers/EdXposed#205
ElderDrivers/EdXposed#206
ElderDrivers/EdXposed#207
ElderDrivers/EdXposed#208
ElderDrivers/EdXposed#209
ElderDrivers/EdXposed#210
ElderDrivers/EdXposed#211
ElderDrivers/EdXposed#212
ElderDrivers/EdXposed#213
ElderDrivers/EdXposed#214
ElderDrivers/EdXposed#215
ElderDrivers/EdXposed#216
ElderDrivers/EdXposed#217
ElderDrivers/EdXposed#218
ElderDrivers/EdXposed#219
ElderDrivers/EdXposed#220
ElderDrivers/EdXposed#221
ElderDrivers/EdXposed#222
ElderDrivers/EdXposed#223
ElderDrivers/EdXposed#224
ElderDrivers/EdXposed#225
ElderDrivers/EdXposed#226
ElderDrivers/EdXposed#227
ElderDrivers/EdXposed#228
ElderDrivers/EdXposed#229
ElderDrivers/EdXposed#230
ElderDrivers/EdXposed#231
ElderDrivers/EdXposed#232
ElderDrivers/EdXposed#233
ElderDrivers/EdXposed#234
ElderDrivers/EdXposed#235
ElderDrivers/EdXposed#236
ElderDrivers/EdXposed#237
ElderDrivers/EdXposed#238
ElderDrivers/EdXposed#239
ElderDrivers/EdXposed#240
ElderDrivers/EdXposed#241
ElderDrivers/EdXposed#242
ElderDrivers/EdXposed#243
ElderDrivers/EdXposed#244
ElderDrivers/EdXposed#245
ElderDrivers/EdXposed#246
ElderDrivers/EdXposed#247
ElderDrivers/EdXposed#248
ElderDrivers/EdXposed#249
ElderDrivers/EdXposed#250
ElderDrivers/EdXposed#251
ElderDrivers/EdXposed#252
ElderDrivers/EdXposed#253
ElderDrivers/EdXposed#254
ElderDrivers/EdXposed#255
ElderDrivers/EdXposed#256
ElderDrivers/EdXposed#257
ElderDrivers/EdXposed#258
ElderDrivers/EdXposed#259
ElderDrivers/EdXposed#260
ElderDrivers/EdXposed#261
ElderDrivers/EdXposed#262
ElderDrivers/EdXposed#263
ElderDrivers/EdXposed#264
ElderDrivers/EdXposed#265
ElderDrivers/EdXposed#266
ElderDrivers/EdXposed#267
ElderDrivers/EdXposed#268
ElderDrivers/EdXposed#269
ElderDrivers/EdXposed#270
ElderDrivers/EdXposed#271
ElderDrivers/EdXposed#272
ElderDrivers/EdXposed#273
ElderDrivers/EdXposed#274
ElderDrivers/EdXposed#275
ElderDrivers/EdXposed#276
ElderDrivers/EdXposed#277
ElderDrivers/EdXposed#278
ElderDrivers/EdXposed#279
ElderDrivers/EdXposed#280
ElderDrivers/EdXposed#281
ElderDrivers/EdXposed#282
ElderDrivers/EdXposed#283
ElderDrivers/EdXposed#284
ElderDrivers/EdXposed#285
ElderDrivers/EdXposed#286
ElderDrivers/EdXposed#287
ElderDrivers/EdXposed#288
ElderDrivers/EdXposed#289
ElderDrivers/EdXposed#290
ElderDrivers/EdXposed#291
ElderDrivers/EdXposed#292
ElderDrivers/EdXposed#293
ElderDrivers/EdXposed#294
ElderDrivers/EdXposed#295
ElderDrivers/EdXposed#296
ElderDrivers/EdXposed#297
ElderDrivers/EdXposed#298
ElderDrivers/EdXposed#299
ElderDrivers/EdXposed#300
ElderDrivers/EdXposed#301
ElderDrivers/EdXposed#302
ElderDrivers/EdXposed#303
ElderDrivers/EdXposed#304
ElderDrivers/EdXposed#305
https://github.com/ElderDrivers/EdXposed/issues/306
ElderDrivers/EdXposed#307
ElderDrivers/EdXposed#308
ElderDrivers/EdXposed#309
ElderDrivers/EdXposed#310
ElderDrivers/EdXposed#311
ElderDrivers/EdXposed#312
ElderDrivers/EdXposed#313
ElderDrivers/EdXposed#314
ElderDrivers/EdXposed#315
ElderDrivers/EdXposed#316
ElderDrivers/EdXposed#317
ElderDrivers/EdXposed#318
ElderDrivers/EdXposed#319
ElderDrivers/EdXposed#320
ElderDrivers/EdXposed#321
ElderDrivers/EdXposed#322
ElderDrivers/EdXposed#323
ElderDrivers/EdXposed#324
ElderDrivers/EdXposed#325
ElderDrivers/EdXposed#326
ElderDrivers/EdXposed#327
ElderDrivers/EdXposed#328
ElderDrivers/EdXposed#329
ElderDrivers/EdXposed#330
ElderDrivers/EdXposed#331
ElderDrivers/EdXposed#332
ElderDrivers/EdXposed#333
ElderDrivers/EdXposed#334
ElderDrivers/EdXposed#335
ElderDrivers/EdXposed#336
ElderDrivers/EdXposed#337
ElderDrivers/EdXposed#338
ElderDrivers/EdXposed#339
ElderDrivers/EdXposed#340
ElderDrivers/EdXposed#341
ElderDrivers/EdXposed#342
ElderDrivers/EdXposed#343
ElderDrivers/EdXposed#344
ElderDrivers/EdXposed#345
ElderDrivers/EdXposed#346
ElderDrivers/EdXposed#347
ElderDrivers/EdXposed#348
ElderDrivers/EdXposed#349
ElderDrivers/EdXposed#350
ElderDrivers/EdXposed#351
ElderDrivers/EdXposed#352
ElderDrivers/EdXposed#353
ElderDrivers/EdXposed#354
ElderDrivers/EdXposed#355
ElderDrivers/EdXposed#356
ElderDrivers/EdXposed#357
ElderDrivers/EdXposed#358
ElderDrivers/EdXposed#359
ElderDrivers/EdXposed#360
ElderDrivers/EdXposed#361
ElderDrivers/EdXposed#362
ElderDrivers/EdXposed#363
ElderDrivers/EdXposed#364
ElderDrivers/EdXposed#365
ElderDrivers/EdXposed#366
ElderDrivers/EdXposed#367
ElderDrivers/EdXposed#368
ElderDrivers/EdXposed#369
ElderDrivers/EdXposed#370
ElderDrivers/EdXposed#371
ElderDrivers/EdXposed#372
ElderDrivers/EdXposed#373
ElderDrivers/EdXposed#374
ElderDrivers/EdXposed#375
ElderDrivers/EdXposed#376
ElderDrivers/EdXposed#377
ElderDrivers/EdXposed#378
ElderDrivers/EdXposed#379
ElderDrivers/EdXposed#380
ElderDrivers/EdXposed#381
ElderDrivers/EdXposed#382
ElderDrivers/EdXposed#383
ElderDrivers/EdXposed#384
ElderDrivers/EdXposed#385
ElderDrivers/EdXposed#386
ElderDrivers/EdXposed#387
ElderDrivers/EdXposed#388
ElderDrivers/EdXposed#389
ElderDrivers/EdXposed#390
ElderDrivers/EdXposed#391
ElderDrivers/EdXposed#392
ElderDrivers/EdXposed#393
ElderDrivers/EdXposed#394
ElderDrivers/EdXposed#395
ElderDrivers/EdXposed#396
ElderDrivers/EdXposed#397
ElderDrivers/EdXposed#398
ElderDrivers/EdXposed#399
ElderDrivers/EdXposed#400
ElderDrivers/EdXposed#401
ElderDrivers/EdXposed#402
ElderDrivers/EdXposed#403
ElderDrivers/EdXposed#404
ElderDrivers/EdXposed#405
ElderDrivers/EdXposed#406
ElderDrivers/EdXposed#407
ElderDrivers/EdXposed#408
ElderDrivers/EdXposed#409
ElderDrivers/EdXposed#410
ElderDrivers/EdXposed#411
ElderDrivers/EdXposed#412
ElderDrivers/EdXposed#413
ElderDrivers/EdXposed#414
ElderDrivers/EdXposed#415
ElderDrivers/EdXposed#416
ElderDrivers/EdXposed#417
ElderDrivers/EdXposed#418
ElderDrivers/EdXposed#419
ElderDrivers/EdXposed#420
ElderDrivers/EdXposed#421
ElderDrivers/EdXposed#422
ElderDrivers/EdXposed#423
ElderDrivers/EdXposed#424
ElderDrivers/EdXposed#425
ElderDrivers/EdXposed#426
ElderDrivers/EdXposed#427
ElderDrivers/EdXposed#428
ElderDrivers/EdXposed#429
ElderDrivers/EdXposed#430
ElderDrivers/EdXposed#431
ElderDrivers/EdXposed#432
ElderDrivers/EdXposed#433
ElderDrivers/EdXposed#434
ElderDrivers/EdXposed#435
ElderDrivers/EdXposed#436
ElderDrivers/EdXposed#437
ElderDrivers/EdXposed#438
ElderDrivers/EdXposed#439
ElderDrivers/EdXposed#440
ElderDrivers/EdXposed#441
ElderDrivers/EdXposed#442
ElderDrivers/EdXposed#443
ElderDrivers/EdXposed#444
ElderDrivers/EdXposed#445
ElderDrivers/EdXposed#446
ElderDrivers/EdXposed#447
ElderDrivers/EdXposed#448
ElderDrivers/EdXposed#449
ElderDrivers/EdXposed#450
ElderDrivers/EdXposed#451
ElderDrivers/EdXposed#452
ElderDrivers/EdXposed#453
ElderDrivers/EdXposed#454
ElderDrivers/EdXposed#455
ElderDrivers/EdXposed#456
ElderDrivers/EdXposed#457
ElderDrivers/EdXposed#458
ElderDrivers/EdXposed#459
ElderDrivers/EdXposed#460
ElderDrivers/EdXposed#461
ElderDrivers/EdXposed#462
ElderDrivers/EdXposed#463
ElderDrivers/EdXposed#464
ElderDrivers/EdXposed#465
ElderDrivers/EdXposed#466
ElderDrivers/EdXposed#467
ElderDrivers/EdXposed#468
ElderDrivers/EdXposed#469
ElderDrivers/EdXposed#470
ElderDrivers/EdXposed#471
ElderDrivers/EdXposed#472
ElderDrivers/EdXposed#473
ElderDrivers/EdXposed#474
ElderDrivers/EdXposed#475
ElderDrivers/EdXposed#476
ElderDrivers/EdXposed#477
ElderDrivers/EdXposed#478
ElderDrivers/EdXposed#479
ElderDrivers/EdXposed#480
ElderDrivers/EdXposed#481
ElderDrivers/EdXposed#482
ElderDrivers/EdXposed#483
ElderDrivers/EdXposed#484
ElderDrivers/EdXposed#485
ElderDrivers/EdXposed#486
ElderDrivers/EdXposed#487
ElderDrivers/EdXposed#488
ElderDrivers/EdXposed#489
ElderDrivers/EdXposed#490
ElderDrivers/EdXposed#491
ElderDrivers/EdXposed#492
ElderDrivers/EdXposed#493
ElderDrivers/EdXposed#494
ElderDrivers/EdXposed#495
ElderDrivers/EdXposed#496
ElderDrivers/EdXposed#497
ElderDrivers/EdXposed#498
ElderDrivers/EdXposed#499
ElderDrivers/EdXposed#500
ElderDrivers/EdXposed#501
ElderDrivers/EdXposed#502
ElderDrivers/EdXposed#503
ElderDrivers/EdXposed#504
ElderDrivers/EdXposed#505
ElderDrivers/EdXposed#506
ElderDrivers/EdXposed#507
ElderDrivers/EdXposed#508
ElderDrivers/EdXposed#509
ElderDrivers/EdXposed#510
ElderDrivers/EdXposed#511
ElderDrivers/EdXposed#512
ElderDrivers/EdXposed#513
ElderDrivers/EdXposed#514
ElderDrivers/EdXposed#515
ElderDrivers/EdXposed#516
ElderDrivers/EdXposed#517
ElderDrivers/EdXposed#518
ElderDrivers/EdXposed#519
ElderDrivers/EdXposed#520
ElderDrivers/EdXposed#521
ElderDrivers/EdXposed#522
ElderDrivers/EdXposed#523
ElderDrivers/EdXposed#524
ElderDrivers/EdXposed#525
ElderDrivers/EdXposed#526
ElderDrivers/EdXposed#527
ElderDrivers/EdXposed#528
ElderDrivers/EdXposed#529
ElderDrivers/EdXposed#530
ElderDrivers/EdXposed#531
ElderDrivers/EdXposed#532
ElderDrivers/EdXposed#533
ElderDrivers/EdXposed#534
ElderDrivers/EdXposed#535
ElderDrivers/EdXposed#536
ElderDrivers/EdXposed#537
ElderDrivers/EdXposed#538
ElderDrivers/EdXposed#539
ElderDrivers/EdXposed#540
ElderDrivers/EdXposed#541
ElderDrivers/EdXposed#542
ElderDrivers/EdXposed#543
ElderDrivers/EdXposed#544
ElderDrivers/EdXposed#545
ElderDrivers/EdXposed#546
ElderDrivers/EdXposed#547
ElderDrivers/EdXposed#548
ElderDrivers/EdXposed#549
ElderDrivers/EdXposed#550
ElderDrivers/EdXposed#551
ElderDrivers/EdXposed#552
ElderDrivers/EdXposed#553
ElderDrivers/EdXposed#554
ElderDrivers/EdXposed#555
ElderDrivers/EdXposed#556
ElderDrivers/EdXposed#557
ElderDrivers/EdXposed#558
ElderDrivers/EdXposed#559
ElderDrivers/EdXposed#560
ElderDrivers/EdXposed#561
ElderDrivers/EdXposed#562
ElderDrivers/EdXposed#563
ElderDrivers/EdXposed#564
ElderDrivers/EdXposed#565
ElderDrivers/EdXposed#566
ElderDrivers/EdXposed#567
ElderDrivers/EdXposed#568
ElderDrivers/EdXposed#569
ElderDrivers/EdXposed#570
ElderDrivers/EdXposed#571
ElderDrivers/EdXposed#572
ElderDrivers/EdXposed#573
ElderDrivers/EdXposed#574
ElderDrivers/EdXposed#575
ElderDrivers/EdXposed#576
ElderDrivers/EdXposed#577
ElderDrivers/EdXposed#578
ElderDrivers/EdXposed#579
ElderDrivers/EdXposed#580
ElderDrivers/EdXposed#581
ElderDrivers/EdXposed#582
ElderDrivers/EdXposed#583
ElderDrivers/EdXposed#584
ElderDrivers/EdXposed#585
ElderDrivers/EdXposed#586
ElderDrivers/EdXposed#587
ElderDrivers/EdXposed#588
ElderDrivers/EdXposed#589
ElderDrivers/EdXposed#590
ElderDrivers/EdXposed#591
ElderDrivers/EdXposed#592
ElderDrivers/EdXposed#593
ElderDrivers/EdXposed#594
ElderDrivers/EdXposed#595
ElderDrivers/EdXposed#596
ElderDrivers/EdXposed#597
ElderDrivers/EdXposed#598
ElderDrivers/EdXposed#599
ElderDrivers/EdXposed#600
ElderDrivers/EdXposed#601
ElderDrivers/EdXposed#602
ElderDrivers/EdXposed#603
ElderDrivers/EdXposed#604
ElderDrivers/EdXposed#605
ElderDrivers/EdXposed#606
ElderDrivers/EdXposed#607
ElderDrivers/EdXposed#608
ElderDrivers/EdXposed#609
ElderDrivers/EdXposed#610
ElderDrivers/EdXposed#611
ElderDrivers/EdXposed#612
ElderDrivers/EdXposed#613
ElderDrivers/EdXposed#614
ElderDrivers/EdXposed#615
ElderDrivers/EdXposed#616
ElderDrivers/EdXposed#617
ElderDrivers/EdXposed#618
ElderDrivers/EdXposed#619
ElderDrivers/EdXposed#620
ElderDrivers/EdXposed#621
ElderDrivers/EdXposed#622
ElderDrivers/EdXposed#623
ElderDrivers/EdXposed#624
ElderDrivers/EdXposed#625
ElderDrivers/EdXposed#626
ElderDrivers/EdXposed#627
ElderDrivers/EdXposed#628
ElderDrivers/EdXposed#629
ElderDrivers/EdXposed#630
ElderDrivers/EdXposed#631
ElderDrivers/EdXposed#632
ElderDrivers/EdXposed#633
ElderDrivers/EdXposed#634
ElderDrivers/EdXposed#635
ElderDrivers/EdXposed#636
ElderDrivers/EdXposed#637
ElderDrivers/EdXposed#638
ElderDrivers/EdXposed#639
ElderDrivers/EdXposed#640
ElderDrivers/EdXposed#641
ElderDrivers/EdXposed#642
ElderDrivers/EdXposed#643
ElderDrivers/EdXposed#644
ElderDrivers/EdXposed#645
ElderDrivers/EdXposed#646
ElderDrivers/EdXposed#647
ElderDrivers/EdXposed#648
ElderDrivers/EdXposed#649
ElderDrivers/EdXposed#650
ElderDrivers/EdXposed#651
ElderDrivers/EdXposed#652
ElderDrivers/EdXposed#653
ElderDrivers/EdXposed#654
ElderDrivers/EdXposed#655
ElderDrivers/EdXposed#656
ElderDrivers/EdXposed#657
ElderDrivers/EdXposed#658
ElderDrivers/EdXposed#659
ElderDrivers/EdXposed#660
ElderDrivers/EdXposed#661
ElderDrivers/EdXposed#662
ElderDrivers/EdXposed#663
ElderDrivers/EdXposed#664
ElderDrivers/EdXposed#665
ElderDrivers/EdXposed#666
ElderDrivers/EdXposed#667
ElderDrivers/EdXposed#668
ElderDrivers/EdXposed#669
ElderDrivers/EdXposed#670
ElderDrivers/EdXposed#671
ElderDrivers/EdXposed#672
ElderDrivers/EdXposed#673
ElderDrivers/EdXposed#674
ElderDrivers/EdXposed#675
ElderDrivers/EdXposed#676
ElderDrivers/EdXposed#677
ElderDrivers/EdXposed#678
ElderDrivers/EdXposed#679
ElderDrivers/EdXposed#680
ElderDrivers/EdXposed#681
ElderDrivers/EdXposed#682
ElderDrivers/EdXposed#683
ElderDrivers/EdXposed#684
ElderDrivers/EdXposed#685
ElderDrivers/EdXposed#686
ElderDrivers/EdXposed#687
ElderDrivers/EdXposed#688
ElderDrivers/EdXposed#689
ElderDrivers/EdXposed#690
ElderDrivers/EdXposed#691
ElderDrivers/EdXposed#692
ElderDrivers/EdXposed#693
ElderDrivers/EdXposed#694
ElderDrivers/EdXposed#695
ElderDrivers/EdXposed#696
ElderDrivers/EdXposed#697
ElderDrivers/EdXposed#698
ElderDrivers/EdXposed#699
ElderDrivers/EdXposed#700
ElderDrivers/EdXposed#701
ElderDrivers/EdXposed#702
ElderDrivers/EdXposed#703
ElderDrivers/EdXposed#704
ElderDrivers/EdXposed#705
ElderDrivers/EdXposed#706
ElderDrivers/EdXposed#707
ElderDrivers/EdXposed#708
ElderDrivers/EdXposed#709
ElderDrivers/EdXposed#710
ElderDrivers/EdXposed#711
ElderDrivers/EdXposed#712
ElderDrivers/EdXposed#713
ElderDrivers/EdXposed#714
ElderDrivers/EdXposed#715
ElderDrivers/EdXposed#716
ElderDrivers/EdXposed#717
ElderDrivers/EdXposed#718
ElderDrivers/EdXposed#719
ElderDrivers/EdXposed#720
ElderDrivers/EdXposed#721
ElderDrivers/EdXposed#722
ElderDrivers/EdXposed#723
ElderDrivers/EdXposed#724
ElderDrivers/EdXposed#725
ElderDrivers/EdXposed#726
ElderDrivers/EdXposed#727
ElderDrivers/EdXposed#728
ElderDrivers/EdXposed#729
ElderDrivers/EdXposed#730
ElderDrivers/EdXposed#731
ElderDrivers/EdXposed#732
ElderDrivers/EdXposed#733
ElderDrivers/EdXposed#734
ElderDrivers/EdXposed#735
ElderDrivers/EdXposed#736
ElderDrivers/EdXposed#737
ElderDrivers/EdXposed#738
ElderDrivers/EdXposed#739
ElderDrivers/EdXposed#740
ElderDrivers/EdXposed#741
ElderDrivers/EdXposed#742
ElderDrivers/EdXposed#743
ElderDrivers/EdXposed#744
ElderDrivers/EdXposed#745
ElderDrivers/EdXposed#746
ElderDrivers/EdXposed#747
ElderDrivers/EdXposed#748
ElderDrivers/EdXposed#749
ElderDrivers/EdXposed#750
ElderDrivers/EdXposed#751
ElderDrivers/EdXposed#752
ElderDrivers/EdXposed#753
ElderDrivers/EdXposed#754
ElderDrivers/EdXposed#755
ElderDrivers/EdXposed#756
ElderDrivers/EdXposed#757
ElderDrivers/EdXposed#758
ElderDrivers/EdXposed#759
ElderDrivers/EdXposed#760
ElderDrivers/EdXposed#761
ElderDrivers/EdXposed#762
ElderDrivers/EdXposed#763
ElderDrivers/EdXposed#764
ElderDrivers/EdXposed#765
ElderDrivers/EdXposed#766
ElderDrivers/EdXposed#767
ElderDrivers/EdXposed#768
ElderDrivers/EdXposed#769
ElderDrivers/EdXposed#770
ElderDrivers/EdXposed#771
ElderDrivers/EdXposed#772
ElderDrivers/EdXposed#773
ElderDrivers/EdXposed#774
ElderDrivers/EdXposed#775
ElderDrivers/EdXposed#776
ElderDrivers/EdXposed#777
https://github.com/ElderDrivers/EdXposed/issues/778
ElderDrivers/EdXposed#779
ElderDrivers/EdXposed#780
ElderDrivers/EdXposed#781
ElderDrivers/EdXposed#782
ElderDrivers/EdXposed#783
ElderDrivers/EdXposed#784
ElderDrivers/EdXposed#785
ElderDrivers/EdXposed#786
ElderDrivers/EdXposed#787
ElderDrivers/EdXposed#788
ElderDrivers/EdXposed#789
ElderDrivers/EdXposed#790
ElderDrivers/EdXposed#791
ElderDrivers/EdXposed#792
ElderDrivers/EdXposed#793
ElderDrivers/EdXposed#794
ElderDrivers/EdXposed#795
ElderDrivers/EdXposed#796
ElderDrivers/EdXposed#797
ElderDrivers/EdXposed#798
ElderDrivers/EdXposed#799
ElderDrivers/EdXposed#800
ElderDrivers/EdXposed#801
ElderDrivers/EdXposed#802
ElderDrivers/EdXposed#803
ElderDrivers/EdXposed#804
ElderDrivers/EdXposed#805
ElderDrivers/EdXposed#806
ElderDrivers/EdXposed#807
ElderDrivers/EdXposed#808
ElderDrivers/EdXposed#809
ElderDrivers/EdXposed#810
ElderDrivers/EdXposed#811
ElderDrivers/EdXposed#812
ElderDrivers/EdXposed#813
ElderDrivers/EdXposed#814
ElderDrivers/EdXposed#815
ElderDrivers/EdXposed#816
ElderDrivers/EdXposed#817
ElderDrivers/EdXposed#818
ElderDrivers/EdXposed#819
ElderDrivers/EdXposed#820
ElderDrivers/EdXposed#821
https://github.com/ElderDrivers/EdXposed/issues/822
ElderDrivers/EdXposed#823
ElderDrivers/EdXposed#824
ElderDrivers/EdXposed#825
ElderDrivers/EdXposed#826
ElderDrivers/EdXposed#827
ElderDrivers/EdXposed#828
ElderDrivers/EdXposed#829
ElderDrivers/EdXposed#830
ElderDrivers/EdXposed#831
ElderDrivers/EdXposed#832
ElderDrivers/EdXposed#833
ElderDrivers/EdXposed#834
ElderDrivers/EdXposed#835
ElderDrivers/EdXposed#836
ElderDrivers/EdXposed#837
ElderDrivers/EdXposed#838
ElderDrivers/EdXposed#839
ElderDrivers/EdXposed#840
ElderDrivers/EdXposed#841
ElderDrivers/EdXposed#842
ElderDrivers/EdXposed#843
ElderDrivers/EdXposed#844
ElderDrivers/EdXposed#845
ElderDrivers/EdXposed#846
ElderDrivers/EdXposed#847
ElderDrivers/EdXposed#848
ElderDrivers/EdXposed#849
ElderDrivers/EdXposed#850
ElderDrivers/EdXposed#851
ElderDrivers/EdXposed#852
ElderDrivers/EdXposed#853
ElderDrivers/EdXposed#854
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working confirmed This issue have been confirmed by developer help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

7 participants