(图源Download Xposed Framework and Installer)
tl;dr
为了在毕设里加入语音控制,计划对系统语音助手进行动态注入以实现语音控制,技术选型为XPosed
。谁家自动化毕设代码要注入别的进程啊🤣👉
XPosed模块开发环境搭建
本文选用的是基于EzXHelper
+ DexKit
的开发环境。
一切的首先:Android studio创建工程。
在build.gradle.kts(app)
中添加以下依赖项:
1 2 3 4 5 6
| implementation("com.github.kyuubiran:EzXHelper:1.0.3") compileOnly("de.robv.android.xposed:api:82")
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) { BuildConfig.APPLICATION_ID -> { findMethod("com.example.package.MainActivity") { name == "isActive" && returnType == Boolean::class.java }.hookBefore { it.result = true } } "target.package.name" -> { } } } }
|
然后创建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
,保存!