用了MIUI很多年,息屏功能给的实在太保守,要么在午睡、半夜想瞅一眼时间却发现息屏早被自动关闭,要手动开屏。要么就是在某敞亮的环境下有时息屏时钟暗到没法看。
找来找去,始终没有息屏功能的magisk或xposed模块,遂借着自己不多的Java知识进行反编译、分析源码和编写Hook万象息屏,解决以上两个问题

反编译万象息屏

在MIUI系统上,息屏功能是由系统内置的万象息屏app提供

万象息屏-信息查看.jpg

app没有加固,那么反编译就只需要拖到Jadx工具,得到万象息屏的源码

2025-03-22 16 46 35.png

根据日志寻找调节亮度的函数入口

此先用手机连接电脑,用Android Studio看看锁屏时有没有日志输出

在息屏状态下,使用手电筒照射屏幕,此时屏幕的息屏时钟亮度变高,同时捕捉到关键日志

Doze setDozeScreenBrightness:8191

看名字就是调整亮度,再把手机光线传感器遮住,等时钟暗下来,捕捉到的日志

Doze setDozeScreenBrightness:1

通过测试,亮度值只有8191和1,也就是息屏时钟只有两档(暗光档和亮光档)

2025-03-22 16 51 03.png

查看源码,确实是调整亮度的代码,但是这里不能直接Hook该方法,因为setDozeScreenBrightness继承自com.miui.aod.services.WrappedDreamService和com.miui.aod.doze.DozeMachine.Service
实际测试下来不管用,原因是方法里有很多条件会改变亮度

2025-03-22 17 07 05.png

这里直接找到父类com.miui.aod.services.WrappedDreamService类,类里有setDozeScreenBrightness方法直接控制亮度的显示。
为此我们只需要固定传递给setDozeScreenBrightness方法的值为8191即可(实际不为1即可)

2025-03-22 17 15 33.png

寻找控制关闭时钟的函数入口

由于熄灭时日志输出太多,而且息屏时钟关闭时也会调有调用控制亮度的方法,所以索性在代码里猜测可能的名称(timeout、off、close等),把相关方法看一遍

最终定位到com.miui.aod.doze.MiuiDozeScreenBrightnessController类下onOffTimeout这个可疑方法

2025-03-22 17 39 16.png

定位到onOffTimeout,内部调用checkToScreenOff,checkToScreenOf方法里写了一系列状态检查和条件判断,去决定屏幕是否关闭

为此我们要保持屏幕常亮只需要阻止onOffTimeout被调用即可

2025-03-22 17 21 01.png

编写代码

保持常亮

2025-03-22 17 47 40.png

固定亮度为亮光档

2025-03-22 17 50 51.png

最后编译、安装,测试Hook的方法都对,再签名、发布正式包,提交到Xposed models仓库

Xposed仓库地址:固定万象息屏亮度 | MIUI万象息屏永不熄灭

安装运行.jpg