用Android Studio编写Xposed hook模块

一.前言

过去用Eclipse写过很多Xposed hook模块,并有一定的封装,这几天临时用到Android Studio编写Xposed模块遇到一些坑,现在做一个笔记。

二.Android Studio编写Xposede的步骤

书写过程中,没有特定的步骤,只是按照个人习惯,将需要做到的几点记录下来。

  1. 在安卓手机中安装好Xposed Installer模块,Android 4.4的系统,直接adb install *.apk的方式安装好即可,Android 5.0-Android 8的系统中需要安装高版本的Xposed Installer模块,例如Android 5.0中可以安装Xposed Installer3.1.5.apk,但这需要从第三方TWRP中刷进系统,Android 9则需要用到EdXposed Installer;
  2. 打开AS,然后创建一个工程,可带Activity(测试时可用Xposed模块直接hook这个Activity中的函数进行hook,就不用另写一个工程),也可不带(正式写Xposed时,一般不带会好看些,不过也看个人习惯);
  3. 之后的和Eclipse书写Xposed hook模块差不多的步骤,是:(1)在AndroidManifest.xml的 application 块中加上三个元数据,如下:
<application
       ......
        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="模块描述" />
        <meta-data
            android:name="xposedminversion"
            android:value="54" />
    </application>

(2)编写继承自IXposedHookLoadPackage接口的类,当然这得先添加 XposedBridgeApi-54.jar ,不过这个添加过程跟Eclipse有点不同后面再记录,

public class XposedEntry implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if(! loadPackageParam.packageName.equals("test.asxposed.dc.as_xposedmodule")) {
            return ;
        }
        Log.d("py_dc", "come " + loadPackageParam.packageName);
        XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                return "this is imsi";
            }
        });
XposedHelpers.findAndHookMethod("test.asxposed.dc.as_xposedmodule.MainActivity", loadPackageParam.classLoader,
                "add",
                int.class,
                int.class,
                new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
                param.args[0] = 10000;
                Log.d("py_dc", "come " + "argus");
            });     
    }
}

hook的代码是本Xposed模块中MainActivity中的方法,如下:

package test.asxposed.dc.as_xposedmodule;
import ...
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.getImei);
        button.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("MissingPermission")
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "" + add(123, 90), Toast.LENGTH_SHORT).show();
            } });}
    public int add(int m, int n){
        return m + n;
    }
}

(3)新建assets目录,选中app目录,右键:new—Folder——assets Folder,即会默认在src/main目录下创建assets目录中创建assets目录,然后在其中创建xposed_init文件,内容为接口类路径,这里是:test.asxposed.dc.as_xposedmodule.XposedEntry
(4)接下来和Eclipse中蛮大不一样的地方是XposedBridgeApi-54.jar模块的添加,分别说明如下:
1)Eclipse中是在工程根目录下建立一个lib目录,然后将XposedBridgeApi-54.jar拷入其中,最后选中:点击右键——Build Path——Add to Build Path即可。lib中的jar包被视为第三方jar包,添加后,会自动加到Referenced Libraries这个目录,不编译到最终的apk中,libs中的的jar包在添加后是自动加到Referenced Libraries这个目录的,视为私有引用,编译到最终的apk中。当引用另一个项目打包的jar包时,会出现android Dependencies这个依赖目录。

2)Android Studio中:先把 XposedBridgeApi-54.jar 拷到libs目录或者新建的lib目录,再选中工程名,然后点击右键——Open Module Setting——app——Dependencies——点右上角或者左上角的“+”——Jar Dependency,在弹出的窗口中选择XposedBridgeApi-54.jar这一模块,添加完后,在XposedBridgeApi-54.jar所在行的右边点击选择compileOnly(3.x版本)或者provided(2.x版本)。附图如下:
在这里插入图片描述
build.gradle中dependencies中会自动添加下面一项内容:
在这里插入图片描述
之后,安装apk模块到安卓手机,然后Xposed Installer中选择该模块,重启即可。

3)记录一下Android Studio中Jar包的依赖方式
不同的依赖方式会对应Eclipse中的lib中Jar包添加和libs中Jar包添加。Android Studio 2.x和Android Studio 3.x的依赖方式有很大不同,分别对应如下:
在这里插入图片描述
在这里插入图片描述
以下括号外对应的是2.x版本的依赖方式。,括号里对应的是3.0版本的依赖方式。
compile(implementation,api)——相应于Eclipse中libs下Jar包添加
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
implementation:该依赖方式所依赖的库不会传递,只会在当前module中生效。
api:该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下使用api依赖的库。
provided(compileOnly)——相应于Eclipse中lib下Jar包添加
只在编译时有效,不会参与打包
可以在自己的moudle中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。
Android_Studio下Jar包不同依赖方式的编译结果
对应Eclipse中lib和libs 中Jar包添加后编译结果如下:
在这里插入图片描述

三. 结论

在文章中总结了Eclipse编译Xposed Hook模块和Android Studio中编写时添加Jar包依赖库的不同之处。Android Studio更复杂和智能一些。
(1)Android Studio中Jar包Compile的依赖方式相当于Eclipse中的libs的libs下Jar包添加,这样会有一些Xposed库和系统库的冲突,所以Android Studio中不管是libs下Jar包还是lib下Jar包,都是申明以CompileOnly的方式依赖,就相当于Eclipse中把Jar包写在lib目录下。
(2)Android Studio中Jar包Compile的依赖方式和Eclipse中的libs下Jar包添加,都会编译到最终apk中,Android Studio中Jar包CompileOnly的依赖方式和Eclipse中的lib下Jar包添加,都不会编译到最终apk中。
如有读者阅读了,编写的有不对的地方,希望批评指正!DEMO代码链接:https://download.csdn.net/download/denny_chen_/11222659

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值