首页 > 解决方案 > Xposed - 我可以打印内部类方法,但方法挂钩不起作用

问题描述

我试图在内部类中挂钩一个方法,但什么也没发生,而我可以打印该类的所有方法。

打印的所有日志,除了replaceHookedMethod.

public class Keyguard implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

        if (!lpparam.packageName.equals("com.android.keyguard"))
            return;
        XposedBridge.log("we are in keyguard!");

        Class HwClockView = XposedHelpers.findClass("com.android.keyguard.AbsClockView$HwClockView",
                lpparam.classLoader);
        for (Method m : HwClockView.getDeclaredMethods()) {
            XposedBridge.log("method: " + m.getName());
        }

        XposedHelpers.findAndHookMethod(HwClockView, "getDateString",
                TimeZone.class, new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                XposedBridge.log("we are in getDateString!");
                return String.format("%s", Utils.getPersianDateShort());
            }
        });
}

更新: 在第二条评论之后将代码更改为此,但与之前一样没有任何反应:

public class Keyguard implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {

        if (!lpparam.packageName.equals("com.android.keyguard"))
            return;
        XposedBridge.log("we are in keyguard!");

        Class HwClockView = XposedHelpers.findClass("com.android.keyguard.AbsClockView$HwClockView",
                lpparam.classLoader);
        for (Method m : HwClockView.getDeclaredMethods()) {
            XposedBridge.log("method: " + m.getName());
            if ("getDateString".equalsIgnoreCase(m.getName())) {
                XposedBridge.hookMethod(m, new XC_MethodReplacement() {
                    @Override
                    protected Object replaceHookedMethod(MethodHookParam param) {
                        XposedBridge.log("we are in getDateString!");
                        return String.format("%s", Utils.getPersianDateShort());
                    }
                });
            }
        }
}

目标类:

public class AbsClockView extends RelativeLayout {
    protected Calendar mCalendar;
    private HwCustKeyguardStatusViewEx mCustKeyguardStatusViewEx;
    protected TextView mDateView;
    protected TextView mDescriptionView;
    protected Factory mFactory;
    protected final AtomicBoolean mFixedTimeZone;
    protected FrameLayout mTimeParent;
    protected TextView mTimeView;

    public interface Factory {
        void refreshDate();

        void setHwDateFormat();

        void updateHwTimeStyle();
    }

    private class HwClockView implements Factory {
        protected Context mContext;

        public HwClockView(Context context) {
            ...
        }

        private CharSequence getDateString(TimeZone timeZone) {
            return someString;
        }
    }

    public AbsClockView(Context context) {
        this(context, null);
    }
}

标签: androidxposed

解决方案


推荐阅读