本文转载自: http://www.open-open.com/lib/view/open1451364108964.html

环境:

已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'])

下载 XposedBridgeApi-54.jar 并放入app目录下的libs文件夹.

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

<meta-data
    android:name="xposedmodule"
    android:value="true" />
<meta-data
    android:name="xposeddescription"
    android:value="kiya's test module" />
<meta-data
    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 Studio 上第一个 Xposed 模块的更多相关文章

  1. 各位大神,我请教一个问题,我在Android studio上创一个project显示错误

    Error:FAILURE: Build failed with an exception. * Where: Build file 'C:\Users\Administrator\AndroidSt ...

  2. Android Studio 上传本地项目到 GitHub 上

    •准备工作 注册 GitHub 账号 [GitHub官网] [视频教程] 安装 Git [官方链接] [极速下载链接] 创建本地代码仓库 在桌面上,鼠标右击,选择  Git Bash Here : 接 ...

  3. Android Studio上NDK/JNI开发环境问题

    基础环境: 操作系统 —— Windows 7 Android Studio —— 1.5.1(android-studio-bundle-141.2456560-windows.exe) NDK — ...

  4. Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny

    首先提下ButterKnifey已经更新到版本7.0.1了,现在注解已经不叫@InjectView了,而叫@Bind,感觉更贴合语义.同时注册的方式也从 ButterKnife.inject(this ...

  5. 如何在Android Studio上使用Github

    首先,登陆到Github上并创建一个新repository.在屏幕右上角,点击“+”标记,并且选择“New repository”. 现在完成这个表格以新建一个叫做testproject的新repos ...

  6. tensorflow lite的demo在android studio上环境搭建

    由于很久没有接触过Android开发,而且最早用的是eclipse,所以这个demo在android studio上的搭建过程,真的是踩了不少坑.记录这篇文章,纯粹是给自己一点收获. 环境搭建的过程, ...

  7. Android studio中为项目添加模块依赖的过程

    https://blog.csdn.net/cheng__lu/article/details/74574582 Android studio中为项目添加模块依赖的过程 1.点击菜单file>p ...

  8. Android Studio 上传GitHub项目失败后的一些问题

    在Android Studio上传项目到GitHub时候多上传了了一些项目,想删除,但是报诸如 Remote project is already on GitHub 一些乱七八糟的问题,而且,提示p ...

  9. android studio 创建第一个app之hello world

    android studio 创建第一个app之hello world 想要用studio创建一个简单的app,结果遇到各种问题,application就是允许不起来,后来在专业人的帮助下,删除了一些 ...

随机推荐

  1. sql语句与 数据库

    create  table  wyx( xh int primary key, xm varchar(20) not null, nl int, zcrq timestamp default curr ...

  2. SQL数据库的十条命令

    --(1)查询每个总学时数 select GradeId,SUM(classHour) from subject group by GradeId order by(SUM(classHour)) - ...

  3. Webview 与h5的交互

    步骤:H5代码   <html>   <head>   <meta charset="UTF-8">   <title>交互Demo ...

  4. IEnumerable 和 IQueryable 区别

    IQueryable继承自IEnumerable,所以对于数据遍历来说,它们没有区别. 但是IQueryable的优势是它有表达式树,所有对于IQueryable的过滤,排序等操作,都会先缓存到表达式 ...

  5. 分布式id 实现方式

    1. uuid 2. twitter的Snowflake 3. MongoDB ObjectID 4. Ticket Server 5. Instagram采用的方式(UUID方式)

  6. Flume+Kafka+Strom基于伪分布式环境的结合使用

    目录: 一.Flume.Kafka.Storm是什么,如何安装? 二.Flume.Kafka.Storm如何结合使用? 1) 原理是什么? 2) Flume和Kafka的整合  3) Kafka和St ...

  7. osx 文本编辑工具下载地址Sublime Text 3

    下载地址: http://www.sublimetext.com/3 Sublime Text 是一个代码编辑器(Sublime Text 3是收费软件,但可以无限期试用),也是HTML和散文先进的文 ...

  8. springmvc权限过滤器

    package com.zbb.cn.filter; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; ...

  9. 什么是BOM头,及PHP解决办法

    类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM).它是一串隐藏的字符,用于让记事本等编辑器识别 ...

  10. JMeter压力测试以文件的形式

    JMeter压力测试入门教程[图文] 1. 下载JMeter 2. 启动JMeter 3. 运行预准备 4. 运行 文章目录 Apache JMeter是Apache组织开发的基于Java的压力测试工 ...