[转载] Android Studio 上第一个 Xposed 模块
本文转载自: 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 模块的更多相关文章
- 各位大神,我请教一个问题,我在Android studio上创一个project显示错误
Error:FAILURE: Build failed with an exception. * Where: Build file 'C:\Users\Administrator\AndroidSt ...
- Android Studio 上传本地项目到 GitHub 上
•准备工作 注册 GitHub 账号 [GitHub官网] [视频教程] 安装 Git [官方链接] [极速下载链接] 创建本地代码仓库 在桌面上,鼠标右击,选择 Git Bash Here : 接 ...
- Android Studio上NDK/JNI开发环境问题
基础环境: 操作系统 —— Windows 7 Android Studio —— 1.5.1(android-studio-bundle-141.2456560-windows.exe) NDK — ...
- Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny
首先提下ButterKnifey已经更新到版本7.0.1了,现在注解已经不叫@InjectView了,而叫@Bind,感觉更贴合语义.同时注册的方式也从 ButterKnife.inject(this ...
- 如何在Android Studio上使用Github
首先,登陆到Github上并创建一个新repository.在屏幕右上角,点击“+”标记,并且选择“New repository”. 现在完成这个表格以新建一个叫做testproject的新repos ...
- tensorflow lite的demo在android studio上环境搭建
由于很久没有接触过Android开发,而且最早用的是eclipse,所以这个demo在android studio上的搭建过程,真的是踩了不少坑.记录这篇文章,纯粹是给自己一点收获. 环境搭建的过程, ...
- Android studio中为项目添加模块依赖的过程
https://blog.csdn.net/cheng__lu/article/details/74574582 Android studio中为项目添加模块依赖的过程 1.点击菜单file>p ...
- Android Studio 上传GitHub项目失败后的一些问题
在Android Studio上传项目到GitHub时候多上传了了一些项目,想删除,但是报诸如 Remote project is already on GitHub 一些乱七八糟的问题,而且,提示p ...
- android studio 创建第一个app之hello world
android studio 创建第一个app之hello world 想要用studio创建一个简单的app,结果遇到各种问题,application就是允许不起来,后来在专业人的帮助下,删除了一些 ...
随机推荐
- Fragment +ViewPager
public class MainActivity extends FragmentActivity { private ViewPager vp; @Override protected vo ...
- MongoDB学习笔记二:创建、更新及删除文档
插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...
- C#先执行一段sql等后台操作后再提示是否后续操作confrim
应用场景:例如选择一个单据号打击打印后先去数据库检索是否有打打印过,如果有则提示,已打印,是否再打 如果没有则不提示,直接进行打印. 实现原理:多做一个隐藏按钮去实现打印功能,页面上的打印按钮则进行数 ...
- .NET垃圾回收:非托管资源,IDispose和析构函数的结合
http://blog.jobbole.com/85436/ 原文出处: 田小计划 欢迎分享原创到伯乐头条 前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于 ...
- UNICODE与UTF8和GBK之间的关系
http://wenku.baidu.com/link?url=bheGEzfSjEx-QX-ciME5oKooKYE08_NJZ02l2kKFa7kVZJ4t8Ks2uSNByovgP2QL6btq ...
- Whats meaning of “EXPORT_SYMBOL” in Linux kernel code?
EXPORT_SYMBOL的作用是什么? EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一 ...
- 高度平衡的二叉搜索树(AVL树)
AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...
- Eclipse tomcat插件禁用热加载
Eclipse中的tomcat插件默认是开户了热加载,只要是修改了java文件一保存,tomcat自动编译.加载.发布,很吃内存. 关闭方法: 打开eclipse,找到server项: 双击打开,修改 ...
- 获取本机MAC地址
<%@ page contentType="text/html; charset=GBK" %><html><head><meta htt ...
- 一加3,CM13蓝牙共享互联网 无效。
一加3准备把4G网络共享给魅族PRO5. 但在一加3的蓝牙设置里怎么勾选都无用. 最后发现在要在PRO5上设置才行. 1.在蓝牙列表中,点击带圈的感叹号. 2.选择“互联网访问”. - --