星星碎片收容所
把星星揉进面团里,用月光当裱花袋~


记第一次开发 Xposed 模块

Last modified on
, 多云

挺闲的,写个 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 后,可以看见该配置项被读取,证明这部分内容确实由「电池」应用控制。

开发环境

现成轮子这么多,真好(

  1. YukiHookAPI Project Builder 创建一个新项目

  2. 添加 DexKit 依赖

    = sweet-dependencies-config.yaml
    libraries:
      org.luckypray:
        dexkit:
          version: 2.0.4
      # ...
    // build.gradle
    dependencies {
    // ...
    implementation(org.luckypray.dexkit)
    }
  3. Android Studio 打开项目,等待 Gradle 同步完成

找 Hook 点

  1. jadx-gui 反编译 APK,找配置项

  2. 看看用例,找到需要 Hook 的方法

    查找用例
    找到 Getter
    其他地方均使用 Getter

    不难看出,当 q5.a.Q() == true 时,亮屏时间显示会被移除。

写代码

为了尽可能适配今后的版本,不要直接使用类名和方法名,而是使用 DexKit 模糊搜索。

  1. 找一个合适的 Class 匹配点:

    .source 就够了
  2. 再找一个合适的 Method 匹配点:

    usingString 的 callerMethod
    大概确认一下唯一性
  3. 写代码:

    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

效果

Result
Result