挺闲的,写个 Xposed (LSPosed) 模块玩玩。
刚好之前写过一个 Magisk 模块,用于恢复一加 13T 移除的亮屏时间显示,不妨改写试试。
前期准备
简单看看系统设置,不难发现整个电池页面显示由 com.oplus.battery
即「电池」应用负责。
其配置项由 /my_product/etc/extension/com.oplus.app-feature.xml
提供:
<app_feature name="com.oplus.battery.phoneusage.screenon.hide" args="boolean:true"/>
反编译 APK 后,可以看见该配置项被读取,证明这部分内容确实由「电池」应用控制。
开发环境
现成轮子这么多,真好(
- 用
YukiHookAPI Project Builder
创建一个新项目
- 添加
DexKit
依赖
# sweet-dependencies-config.yaml
libraries:
org.luckypray:
dexkit:
version: 2.0.4
# ...
// build.gradle
dependencies {
// ...
implementation(org.luckypray.dexkit)
}
- Android Studio 打开项目,等待 Gradle 同步完成
找 Hook 点
- jadx-gui 反编译 APK,找配置项
- 看看用例,找到需要 Hook 的方法
查找用例
找到 Getter
其他地方均使用 Getter
不难看出,当 q5.a.Q() == true
时,亮屏时间显示会被移除。
写代码
为了尽可能适配今后的版本,不要直接使用类名和方法名,而是使用 DexKit 模糊搜索。
- 找一个合适的 Class 匹配点:
.source 就够了
- 再找一个合适的 Method 匹配点:
usingString 的 callerMethod
大概确认一下唯一性
- 写代码:
override fun onHook() = encase {
System.loadLibrary("dexkit") // 加载 DexKit 库
loadApp("com.oplus.battery") {
DexKitBridge.create(this.appInfo.sourceDir).use {
it.findClass {
matcher {
source("AppFeature.java") // 用 .source 匹配
}
}.findMethod {
matcher {
callerMethods {
add {
usingStrings("PhoneUsageTime") // 用 usingStrings 匹配
}
}
}
}.singleOrNull()?.also {
it.className.toClass().method{ name = it.methodName }.hook {
replaceToFalse() // 替换为 false
}
}
}
}
}
测试
LSPosed 模块,需要禁用 Android Studio 的部署优化,或者直接使用 installDebug
命令安装,否则无法成功更新。
./gradlew installDebug
效果

