2015-05-08 283 views
1

我试图挂钩Settings.System.putInt方法是static。这种方法的一个要求是方法com.android.settings.AirplaneModeEnabler类。它被放置在Android的Settings应用程序中。另外,在com.android.systemui中使用putInt方法。Xposed - 无法挂钩静态方法

但是,下面的代码不会挂钩putInt方法。它没有给出任何例外,但它也不会转储任何带有内容“In android.provider.Settings.System”的日志消息,这意味着beforeHookedMethod未被调用,或者它不能被挂钩。 Loaded app日志已打印。任何帮助是极大的赞赏。

@Override 
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { 
    if (!(lpparam.packageName.equals("com.android.systemui") || lpparam.packageName.equals("com.android.settings"))) { 
     return; 
    } 
    XposedBridge.log("Loaded app: " + lpparam.packageName); 
    final Class<?> mClass = XposedHelpers.findClass("android.provider.Settings$System", lpparam.classLoader); 
    findAndHookMethod(mClass, "putInt", ContentResolver.class, String.class, "int", new XC_MethodHook() { 
     @Override 
     protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 
      XposedBridge.log("In android.provider.Settings.System"); 
     } 
    }); 
} 

Xposed-Framework版本:54

Android版本:4.2.2

回答

0

由于果冻豆MR1(4.2)的方法setAirplaneModeOn使用putIntSettings.Global代替Settings.System,你可以看到here

您的代码应修改如下:

@Override 
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { 
    if (!(lpparam.packageName.equals("com.android.systemui") || lpparam.packageName.equals("com.android.settings"))) { 
     return; 
    } 
    XposedBridge.log("Loaded app: " + lpparam.packageName); 
    final Class<?> mClass = XposedHelpers.findClass("android.provider.Settings$Global", lpparam.classLoader); 
    findAndHookMethod(mClass, "putInt", ContentResolver.class, String.class, int.class, new XC_MethodHook() { 
     @Override 
     protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 
      XposedBridge.log("In android.provider.Settings.Global"); 
     } 
    }); 
} 

我测试更新的代码与奇巧4.4.4和它工作正常。

+0

是的,使用class'Global'而不是'Settings'解决了我的问题。谢谢 – Shnkc