走近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,主要是方便)
通过Xposed框架可以实现hook指定的类,改变或者输出其返回值和参数,替换方法、资源、布局等操作。
这里我们以某音乐播放器为例,实现去除轮播图(就是显示耳机广告的那个Banner)的功能。
要去除这个Banner,可以获取到这个View(视图)的实例,然后设置显示属性为隐藏或者从layout(布局)文件中找到定义这个View的代码,把它删除等。
使用Xposed方式实现的话,可以找到这个控件初始化的地方,然后修改显示的代码。还可以通过hook系统View类的设置布局参数方法来实现,这里我们就介绍这种方法。
首先我们需要找到这个View的id:
通过Eclipse内的插件UI Automator可以获取当前界面的布局的信息,这里找到布局id为adapter_root,如图所示:
这里的 adapter_root 是这个View的名字,我们要通过id找到控件的话,需要获取他的id值,这里我们可以有很多方式获取这个id的值,比如使用adb命令 adb shell dumpsys activity top 、使用开发者助手或者其他工具、Hook R.id类通过字段读取属性值等,这里为了方便,就使用Jadx反编译然后搜索这个View的名字找到对应id。
把apk改名为rar打开,然后把classes.dex解压拖入jadx中:
搜索得到id值为2131624255。
Eclipse新建Android项目
导入XposedBridge的jar包:
(下载地址: https://jcenter.bintray.com/de/robv/android/xposed/api/ )
在Eclipse上的操作为:右键项目-构建路径-配置构建路径-库-添加外部JAR
为了让Xposed识别我们的App为模块,我们需要在AndroidManifest.xml中加入下面代码:
这些代码的含义在上一篇文章中有介绍,其实也很简单明了,就不多说了。
新建一个类,实现IXposedHookLoadPackage接口:
里面过滤了要修改APK的包名。
为了让Xposed在其他app中加载这个类,我们需要在assets文件夹中新建xposed_init文件,文件内容为实现hook类的路径:
最后我们编写Hook代码:
简单解释一下:
这里Hook了系统类 android.view.View 中的 setLayoutParams 方法,因为所有View初始化时都会调用这个方法。在其中过滤id为2131624255(也就是上面搜索到的adapter_root 这个View的id)的View,然后设置这个View的高度为1,宽度为0,是为了不留空白。最后设置可见性为GONE,达到隐藏的效果。
模块安装到模拟器中,然后重启模拟器进行测试。
测试效果:
可以看到那个碍眼的轮播图已经被去掉了,界面清爽了许多。
当然这个例子只是为了演示方便,通过id来过滤这个View,如果APP更新,或者使用其他版本的话,这个id值可能不一样。此时我们就需要寻找其他方法来过滤这个View了。比如通过根布局的节点来定位、通过描述文本定位、通过View的类型以及子View的类型来定位等等。
当测试完毕之后,就可以打包签名,然后发布到各大市场供他人使用了。
项目地址: https://github.com/Specher/kwmusicplus
这里只演示了Xposed强大功能中的冰山一角,让大家简单了解Xposed模块开发的过程,实际的开发远比这个要复杂的多。比如我开发的网易云音乐插件,经历日以继夜、数以万计次的修改与测试才得以完善,适配了几乎所有网易云音乐的版本和不同的安卓版本系统。
后续会分享更多此类文章,请持续关注我们,公众号Sp软件服务。
如果觉得文章对你有帮助,请点击右上角分享到朋友圈或者发送给朋友们,让更多人受益吧!
始发于微信公众号:Sp软件服务