以前听到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这些使用者常用的库,避免冲突。
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());
}
});
}
}
}
由于刚开始接触,其他很多东西还没有搞懂,只能先写到这了