当前位置: 首页 > news >正文

Xposed模块的开发

作者:snowdream
Email:yanghui1986527#gmail.com
Github: https://github.com/snowdream
QQ 群: 529327615
原文地址:https://snowdream.github.io/blog/2016/09/02/android-develop-xposed-module/

注: 根据Development tutorial 整理完成

创建Android项目

如果准备从零开始创建Xposed模块,首先应该创建一个Android应用工程。

引入 Xposed Framework API

app/build.gradle文件中声明Xposed Framework API 的jar包依赖。

repositories {
    jcenter();
}

dependencies {
  provided 'de.robv.android.xposed:api:82'
  //如果需要引入文档,方便查看的话
  provided 'de.robv.android.xposed:api:82:sources'
}

说明:

  1. 请留意,这个82是Xposed Framework API的版本号,叫做xposedminversion。
  2. xposedminversion可以在这里进行查询:
    https://bintray.com/rovo89/de.robv.android.xposed/api
  3. Xposed Framework API文档请参考:http://api.xposed.info/reference/packages.html

修改AndroidManifest.xml

在AndroidManifest.xml文件中添加以下代码。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.robv.android.xposed.mods.tutorial"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="Easy example which makes the status bar clock red and adds a smiley" />
        <meta-data
            android:name="xposedminversion"
            android:value="53" />
    </application>
</manifest>

说明:

  1. xposedmodule: 一般设置为true,表示这是一个xposed模块
  2. xposeddescription: 一句话描述该模块的用途,可以引用string.xml中的字符串
  3. xposedminversion: 没错,这个就是上面提到的xposedminversion。我理解为要求支持的Xposed Framework最低版本。

模块实现

创建一个或者几个类,并实现IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口。

package de.robv.android.xposed.mods.tutorial;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public class Tutorial implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        XposedBridge.log("Loaded app: " + lpparam.packageName);
    }
}

注: XposedBridge.log会将日志输出到logcat,并写入日志文件"/data/data/de.robv.android.xposed.installer/log/debug.log".

好了,现在可以开始Hook了。
大部分的Hook工作,主要通过XposedHelpers类的一些辅助函数来实现。比如:findAndHookMethod

package de.robv.android.xposed.mods.tutorial;

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public class Tutorial implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        if (!lpparam.packageName.equals("com.android.systemui"))
            return;

        findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                // this will be called before the clock was updated by the original method
            }
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                // this will be called after the clock was updated by the original method
            }
    });
    }
}

注:根据名称不难发现,beforeHookedMethod/afterHookedMethod会在被Hook函数之前/之后执行。

关于使用Xposed来进行Hook的更多知识,这里就不展开了。大家可以参考以下两篇文章:

  1. Helpers
  2. android-hook框架xposed篇

声明实现

在assets目录下创建一个空文件,命名为xposed_init。
在这个文件中,每一行记录一个类的完整路径,来声明实现类。
在这里,我们声明 "de.robv.android.xposed.mods.tutorial.Tutorial"

好了,到这里,一个简单的Xposed模块应用项目就构建好了。

模块安装与使用

  1. 将这个工程,编译,打包,安装到已经支持Xposed的手机中。
  2. 打开Xposed Installer应用,切换到模块界面,你可以看到你开发的Xposed模块。
  3. 通过勾选/取消,来启用/禁用模块。然后,重启手机,进行生效。

模块发布

Xposed模块开发完成后,你可以按照以下步骤发布分享。

  1. 你首先需要一个XDA论坛帐号。如果没有,请前往论坛注册:
    http://forum.xda-developers.com/
  2. 使用XDA论坛帐号,登录xposed官网,按照操作提示进行发布。
    http://repo.xposed.info/

Xposed模块开发优势和不足

优势

  1. 功能强大,既可以修改系统应用,也可以修改其他应用。hook android,hook everything.
  2. 使用灵活,既可以针对一款应用进行Hook,也可以针对所有应用进行Hook。

不足

  1. 无法调试。只能通过打印日志进行跟踪。(例如:XposedBridge.log)
  2. 无法即时生效。启用/禁用模块,你需要重启手机。
  3. multidex支持不足。详见Multidex support

Xposed模块开发实例

在Xposed-Keylogger的基础上,我稍作修改,制作了一个Xposed模块开发实例。
这个模块的作用就是监听键盘按键,记录所有你设置到EditText控件的字符串。

建议

Xposed是如此的强大,因此,建议重视手机安全的用户,坚决不要root,不要安装xposed,发烧友,土豪随意。

参考

  1. Xposed 官网
  2. Xposed XDA论坛
  3. Development tutorial
  4. Helpers
  5. Replacing resources
  6. Using the Xposed Framework API
  7. DingDingUnrecalled
  8. FakeXX
  9. WechatLuckyMoney
  10. Xposed Framework API
  11. Xposed Framework API in bintray
  12. android-hook框架xposed篇
  13. JustTrustMe

相关文章:

  • 使用 @font-face
  • 格式与布局定位
  • 一步步来配置安卓开发环境ADTBundle
  • 基础知识整理-1
  • JavaScript之apply()和call()的区别
  • javascript 常用技巧
  • 自定义Spark Partitioner提升es-hadoop Bulk效率
  • 权限及权限管理
  • activemq安全设置 设置admin的用户名和密码
  • 全局CSS设置
  • 1分钟导出MySQL的数据字典
  • 1060. 爱丁顿数(25)
  • struts理解
  • win10 中xshell输入中文显示问号问题
  • java 面试每日一题
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • IDEA 插件开发入门教程
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mongodb--安装和初步使用教程
  • PhantomJS 安装
  • Redis 懒删除(lazy free)简史
  • Shadow DOM 内部构造及如何构建独立组件
  • vue-loader 源码解析系列之 selector
  • vue自定义指令实现v-tap插件
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 翻译:Hystrix - How To Use
  • 诡异!React stopPropagation失灵
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 新手搭建网站的主要流程
  • 白色的风信子
  • 进程与线程(三)——进程/线程间通信
  • #Z0458. 树的中心2
  • (02)vite环境变量配置
  • (C++)八皇后问题
  • (SpringBoot)第二章:Spring创建和使用
  • (八)Flask之app.route装饰器函数的参数
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九)One-Wire总线-DS18B20
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)母版页和相对路径
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net(C#)常用转换byte转uint32、byte转float等
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [APIO2012] 派遣 dispatching
  • [C++打怪升级]--学习总目录