修改 MIUI / HyperOS 的时钟小部件大小

经验

我一直都不太喜欢现在的手机系统,所以很少折腾 Android 相关的东西。 直到最近换了部手机,现在萌生了一点点兴趣。 然而,Android 系统以及国内的各种 ROM 变得越来越封闭,不 root 可以折腾的东西是越来越少。

这篇博客小折腾一下,以官方提供的方式改掉我用着最不爽的一点,那就是小米自己整的小部件(MAML Widget) 的时钟部件的大小问题。 简单来说,就是部件的大小是 2x4 的,但是它实际内容只用了一半,剩下的一半只能空着。 于是我希望通过修改源码实现一个 2x2 的时钟,但不改变其样式。

拢共分三步,第一步,打开冰箱门……

什么是小部件

我的理解是小米给 Android 原生小组件包装了一层,提供了一些常用的功能, 不用碰 Java 只需要写 XML 就能实现他们自己的 MIUI 小部件, 降低了开发的门槛,并企图把小部件变成类似主题的一种设计师也能做的东西。

我之前用小米手机都是默认主题,这次也是第一次了解到它的主题相关的政策。 早先的小米主题是要收钱的,我觉得这没甚么问题挺好的,尊重设计师的劳动成果。 但是从某个版本开始不知道哪个产品经理开始抽风,将所有主题变成免费的, 变为将新推出的小部件功能全部收费。

现在我感觉 MIUI 的小部件做得非常混乱。在添加小部件的页面混合着官方和第三方设计师的作品, 还给做成了一个拉不到底的瀑布流。 虽然原来的原生小组件也是能用的,不过入口不是很好找。

当然,安装其他设计师从头设计的小部件肯定是能满足我的需求的,不过我觉得 MIUI 自带的就挺好的了, 改改大小对我来说就足够了。

1 提取原始部件

下载 ROM

MIUI 用户折腾系统的氛围还算浓厚,到处都能找到对应机型的 ROM 包,比如 MIUIROM 或者 HyperOS.fans

从 payload.bin 提取 img

下载好后解压,得到的是一个 payload.bin 文件,这跟我之前的经验不太一样了。 于是找了一下,发现需要 payload-dumper-go 这个软件可以提取而且用的人比较多。

这里只需要里面的 product.img, 可以用 -p 指定特定的分区。不然全部导出感觉还是挺慢的。 我不太知道这种格式具体怎么存的,经过这次我才知道怪不得更新系统下载完之后提取文件要等这么久。

从 img 中找出 mtz 文件

这里需要另一个工具 extract.erofs,仓库在这里。 到提取出来的 product 目录下查找 mtz 文件,可以找到

media/theme/MILanProVF.mtz
media/theme/default/gadgets/calculator.mtz
media/theme/default/gadgets/clock_classical.mtz
media/theme/default/gadgets/notes.mtz
media/theme/default/gadgets/weather_4x1.mtz
media/theme/default/gadgets/weather_4x4.mtz
media/theme/default/maml/maml_clock_4x2.mtz
media/theme/default/maml/maml_clock_4x2_new.mtz
media/theme/default/maml/maml_clock_4x2_v3.mtz
media/theme/default/maml/maml_weather_2x2.mtz
media/theme/default/maml/maml_weather_2x2_new.mtz
media/theme/default.mtz

mtz 是小米主题、字体、小部件相关的存储格式。

2 修改大小

安装小部件编辑器

为了方便开发,小米推出了小部件编辑器,不过不知道为什么这里我导入官方的小部件进去发现并不能正常显示。 于是这次只用到它的导入导出功能。

导入 mtz

导入 mtz 之后,编辑器会创建一个 Widgets 目录,这里面的同名目录就是 mtz 解压缩后的东西,也就是当前 打开的这个项目。在尺寸这里新建一个 2x2,对应项目目录下也就多了一个2x2目录。 之后我就不太需要这软件的编辑功能了。

修改源代码

从源码里可以看到这次 MIUI 改名 HyperOS 感觉也不是早就计划好的,代码里面还是 MIUI 15 来着。

我的修改感觉上就非常简单,因此并没有去学它的 XML 到底该怎么写。

这里可以看到

    <DateTime name="clock" x="5" y="0" color="@color" size="58*#scale*#adaptive" formatExp="ifelse(#time_format,'HH:mm','h:mm')" fontFamily="mipro-normal" contentDescriptionFormatExp="eval(@talkback_time)" _id="m54vdoqa">

有一行似乎定义了显示时间的文字,字体的大小用了一些变量进行了缩放。

<Var name="adaptive" expression="min(min(#view_width/474,500/400),1)" _id="tqk1wn7g"/>

在上面这里找到变量的定义,其中的 474 就是我把原来的 948 除了一下,不然文字会比较小。

这就完成了,虽然编辑器不知道为什么显示不全,但我知道大概用着没甚么问题。

从编辑器可以把修改后的项目导出成 mtz,接下来就是装到手机上。

操作文件也是我最讨厌 Android 的地方,这玩意一直给我一种我没法很方便地管理我自己手机上的文件的感觉。 比如我在某个应用里做了一些操作,按理说应该会生成一些文件,但我很难知道这些文件具体有哪些,到底在哪里, 感觉整个人被蒙在鼓里。 Android 14 之后更加恶心了,连 Android/data 目录都没办法普通地访问了。

3 安装回手机

想通过文件安装比较困难,因为并不知道该放到哪里才有用。还好官方提供了给设计师安装到手机的工具。 申请小米设计师还是挺麻烦的,需要写个申请,展示好几套个人作品和身份证。 但我并不需要上传主题和小部件,所以不需要设计师账号,只用工具就行了。

通过小米设计师工具安装

https://zhuti.designer.xiaomi.com/docs/widgetPage/guide/ 在这里能找到小部件的最新文档。 最坑的地方就是这里,搜索引擎搜到的都是去年或者前年的过时文档。 谁能想到最新的文档是在飞书上更新的呢?

里面有一个最近更新的 APK,安装上去会覆盖原来的 智能助理 (com.miui.personalassistant) 。 文档里写得很清楚了,安装后就一个功能,导入 mtz 文件就行了。

之后可以卸载更新再装回原来的智能助理,桌面上的修改后的部件不会掉, 不过其他数据都丢了,要重新配置一下其他的小部件。

于是我至今不知道我的小部件到底装到哪里了,为什么不会掉?这简直太让我难受了。

用起来怎么样

实际并不是完美的,我发现默认的时钟小部件可以让状态栏不显示时间,我这个不行。 而且也不能自动隐藏名字,我只好隐藏所有小部件的名字。

不过终于把空出来的一半空间用上了。

使用效果图

总结

初步尝试了 MIUI / HyperOS 的小部件的开发(其实也不能算是开发了,我基本上什么都没写), 验证了自己开发小部件的可行性。

其实我本来计划是把这个时钟和天气合二为一,看了下天气的代码比较复杂就放弃了。 虽然感觉开发体验不怎么样,但如果有人真的愿意折腾感觉还是能做出很多有意思的东西。 不过我就算了,修改个大小已经知足了。