环境:

已root手机一枚

Android Studio一枚

官方文档参考 这里 .

准备工作

我们需要事先下载一个 Xposed installer 安装在手机上,用来管理所有的模块.

安装完成后打开:

点击 框架 ,

点击 安装/更新 安装框架,

点击确定重启,框架界面是这样的:

编写新模块

打开android studio,新建工程,选择 Add no activity

新建完成后,找到 app 目录下的 build.gradle 文件,将 dependencies 中的

compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])

改为:

provided fileTree(dir: ‘libs‘, include: [‘*.jar‘])

在 AndroidManifest.xml 文件的 application 中添加如下代码,其中的54是前面下载的文件中的号码.

android:name="xposedmodule"

android:value="true" />

android:name="xposeddescription"

android:value="kiya‘s test module" />

android:name="xposedminversion"

android:value="54" />

新建一个 Test 类,写入:

package space.kiya.xposedtest;

import de.robv.android.xposed.IXposedHookLoadPackage;

import de.robv.android.xposed.XposedBridge;

import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class Test implements IXposedHookLoadPackage{

@Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

XposedBridge.log("loaded: " + loadPackageParam.packageName);

}

}

新建 assets 文件夹,在里面新建文件名为 xposed_init ,写入刚刚的类名,此处应为 space.kiya.xposedtest.Test .

这时就可以编译安装了.

测试

因为工程没有activity,所以在桌面上看不到该应用。

来到 xposed installer 的 模块 中,可以看到我们的模块出现在这里,现在勾选它:

在重启使之生效之前,我们在logcat新建一个tag为 Xposed 的过滤器,这样就可以过滤出模块输出的log.

大概是这样的:

Loading Xposed v54(for Zygote)...

Loading modules from /data/app/space.kiya.xposedtest-1.apk

Loading class space.kiya.xposedtest.Test

Loaded: android

...

这样的日志在 xposed installer 的 日志 中也是可以看到的.

如果log中出现了错误:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

说明是前面步骤中没有修改 build.gradle 导致的.

xposed怎样工作?

开机时, ./init.rc 脚本文件会启动 Zygote 进程,Zygote对应的具体程序是 /system/bin/app_process ,然后加载需要的类,调用初始化的方法,之后启动的每个应用都是Zygote的拷贝,所以Zygote进程是十分重要的.

通过在类路径中添加一个jar包,在 app_process 的特定位置调用jar包中的方法,Xposed框架实现了带扩展功能的 app_process ,然后将原有的 app_process 替换掉.

在 /data/data/de.robv.android.xposed.installer/bin/ 目录下有一个 XposedBridge.jar 文件,它就是被引用的jar包,源码在 github ,main函数在 /src/de/robv/android/xposed/XposedBridge.java 中,每个进程每次启动时都会被调用.加载模块的功能也是在这里实现.

Xposed真正强大的是它可以hook调用的方法.当你反编译修改apk时,你可以在里面插入xposed的命令,于是你就可以在方法调用前后注入自己的代码.

XposedBridge有一个私有的本地方法 hookMethodNative ,代码实现放在 app_process 中.在调用被hook的方法前会先调用此方法, hookMethodNative 有一个 handleHookedMethod 方法,可以修改传递给被hook函数的参数,变量甚至是调用其他方法.

