荣耀 MagicOS「软件更新」(com.hihonor.ouc)的 Xposed 模块。把被隐藏的本地更新入口恢复出来,并按需屏蔽新版本提示、强制向服务器请求全量包。
| 功能 | 说明 |
|---|---|
| 本地更新入口 | 在「软件更新」的三点菜单里恢复本地安装包入口 |
| 屏蔽新版本提示 | 检查更新时压成「无新版本」,不再提示升级 |
| 强制全量包 | 向服务器请求完整包,而不是增量包 |
两个开关的相互关系:
- 「屏蔽更新」与「强制全量包」互斥。打开「强制全量包」时「屏蔽更新」不生效,设置页会在旁边提示「已被强制全量包覆盖」。
- 设计上不在程序里偷偷改写另一个开关,避免出现「是谁把开关关掉的」这种难以追溯的状态。
- LSPosed,且框架需支持 libxposed API 102(模块声明
minApiVersion=101、targetApiVersion=102) - root(原因见下一节)
- 作用域:
com.hihonor.ouc(「软件更新」)
关于框架版本:
LSPosed/LSPosed官方仓库的安装包停留在较早的版本,未必支持 API 102。若模块在 LSPosed 中不显示或无法启用,请先确认框架是否支持 libxposed 102。
模块的开关配置存在 /data/local_ota/module_switch.conf,这个目录的 SELinux 标签是 local_ota_file。
从系统策略里能查到,允许访问该标签的域只有四个:adbd、platform_app_all、shell、update_engine。
- 「软件更新」自身跑在
platform_app_all域,本来就能读写,所以 hook 侧不需要额外权限 - 模块的设置页跑在
untrusted_app域,不在放行名单里,连读取属性都不允许,因此必须通过su访问
没有 root 时,设置页会显示「root 不可用,开关无法保存」,而不会静默失败。
- 安装 APK
- 在 LSPosed 中启用本模块
- 作用域勾选「软件更新」
- 重启手机,或强制停止「软件更新」
- 打开模块设置页,确认显示「root 可用」以及两个开关的状态
- 把全量包复制到
/data/local_ota/ - 文件名必须包含
update_full_(系统用.*update_full_.*\.zip做全串匹配,名字不含这段就永远扫不到) - 该分区剩余空间需不少于 30 GiB,否则系统会静默跳过
- 打开「软件更新」→ 三点菜单 → 本地更新
在荣耀 AAK-AN00(MagicOS 11 / Android 17)上测试通过,对应「软件更新」版本 2.1.1.1(versionCode 205)。
不同机型、不同系统版本的「软件更新」类名与结构可能不同,模块按上述版本实现,未覆盖的情况可能不生效。
- 修改系统更新行为可能导致错过安全补丁,请自行权衡
- 强制全量包会增加流量与存储占用
- 本地更新会绕过正常的版本校验流程,请确认包来源可靠
AGPL-3.0,详见 LICENSE。