一、Xposed环境配置和简单的demo
一、新建项目
二、配置相关文件
a.配置activity_main.xml,这个只需要添加一个测试用的按钮即可
b.配置MainActivity.java,同样只需要实现一个按钮事件即可
重点来了:
c.添加api-82.jar和api-82-sources.jar在libs目录下
如图:
这两个jar包,在https://bintray.com/rovo89/de.robv.android.xposed/api下载
d.配置build.gradle
在dependencies{}里面添加如下内容
第一行原本为implementation,必须将其改为compileOnly,原因是compileOnly命令只在编译时期打包进入,原因是Xposed里已有该jar包内容,再次打包进去会冲突。
后面两个compileOnly是为了成功导入和编译jar包
e.创建xposed的插件
建立HookMan.java调用IXposedHookLoadPackage接口
这些都比较简单,就是一个java反射,找到Hook类,然后通过调用Xposed的相关api,如findAndHookMethod()方法实现Hook,将需要弹出的内容写在afterHookMethod中
beforeHookedMethod方法,是在我们toastMessage运行前会调用,afterHookedMethod方法,在我们方法运行后调用。
f.编写插件入口配置文件Xposed_init
在project目录下的main目录里面添加一个asserts,再在其目录下添加一个xposed_init
首先创建asserts(注意,这个不是一个简单的文件,而是一个Android Folder):
然后建立一个txt文件
将HookMain完整包名填写到文件中
g.剩下的就是安装程序重启程序了(Xposed模块的安装成功需要重启手机)
二、Xposed框架实现给微信添加menu
1.获取当前界面的类
打开微信到该页面
adb shell
su
dumpsys activity | grep mResumedActivity
得到结果:
mResumedActivity: ActivityRecord{
10752e3c u0 com.tencent.mm/.ui.LauncherUI t429}
(1)Android Device Monitor 首先查看下微信的布局,可以很明显的看到这个搜索和这个加好都是在同一个布局里面,那么我们点击加号,然后用ddms来录制轨迹
录制完成后得到:
然后我们显然要搜索onClick方法,得到它的调用在这里
然后慢慢寻找到该方法
接下来就是hook该方法了
(1)建立HookMain.java
package com.example.wechatmenu;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class HookMain implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
String hookClass = "com.tencent.mm.ui.LauncherUI";//显示要hook的类名
String hookMethodName = "onCreateOptionsMenu";//显示要hook的方法
//TODO findAndHookMethod方法的参数(要Hook的包名+类名,Classload,要hook的方法名,hook方法的参数,XC_MethodHook匿名类)
XposedHelpers.findAndHookMethod(hookClass, lpparam.classLoader, hookMethodName, Menu.class, new XC_MethodHook () {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
final Context applicationContext=null;
//将hook到的微信里面的Menu参数传给一个新构造的menu对象
Menu menu = (Menu) param.args[0];
//获得context以便能够调用Toast方法
applicationContext=AndroidAppHelper.currentApplication().getApplicationContext(); //使用menu类的add方法添加按钮
menu.add(0, 3, 0, "1");
menu.add(0, 4