android+xposed+实例,Android Studio 上第一个 Xposed 模块(示例代码)相关推荐

  1. Android架构实例分析之编写hello驱动的HAL层代码

    Android架构实例分析之编写hello驱动的HAL层代码 摘要: HAL层中文名称又叫硬件抽象层,可以理解我Linux驱动的应用层.本文实现了一个简单的hello HAL的代码,衔接hello驱动 ...

  2. android 代码 卸载app,Android在一个app中安装并卸载另一个app的示例代码

    Android在一个app中安装并卸载另一个app 1.在app→src→main下新建文件夹asserts,将准备安装的apk文件放在asserts内 2.在app→src→main→res下新建文 ...

  3. android播放mp3功能,Android Studio实现简单音乐播放功能的示例代码

    项目要求 基于Broadcast,BroadcastReceiver等与广播相关的知识实现简单的音乐播放功能,包括音乐的播放.暂停.切换.进度选择.音量调整. 设计效果 (进度条时间刷新功能还没有实现 ...

  4. 如何在github上fork一个项目来贡献代码以及同步原作者的修改

    如何在github上fork一个项目来贡献代码以及同步原作者的修改 作为一个IT人,通过github进行学习是最快的成长手段.我们可以浏览别人的优秀代码.但只看不动手还是成长得很慢,因此为别人贡献代码 ...

  5. Android使用Service从服务器上下载一个安装包的全过程

    前言:在这里完成了一个完整的从服务器上下载数据的实例! 一.我使用的时OkHttp进行网络通信,所以首先在gradle的dependencies中添加如下依赖: compile 'com.square ...

  6. android 数据库实例,android – 数据库全局实例

    当我刚开始使用Android时,这对我来说是一个问题,因为网上没有很多教程描述如何正确地允许在整个应用程序中访问您的数据库(不要问我原因).这里有一些展示三种可能方法的示例代码. 方法#1:继承`Ap ...

  7. android studio 反编译修改versioncode,在android studio 中修改versioncode 跟versionname(示例代码)...

    在android studio 中修改versioncode 和versionname 最写了一个新版的软件准备发布到应用平台上,但是versioncode  和versionname的值一直修改不成 ...

  8. Android开发实例-Android平台手机新闻客户端

    Android开发实例<Android平台手机新闻客户端>是基于Android4.0及以上平台的一款新闻类手机应用,应用运行效果如下所示: Android开发实例课程主要介绍运行于Andr ...

  9. android怎么用代码调图像,浅谈android中图片处理之图形变换特效Matrix(四)(示例代码)...

    今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的.改变它的颜色主要通过ColorMatrix类来实现. 现在今天所讲的图片变形的特效主要 ...

最新文章

  1. java list 拼音排序_java中实现List集合中对象元素按其属性的中文拼音排序
  2. ubuntu分屏软件_Ubuntu终端多窗口分屏Terminator
  3. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )
  4. 长度限制的队列Python
  5. 电商网站的积分要不要年末清零?
  6. asp.net web开发步骤_HTML5开发常见的7个框架,不可不知,收藏啦
  7. 构建制品不一致,后续工作都是白费 | 研发效能提升36计
  8. bloomberg用法 固定收益_干货 | 日语高考高频考点:助词を的用法
  9. React中的高阶组件
  10. GNS3全面详解系列-GNS3的前世今生
  11. Angular JS
  12. 嵌入式系统——面向对象的设计原则
  13. 解决同一条sql在pl/sql工具中执行很快,在程序中却很慢
  14. 大众点评文字反爬破解
  15. Git ssh fingerprint不一致
  16. 2020江苏事业编计算机类真题,2020江苏事业单位计算机类岗位考情
  17. ASEMI代理AD8606ACBZ-REEL7原装ADI车规级AD8606ACBZ-REEL7
  18. [转]PHP编码规范
  19. h61 nvme硬盘_一盒在手,说走就走-ORICO M.2双盘位移动硬盘盒评测
  20. c99、gnu99与c89

热门文章

  1. java将输出的内容存入词典,中文分词JAVA实现(基于已知的词典txt)
  2. ESP32接入腾讯云物联网开发平台
  3. Webassembly 学习3 -- 打造web端的aac 播放器
  4. RPF收付款核销与财务管理系统
  5. 非线性信道均衡实验仿真
  6. 学习matlab(十六)——工具箱(神经网络)
  7. 契约机器人插件分享CS系列-短网址生成
  8. 软件测试慕课版学习总结—第六章
  9. pdm系统是归档服务器吗,航天企业PDM系统电子文件归档与管理过程研究
  10. linux atom 升级,Atom 1.56.0发布下载,附更新内容,支持Linux及Windows系统