我对Xposed主动调用方法有一些疑问

时间:2017-03-22 07:37:38

标签: android xposed-framework

我在钩子操作之后执行方法之前写过。

现在我想在我自己的界面中触发hook方法。

我应该如何调用hook方法

一个简短的示例代码会很好:)

由于

1 个答案:

答案 0 :(得分:0)

简答

您需要致电java.lang.reflect.Method.invoke()

长答案

我假设您要调用("调用")您从代码的其他部分挂钩的方法。

首先,您需要访问要调用该功能的MemberObject

  1. beforeHookedMethod()afterHookedMethod()中,您收到了XC_MethodHook.MethodHookParam
  2. 类型的对象
  3. 此对象包含method类型的字段MemberthisObject类型的Object。保存这些变量以供日后使用。
  4. 稍后,在您的界面中,当您想要调用该函数时,只需将上述成员转换为Method并使用thisObject作为参数调用Method.invoke()
  5. 代码示例 -

    //To save the returned Member and Object
    public static Method myMember;
    public static Object myObject;
    .
    .
    .
    //In your hook
    protected Object beforeHookedMethod(MethodHookParam methodHookParam){
    //Cast to method and save for later
        myMember = (Method) methodHookParam.method;
        myObject = methodHookParam.thisObject;
    }
    .
    .
    .
    //Later, in your interface, to call the function
    myMember.invoke(myObject)
    

    注意 - 如果需要将参数传递给函数调用,则1中的MethodHookParam对象也包含args字段中的那些。

    更简单 - 如果您要调用的功能是静态的

    如果该功能是静态的,您不需要等待回调。

    1. 您调用挂钩的功能(例如findAndHookMethod()) 返回XC_MethodHook.Unhook类型的对象作为参数。
    2. 在该对象上调用getHookedMethod()将返回并反对 类型为Member
    3. 只需将此会员投放为Method并致电 Method.invoke(null)(该对象可以为null,因为该函数是静态的。)
    4. 注意 - 此外,如果您仍然使用该方法,则在调用此函数时仍会调用beforeHookedMethod()afterHookedMethod()。如果您不希望调用它们,请使用XposedBridge.invokeOriginalMethod()代替上面的Method.invoke()。