【Xposed】记一次安卓app反编译和编写Xposed模块的过程
用了MIUI很多年,息屏功能给的实在太保守,要么在午睡、半夜想瞅一眼时间却发现息屏早被自动关闭,要手动开屏。要么就是在某敞亮的环境下有时息屏时钟暗到没法看。
找来找去,始终没有息屏功能的magisk或xposed模块,遂借着自己不多的Java知识进行反编译、分析源码和编写Hook万象息屏,解决以上两个问题
反编译万象息屏
在MIUI系统上,息屏功能是由系统内置的万象息屏app提供
app没有加固,那么反编译就只需要拖到Jadx工具,得到万象息屏的源码
根据日志寻找调节亮度的函数入口
此先用手机连接电脑,用Android Studio看看锁屏时有没有日志输出
在息屏状态下,使用手电筒照射屏幕,此时屏幕的息屏时钟亮度变高,同时捕捉到关键日志
Doze setDozeScreenBrightness:8191
看名字就是调整亮度,再把手机光线传感器遮住,等时钟暗下来,捕捉到的日志
Doze setDozeScreenBrightness:1
通过测试,亮度值只有8191和1,也就是息屏时钟只有两档(暗光档和亮光档)
查看源码,确实是调整亮度的代码,但是这里不能直接Hook该方法,因为setDozeScreenBrightness继承自com.miui.aod.services.WrappedDreamService和com.miui.aod.doze.DozeMachine.Service
实际测试下来不管用,原因是方法里有很多条件会改变亮度
这里直接找到父类com.miui.aod.services.WrappedDreamService类,类里有setDozeScreenBrightness方法直接控制亮度的显示。
为此我们只需要固定传递给setDozeScreenBrightness方法的值为8191即可(实际不为1即可)
寻找控制关闭时钟的函数入口
由于熄灭时日志输出太多,而且息屏时钟关闭时也会调有调用控制亮度的方法,所以索性在代码里猜测可能的名称(timeout、off、close等),把相关方法看一遍
最终定位到com.miui.aod.doze.MiuiDozeScreenBrightnessController类下onOffTimeout这个可疑方法
定位到onOffTimeout,内部调用checkToScreenOff,checkToScreenOf方法里写了一系列状态检查和条件判断,去决定屏幕是否关闭
为此我们要保持屏幕常亮只需要阻止onOffTimeout被调用即可
编写代码
保持常亮
固定亮度为亮光档
最后编译、安装,测试Hook的方法都对,再签名、发布正式包,提交到Xposed models仓库
Xposed仓库地址:固定万象息屏亮度 | MIUI万象息屏永不熄灭
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