
我最近重新理解了"官方不支持"这句话。
过去它的意思是,这件事到此为止。你的手机没有这个功能,不会有开发者为一个人去适配,你顶多去论坛问一圈,最后接受一个将就的方案。
这次轮到我碰上了。我日常带的手机是 Mate 60,系统鸿蒙 6,场景非常具体,我出门、回家,手机能自动告诉家里的 Home Assistant(我用的智能家居平台,灯、空调都挂在它下面)我在哪。到家灯亮,离家空调关。
这个功能在普通安卓手机上装个 HA 官方 App 就有。我这台 Mate 60 上,官方路径得处理两个问题。HA 没有鸿蒙原生版。安卓版倒是可以丢进鸿蒙 6 的卓易通兼容层里跑,但那个容器拿不到后台定位,进程说清掉就清掉,没有系统替它唤醒这回事。装上了也满足不了我们要的能力。这就是我碰上的"官方不支持"。
搁以前,这种问题只有一个出路,等不到官方,不值得找人,自己忍。
第一条路,App 都做完了才发现系统不给保证
最早我在鸿蒙 6 上自己写了一个打点 App,持续拿位置,按策略用 HTTPS 传给 Home Assistant。开发、调试、签名、装进 Mate 60,真机 53 项测试全过,HA 那边的设备时间戳确实更新过。App 层面,这活干完了。
坑是 App 都做完之后才发现的。AI 把鸿蒙的后台机制翻了个遍,翻出来一个挺扫兴的结论,鸿蒙 6 对第三方应用没有"位置变化时系统负责把它叫醒"这种保证。平时跑得好好的,进程被系统回收、从最近任务里划掉、重启之后,一个不在了的进程救不回自己,和前面一样的问题。
补丁方案也不是没有,比如让服务器盯着,发现位置超时了就发推送把手机叫回来。可一个本地定位能力要靠云端盯着它失联,性质就变了。所以这个项目我停了。定位我做出来了,我要停的是把"能跑、但会无声失效"包装成可靠产品。
想到换手机,又觉得不值
为了让安卓 App 跑在真实的系统环境里而不是兼容层沙箱里,我把系统降回鸿蒙 4.2。到这一步算盘很简单,安卓上有 Home Assistant 官方客户端,成熟的 App,装上就能用。
装完启动就直接卡在 UI 上了。查下来才知道,HA 安卓版最关键的位置能力建在 Google Play 服务上,而我们没有 Google。
但是 HA 做的是全球用户的生意,大家的手机都有 Google 服务,凭什么单独养一个华为版?华为自己也不会跑去给 HA 提这个 PR。没人会做,这很合理。
合理的另一边是,这事走到这就该结束了。我甚至认真想过换一台手机。算了算,为家里这点自动化换一台手机,这个账怎么算都不对。
换手机的账算不平,就只能回到这个 App 上想办法。我盯着它看了一会,它也就取位置和地理围栏这两块用到 Google,为什么不能只换这一块?
只换最窄的一块
研究下来,可行。HA 安卓版用的是 Google 的定位和围栏接口,华为的 HMS 有对应的整套能力,接口形状很像。上游的后台逻辑、位置上报、服务端集成全部保留,只替换调用 Google 服务的那一块。不造新车,只换一套在这台车上能用的定位系统。
我是研发,这个活我"会做"。但会做和值得做是两回事。放在以前,真要自己动,得先把安卓构建环境搭起来,让一个成熟的开源大项目的基础构建流程在本地跑通,再去几十万行源码里读明白 Google 服务从哪些口子进来,改完还得管签名打包。一行修改之前,先烧掉大量时间。一个只想让自己手机上报位置的人,没有理由去维护一座软件工厂。
现在不用我来熬这个时间。需求说得清,我把设备和材料给到位,剩下的它来干。几十万行我从没碰过的代码,它把 Google 服务的入口一家家找出来,弄明白每个构建版本管什么、哪些文件碰不得,照着 HMS 的文档把替换代码写进一个新建的构建分支。构建、签名、装机报错,一条条过。
它替不了的还是拍板。要不要做"华为版 Home Assistant",还是只换一块?做到什么程度算完?这些得我自己拿主意。
划掉 App 之后,还收不收得到位置
APK 构建成功,装进了手机。我不需要让 App 常开,从最近任务划掉、锁屏、后台,只看 Home Assistant 里那个位置时间戳有没有一直在走。
划掉,照样收得到。回家开灯、离家关空调两个自动化,真的跑起来了。
为什么划掉了还能收到?安卓的地理围栏注册本来就由系统持有,HMS 把它实现在系统层。App 进程在不在,不影响围栏触发。位置事件来了,系统把 App 短暂拉起来,交完作业,再退下。第一条路卡死的那个"谁来叫醒它",在这条路上不是问题。
到这里,它是个换对了地基的顺利故事。然后它过了两天又给我来了一下,HA 里近 20 个小时没有新位置。查下来,围栏注册还在,这回是华为的电源管理把 App 冻住了。系统一直在给每个 App 打分,分低了,连叫醒它的那条路一起冻。把华为的应用启动管理、耗电管理、系统电池优化这三处全放开,再观察,两个小时里收到 94 条上报,没再断过,还实测了一次离家,公共区的灯和空调按预期关了。
回头看,这件事的可靠性是两样东西叠出来的。围栏管进程不在了谁来叫醒我,设置管叫醒我的那条路别被冻住。缺一样,剩下的就是"能跑,但会无声失效"。
写在最后
要是放在以前,这件事到"官方不支持"那一步就妥协了,顶多偶尔想起来膈应一下。
AI 给普通人带来的实际改变,跟"人人都能开产品公司"没什么关系。落到我自己的手机上,就是划掉 App,回家灯自己亮,离家空调自己关。忍了很久的这点小问题,真的给我改掉了。