如果你对 Xposed 有一定了解并可以熟悉使用 Xposed,同时你又是一名 具有 Android 开发经验 的 Programmer ,而你又对开发 Xposed 模块产生了兴趣但是又不知道该怎么做,下面的内容会告诉你如何在 Android Studio 上搭建 Xposed 模块的开发环境,即 Create New Xposed Module Project 时必须要做的事。
创建项目
Xposed 模块说到底也只是一个 apk 文件,也就是 Android Project,所以先 Create Android Project:
后面接着一路 Next 到后面选模板时选择 Empty Activity 然后其他什么都默认即可。
为了确保 Android Project 创建成功可以先安装到模拟器上试一下确保这个 App 可以正常运行:
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' 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>
<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" /> </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;
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
中。
然后将模块安装到模拟器上看看效果:
在 Xposed Installer 里面打勾后重启模拟器再启动看看:
Toast 显示的内容由 module not active
变成了 module is active
一般这样就可以来检测模块是否被激活。
如果觉得每次重启模拟器或者手机很麻烦可以使用 VirtualXposed (不支持模拟器、资源 Hook 和修改系统应用的模块)进行开发测试,具体教程参考 Utilities For Xposed Module Developer/VirtualXposed Wiki ,如果你还不了解什么是 VirtualXposed 可以看看这些文章:无需Root也能使用Xposed! 、在Android手机不进行刷机操作的情况下实现Xposed——VirtualXposed(小白篇) 。
参考资料