走近Xposed模块开发

  • 内容
  • 评论
  • 相关

上篇我们介绍了关于Xposed,你需要了解的知识,想必大家都对Xposed框架有所了解了,本篇我将简述Xposed模块的开发过程,为大家揭开Xposed模块开发的神秘面纱。



Xposed开发官方的指南
https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
全英文的,英语过六级的可以看看。



Xposed模块开发前的准备



Xposed模块开发是基于安卓开发的,所以首先得会安卓开发,想学习安卓开发的可以看这个《Android基础入门教程》: 

http://www.runoob.com/w3cnote/android-tutorial-intro.html

顺便推荐几本学习安卓开发的书:

《第一行代码 (Android 第2版)》、《Android编程权威指南(第3版)》、《疯狂Android讲义(第2版)》

安卓开发又是基于Java语言的,所以你首先得有Java编程的基础,才能看懂和自己编写代码。

推荐几本适合Java初学者的书:

《Java从入门到精通》、《Java面向对象程序设计》

编写Xposed模块还得具备一定的安卓逆向能力,逆向能力是通过经验积累的,吾爱破解和看雪论坛都是学习逆向知识的好地方。

推荐一本介绍逆向知识的书《Android软件安全与逆向分析》。

安卓逆向是一门杂学,懂得编程以及系统底层方面的知识前提下才能理解,不然就只能依葫芦画瓢了。



开始开发



准备工具:

安卓模拟器(我用的逍遥安卓,在里面安装Xposed框架即可)、JadX(用来反编译APK文件)、安卓开发环境(这里用的ADT版Eclipse,主要是方便)



1
确定想要实现的功能


通过Xposed框架可以实现hook指定的类,改变或者输出其返回值和参数,替换方法、资源、布局等操作。


这里我们以某音乐播放器为例,实现去除轮播图(就是显示耳机广告的那个Banner)的功能。


走近Xposed模块开发


要去除这个Banner,可以获取到这个View(视图)的实例,然后设置显示属性为隐藏或者从layout(布局)文件中找到定义这个View的代码,把它删除等。

使用Xposed方式实现的话,可以找到这个控件初始化的地方,然后修改显示的代码。还可以通过hook系统View类的设置布局参数方法来实现,这里我们就介绍这种方法。

首先我们需要找到这个View的id:

通过Eclipse内的插件UI Automator可以获取当前界面的布局的信息,这里找到布局id为adapter_root,如图所示:


走近Xposed模块开发


这里的 adapter_root 是这个View的名字,我们要通过id找到控件的话,需要获取他的id值,这里我们可以有很多方式获取这个id的值,比如使用adb命令 adb shell dumpsys activity top 、使用开发者助手或者其他工具、Hook R.id类通过字段读取属性值等,这里为了方便,就使用Jadx反编译然后搜索这个View的名字找到对应id。

把apk改名为rar打开,然后把classes.dex解压拖入jadx中:


走近Xposed模块开发


搜索得到id值为2131624255。


走近Xposed模块开发



2
开始编写模块


Eclipse新建Android项目

导入XposedBridge的jar包:

(下载地址:  https://jcenter.bintray.com/de/robv/android/xposed/api/ )

在Eclipse上的操作为:右键项目-构建路径-配置构建路径-库-添加外部JAR


走近Xposed模块开发


为了让Xposed识别我们的App为模块,我们需要在AndroidManifest.xml中加入下面代码:


走近Xposed模块开发

这些代码的含义在上一篇文章中有介绍,其实也很简单明了,就不多说了。


新建一个类,实现IXposedHookLoadPackage接口:


走近Xposed模块开发

里面过滤了要修改APK的包名。


为了让Xposed在其他app中加载这个类,我们需要在assets文件夹中新建xposed_init文件,文件内容为实现hook类的路径:


走近Xposed模块开发


最后我们编写Hook代码:


走近Xposed模块开发

简单解释一下:

这里Hook了系统类 android.view.View 中的 setLayoutParams 方法,因为所有View初始化时都会调用这个方法。在其中过滤id为2131624255(也就是上面搜索到的adapter_root 这个View的id)的View,然后设置这个View的高度为1,宽度为0,是为了不留空白。最后设置可见性为GONE,达到隐藏的效果。



3
测试


模块安装到模拟器中,然后重启模拟器进行测试。


走近Xposed模块开发


测试效果:


走近Xposed模块开发


可以看到那个碍眼的轮播图已经被去掉了,界面清爽了许多。

当然这个例子只是为了演示方便,通过id来过滤这个View,如果APP更新,或者使用其他版本的话,这个id值可能不一样。此时我们就需要寻找其他方法来过滤这个View了。比如通过根布局的节点来定位、通过描述文本定位、通过View的类型以及子View的类型来定位等等。



4
发布


当测试完毕之后,就可以打包签名,然后发布到各大市场供他人使用了。

项目地址: https://github.com/Specher/kwmusicplus



结语



这里只演示了Xposed强大功能中的冰山一角,让大家简单了解Xposed模块开发的过程,实际的开发远比这个要复杂的多。比如我开发的网易云音乐插件,经历日以继夜、数以万计次的修改与测试才得以完善,适配了几乎所有网易云音乐的版本和不同的安卓版本系统。

后续会分享更多此类文章,请持续关注我们,公众号Sp软件服务。



走近Xposed模块开发

如果觉得文章对你有帮助,请点击右上角分享到朋友圈或者发送给朋友们,让更多人受益吧!


Sp软件服务 · 2017

走近Xposed模块开发

走近Xposed模块开发

始发于微信公众号:Sp软件服务