(图源Download Xposed Framework and Installer)
tl;dr为了在毕设里加入语音控制,计划对系统语音助手进行动态注入以实现语音控制,技术选型为XPosed。谁家自动化毕设代码要注入别的进程啊🤣👉
XPosed模块开发环境搭建本文选用的是基于EzXHelper + DexKit的开发环境。
一切的首先:Android studio创建工程。在build.gradle.kts(app)中添加以下依赖项:
123456// 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添加以下两个仓库:
12maven(url = "https://jitpack.io") maven(url = "https://api.xposed.info")
在AndroidManifest.xml中的application节点中添加以下键值以能在LSPosed中显示模块信息:
123456789101112
其中作用域的xml文件这么填(一行一个包名):
123456
创建xposed的主hook类(我创建在com.example.package下,叫HookEntry.kt):
1234567891011121314151617181920212223class 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文件,写入上面那个类文件的包名:
1com.example.package.HookEntry
这里不需要管扩展名,不用像在java里调用kotlin需要写HookEntryKt.xxx一样
提示duplicated class怎么办在gradle.properties里确保添加了以下两行:
12android.useAndroidX=trueandroid.enableJetifier=true
LSPosed提示关闭部署优化,怎么操作Android studio左上角三横 - Run - Edit Configurations... - 勾选Always install with package manager,保存!