我是靠谱客的博主 潇洒黑猫,这篇文章主要介绍用Android Studio编写Xposed hook模块一.前言二.Android Studio编写Xposede的步骤三. 结论,现在分享给大家,希望可以做个参考。

一.前言

过去用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 块中加上三个元数据,如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
<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有点不同后面再记录,

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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中的方法,如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

最后

以上就是潇洒黑猫最近收集整理的关于用Android Studio编写Xposed hook模块一.前言二.Android Studio编写Xposede的步骤三. 结论的全部内容,更多相关用Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部