XPosed模块开发踩坑

img
(图源Download Xposed Framework and Installer)

tl;dr

为了在毕设里加入语音控制,计划对系统语音助手进行动态注入以实现语音控制,技术选型为XPosed谁家自动化毕设代码要注入别的进程啊🤣👉

XPosed模块开发环境搭建

本文选用的是基于EzXHelper + DexKit的开发环境。

一切的首先:Android studio创建工程。
build.gradle.kts(app)中添加以下依赖项:

1
2
3
4
5
6
// EzX Helper  
implementation("com.github.kyuubiran:EzXHelper:1.0.3")
compileOnly("de.robv.android.xposed:api:82")

// Dex Kit
implementation("org.luckypray:dexkit:2.0.0")

settings.gradle.kts中的dependencyResolutionManagement添加以下两个仓库:

1
2
maven(url = "https://jitpack.io")  
maven(url = "https://api.xposed.info")

AndroidManifest.xml中的application节点中添加以下键值以能在LSPosed中显示模块信息:

1
2
3
4
5
6
7
8
9
10
11
12
<meta-data  
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="@string/xposeddescription" /> <!--这是在模块名称下面的小字-->
<meta-data
android:name="xposedminversion"
android:value="93" />
<meta-data
android:name="xposedscope"
android:resource="@array/xposed_scope" /><!--作用域-->

其中作用域的xml文件这么填(一行一个包名):

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>  
<resources>
<string-array name="xposed_scope">
<item>com.android.launcher3</item>
</string-array>
</resources>

创建xposed的主hook类(我创建在com.example.package下,叫HookEntry.kt):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class HookEntry : IXposedHookLoadPackage, IXposedHookZygoteInit {  

override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam) {
EzXHelperInit.initZygote(startupParam)
}

override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
val packageName: String = lpparam.packageName
EzXHelperInit.initHandleLoadPackage(lpparam)

when (packageName) {
// 修改模块激活状态, 这里需要你的MainActivity下有一个叫isActive的函数, 并且是调用就直接返回false的。在激活模块后,下面的hook代码会让它返回true以实现让它知道模块激活了。
BuildConfig.APPLICATION_ID -> {
findMethod("com.example.package.MainActivity") {
name == "isActive" && returnType == Boolean::class.java
}.hookBefore {
it.result = true
}
}
"target.package.name" -> {/* your hook code here */ }
}
}
}

然后创建assets文件夹,里面创建xposed_init文件,写入上面那个类文件的包名:

1
com.example.package.HookEntry

这里不需要管扩展名,不用像在java里调用kotlin需要写HookEntryKt.xxx一样

提示duplicated class怎么办

gradle.properties里确保添加了以下两行:

1
2
android.useAndroidX=true
android.enableJetifier=true

LSPosed提示关闭部署优化,怎么操作

Android studio左上角三横 - Run - Edit Configurations... - 取消勾选Always install with package manager,保存!


XPosed模块开发踩坑
http://blog.coolenoch.ink/2024/03/30/14-XPosed模块开发踩坑-240330/
作者
CoolestEnoch
发布于
2024年3月30日
许可协议