用Android Studio编写Xposed hook模块
一.前言
过去用Eclipse写过很多Xposed hook模块,并有一定的封装,这几天临时用到Android Studio编写Xposed模块遇到一些坑,现在做一个笔记。
二.Android Studio编写Xposede的步骤
书写过程中,没有特定的步骤,只是按照个人习惯,将需要做到的几点记录下来。
- 在安卓手机中安装好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;
- 打开AS,然后创建一个工程,可带Activity(测试时可用Xposed模块直接hook这个Activity中的函数进行hook,就不用另写一个工程),也可不带(正式写Xposed时,一般不带会好看些,不过也看个人习惯);
- 之后的和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这些使用者常用的库,避免冲突。
对应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