欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用Android Studio编写Xposed hook模块

程序员文章站 2022-05-12 14:02:35
...

一.前言

过去用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版本)。附图如下:
用Android Studio编写Xposed hook模块
build.gradle中dependencies中会自动添加下面一项内容:
用Android Studio编写Xposed hook模块
之后,安装apk模块到安卓手机,然后Xposed Installer中选择该模块,重启即可。

3)记录一下Android Studio中Jar包的依赖方式
不同的依赖方式会对应Eclipse中的lib中Jar包添加和libs中Jar包添加。Android Studio 2.x和Android Studio 3.x的依赖方式有很大不同,分别对应如下:
用Android Studio编写Xposed hook模块
用Android Studio编写Xposed hook模块
以下括号外对应的是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编写Xposed hook模块
对应Eclipse中lib和libs 中Jar包添加后编译结果如下:
用Android Studio编写Xposed hook模块

三. 结论

在文章中总结了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