Xposed初步使用

XposedDemo

开发环境准备

    AS4.0
    手机api 19
    root工具:360超级ROOT
    相关补充资源: https://pan.baidu.com/s/1sN3Ux0wpbzZqD6AtE_bBpQ 提取码: pkcp
    [各种系统版本的XPosed框架资料下载](http://www.95bmf.com/archives/288)

一、Xposed简介

Xposed是一款优秀的android java层 hook 框架。它允许你在不修改apk源码的情况下,通过编写自己的模块来改变apk的行为。它的优点是采用了插件机制,模块能够适用不同版本的框架和rom。模块改变apk行为的操作发生在内存中,对源apk不进行任何修改。你只需要安装编写的模块并重启相应的设备即可。

Xposed 官网:http://repo.xposed.info/
Xposed 项目 github 地址:https://github.com/rovo89
Xposed 官方教程 :https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

Xposed工作原理

Xposed是一个很厉害的框架,可以在不改动app的情况下对app进行修改,比如更换元素,加载拦截等

Android基于Linux,第一个启动的进程自然是init进程,该进程会启动所有Android进程的父进程——Zygote(孵化)进程,该进程的启动配置在/init.rc脚本中,而Zygote进程对应的执行文件是/system/bin/app_process,该文件完成类库的加载以及一些函数的调用工作。在Zygote进程创建后,再fork出SystemServer进程和其他进程。而Xposed Framework呢,就是用自己实现的app_process替换掉了系统原本提供的app_process,加载一个额外的jar包,然后入口从原来的:com.android.internal.osZygoteInit.main()被替换成了:de.robv.android.xposed.XposedBridge.main(),然后创建的Zygote进程就变成Hook的Zygote进程了,而后面Fork出来的进程也是被Hook过的。这个Jar包在:/data/data/de.rbov.android.xposed.installer/bin/XposedBridge.jar

创建一个工程

  • Step 1:新建一个工程,然后修改下AndroidManifest.xml,增加下面的代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xposedmoudle">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--是否作为模块-->
        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="hellow xposed" />
        <!--这个版本对应的是引入的jar版本-->
        <meta-data
            android:name="xposedminversion"
            android:value="53" />
    </application>
</manifest>
  • step2 引入依赖
    在build.gradle(app)中添加依赖
    注:只参与编译,不参与打包

dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    ** compileOnly files('libs/api-53.jar')**
    **compileOnly files('libs/XposedBridgeApi-30.jar')**
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
  • step3 实现XPsoed入口类
    
      package com.example.xposedmoudle;
      public class HookLoadPackage implements IXposedHookLoadPackage {
      @Override
      public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
          if (loadPackageParam.packageName.equals("com.example.xposedmoudle")) {
              XposedHelpers.findAndHookMethod("com.example.xposedmoudle.MainActivity", loadPackageParam.classLoader, "onCreate", Bundle.class,
                      new XC_MethodHook() {
                          @Override
                          protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                              super.beforeHookedMethod(param);
                          }
                          @Override
                          protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                              super.afterHookedMethod(param);
                              Class c = loadPackageParam.classLoader.loadClass("com.example.xposedmoudle.MainActivity");
                              Field fild = c.getDeclaredField("tv");
                              fild.setAccessible(true);
                              TextView tv = (TextView) fild.get(param.thisObject);
                              tv.setText("测试");
                          }
                      });
          }
      }
    

}

  • step4 在app/src/main/asserts文件夹创建一个xposed_init文件将入口文件完整名写入,每一行执行一个入口 类
 com.example.xposedmoudle.HookLoadPackage

继承了IXposedHookLoadPackage接口,重写了handleLoadPackage方法,
判断app包名,如果是的,XposedHelpers.findAndHookMethod(),
hook掉onCreate()方法,XC_MethodHook()重写afterHookedMethod,
当onCreate()执行后会回调这个方法,在这里获得TextView对象,
把文字修改”,接着运行,安装后需要重启设备。

AS 设置

打开设置 -> Build,Execution,Deployment -> Debugger -> HotSwap 选中右面的 Enable hot-swap agent for Groovy code 把勾选去掉
在这里插入图片描述

调试

下载Xposed installer 成功后,将de.robv.android.xposed.installer.apk已经root真机上–>进行激活安装
在这里插入图片描述
在这里插入图片描述
笔者在调试的时候遇到覆盖安装不能生效的问题,需要卸载掉应用 并重启设备才可以,需要注意下

借鉴文章
本工程地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值