Xposed 开发之搭建开发环境

如果你对 Xposed 有一定了解并可以熟悉使用 Xposed,同时你又是一名 具有 Android 开发经验 的 Programmer ,而你又对开发 Xposed 模块产生了兴趣但是又不知道该怎么做,下面的内容会告诉你如何在 Android Studio 上搭建 Xposed 模块的开发环境,即 Create New Xposed Module Project 时必须要做的事。

创建项目

Xposed 模块说到底也只是一个 apk 文件,也就是 Android Project,所以先 Create Android Project:

create_project

后面接着一路 Next 到后面选模板时选择 Empty Activity 然后其他什么都默认即可。

为了确保 Android Project 创建成功可以先安装到模拟器上试一下确保这个 App 可以正常运行:

hello_world

Xposed 模块开发不支持 Instant Run,请在 File - Settings - Build, Execution, Deployment - Instant Run 找到 Enable Instant Run to hot swap code…. 并关闭这个开关!

添加依赖

下面开始做一些初始化工作。

build.gradle

在下面的 dependencies 里面添加 compileOnly 'de.robv.android.xposed:api:82' ,注意前面必须是 compileOnly ,具体参考 Using the Xposed Framework API

1
2
3
4
5
6
7
8
9
dependencies {
compileOnly 'de.robv.android.xposed:api:82' // 添加这一行且必须是 compileOnly
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

配置完了以后点击 Build - Make Project 让 Gradle 修改过的内容生效,如果是第一次配置会先下载 Xposed 的 jar 包。

也可以选择手动下载 jar 包然后添加到项目中。

AndroidManifest.xml

为了让 Xposed Installer 认为你的 App 是一个 Xposed 模块,你需要在 AndroidManifest.xml 中的 application 节点下添加以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<application
<!-- 省略 application 代码 -->
<activity android:name=".MainActivity">
<!-- 省略 activity 代码 -->
</activity>

<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="This is a Xposed Module Demo" /> <!-- 这里写模块描述 -->
<meta-data
android:name="xposedminversion"
android:value="82" /> <!-- 最低支持的API版本 -->
</application>

xposed_init

Project/app/src/main/ 下面创建 assets文件夹,然后在这个文件夹下面创建一个名为 xposed_init 的文件(没有任何后缀),里面先什么都不写,后面会用到。

编写代码

修改 MainActivity.java 里面的内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package me.zpp0196.xposed.demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, isModuleActive() ? "module is active" : "module not active", Toast.LENGTH_SHORT).show();
}

private boolean isModuleActive(){
return false;
}
}

在默认包目录下面新建一个 MainHook.java 参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package me.zpp0196.xposed.demo;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**
* Created by zpp0196 on 2018/6/23 0023.
*/
public class MainHook implements IXposedHookLoadPackage {

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName.equals(BuildConfig.APPLICATION_ID)) {
XposedHelpers.findAndHookMethod(MainActivity.class.getName(), lpparam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true));
}
}
}

然后在刚才创建的 xposed_init 文件里面添加这个类(入口类)的完全限定名:

1
me.zpp0196.xposed.demo.MainHook

如果开启了代码混淆记得将该类添加到 proguard-rules.pro 中。

然后将模块安装到模拟器上看看效果:

module_not_active

在 Xposed Installer 里面打勾后重启模拟器再启动看看:

module_active

Toast 显示的内容由 module not active 变成了 module is active 一般这样就可以来检测模块是否被激活。

如果觉得每次重启模拟器或者手机很麻烦可以使用 VirtualXposed (不支持模拟器、资源 Hook 和修改系统应用的模块)进行开发测试,具体教程参考 Utilities For Xposed Module Developer/VirtualXposed Wiki ,如果你还不了解什么是 VirtualXposed 可以看看这些文章:无需Root也能使用Xposed!在Android手机不进行刷机操作的情况下实现Xposed——VirtualXposed(小白篇)

参考资料