记第一次使用Xposed的感受

以前听到Xposed的时候,完全不知道是啥,后来听说这个东西很叼可以获取各种app的数据,我的天啊,真的很厉害的酱紫,于是就去下载来看看。不过使用这个Xposed是要root手机的,说到这先说个题外话,我的手机是华为的,半个月前就想root了,坑货的大华为,居然要登录账号15天才能解锁,苦逼的我为有等到今天才搞了,后来解锁了就高高兴兴的准备一键root了……苦逼,各大厂获取root的app都试过,我的手机的版本的都不支持,后来给了5块钱在http://www.7to.cn/这里买了个纯净版的rom刷机,总之各种狗血。好了言归正传了,既然已经root手机了,此时就想到了传说中很厉害的Xposed了,于是就搞搞看了。

有一个现场的 XposedInstaller.apk可以安装的,可是好像并没有那么顺利,安装的时候有个提示,说不好手机会变砖头的,有点小害怕的。

于是乎就找了一个大佬的沙盒应用 https://github.com/android-hacker/VirtualXposed  里面已经自带了XposedInstaller的,现在的话基本解除所有顾虑了。这个沙盒应用是不用root都行的,此时想死的心都有居然不用root也能玩Xposed。开玩笑啦,我root的真正目的不是玩Xposed,只是顺便路过....

现在这里我主要是讲一下怎么写Xposed模块开发,其实主要也是这个,随意对于某应用的模块已经很多。

 先提供Xposed的2个相关api的jar包下载地址  https://download.csdn.net/download/u014476720/10493469

1.直接在gralde引入包,这样就不需要下载上面的两个包了

compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
 
 

provided(compileOnly)

只在编译时有效,不会参与打包 
可以在自己的moudle中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。

3.0之后的都用compileOnly代替provided了
 
 

2.配置清单文件

<!--表示作为Xposed的一个模块-->
<meta-data
    android:name="xposedmodule"
    android:value="true" />
<!--表示对本模块的描述,该描述会显示在安装好后的程序名称下方-->
<meta-data
    android:name="xposeddescription"
    android:value="Xposed test!" />
<!--表示jar包的最低版本号-->
<meta-data
    android:name="xposedminversion"
    android:value="53" />

3.添加一个让Xposed识别模块的配置文件


xposed_init 文件里面内容是模块的路径 ,这里的模块是XposedTest,路径是 com.kawa.xposeddemo.model.XposedTest


4.XposedTest模块的编写,需要实现IXposedHookLoadPackage的接口,

1)下面是最简单的输出包名

public class XposedTest implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        XposedBridge.log(">>>>>>>>>>>>>>>>>>>>>>>>");

        XposedBridge.log("输出包名: " + lpparam.packageName);
    }
}

2)拦截登录的点击事件,读取输入值

public class XposedOnclickTest implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        XposedBridge.log(">>>>>>>>>>>>>>>>>>>>>>>>");
        if (lpparam.packageName.equals("com.gatewang.bs.transaction")) {//第三方指定的包
            XposedBridge.log("已经进来指定的app进行拦截!");
            Class clazz = lpparam.classLoader.loadClass("com.gatewang.bs.transaction.ui.activity.LoginActivity");//第三方指定的登录路径
            XposedHelpers.findAndHookMethod(clazz, "onClick", View.class, new XC_MethodHook() {//拦截点击事件
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    Class clazz = param.thisObject.getClass();
                    // 通过类的字节码得到该类中声明的所有属性,无论私有或公有
                    Field field = clazz.getDeclaredField("accEditText");//accEditText这个是控件EditText的名字
                    field.setAccessible(true);
                    EditText username = (EditText) field.get(param.thisObject);
                    // 输出输入的值
                    XposedBridge.log("name = " + username.getText().toString());
                }
            });
        }
    }
}

由于刚开始接触,其他很多东西还没有搞懂,只能先写到这了



猜你喜欢

转载自blog.csdn.net/u014476720/article/details/80775307