警告:本文提及的部分步骤要求手机具有root权限。若不执行这些步骤,则最终效果或许不理想。而获取root权限可能会导致被微信封禁(参见此处),也可能会对手机造成不可逆的影响。若无相关经验,强烈建议要获取root权限

背景

与苹果相比,Android的一大缺点是缺少统一且强制的推送平台。苹果有着Apple推送通知服务,而Android则依赖于各个厂商的推送服务。Google虽有自己的Firebase Cloud Messaging(FCM),但并未强制要求接入;国行设备若要使用完整的Google Play服务,则需花上不少功夫。国内亦成立了统一推送工作委员会,但进展似乎不甚顺利,且国外软件显然不会接入。部分软件甚至未接入任何推送服务,只能依靠后台常驻来接收消息。在国内的软件环境下,Android的推送服务显得十分混乱。

QQ在Google Play上的版本停滞在了2020年,且并未接入FCM;但好在其国内版于2022年陆续接入了各厂商的推送服务,能够实现无后台运行的推送。同属腾讯旗下的微信却桀骜不驯,没有接入任何一家国内厂商的推送服务。不过,企业微信可以接入小米等厂商的推送,说明应该不是技术问题所致。先前我也尝试过将微信常驻在后台,但其不仅会创建众多唤醒锁,消耗大量电量,而且还会频繁获取身体运动等数据,让我感到僭越。而微信Google Play版中接入了FCM,但先前使用FCM的要求比较苛刻,甚至需要设备的IP属地位于国外;直至2025年3月,其才为中国大陆的用户激活FCM推送功能,且FCM推送要求降低了不少。

Google Play服务

首先需要启用Google的基础服务。以小米的HyperOS为例,进入设置 > 更多设置 > 账号与同步 > 谷歌基础服务,将选项启用即可。部分厂商的手机可能需要自行安装Google三件套,或可参考此篇教程。或者,也可使用开源的microG方案。

其次要让Google Play服务常驻后台。我使用了HyperCeiler模块(需root),在其「电量与性能」选项中,勾选了「使Millet更保守」以及「允许Google Play服务在任何时间联网」。如果没有root,根据V2EX上的说法,可以安装Gboard,并将之设置为默认输入法,这样Google Play服务就会常驻后台。

最后,国行的Google Play服务或存在限制。根据V2EX上的讨论,国行手机的Google Play服务若无法连接Google,则会直接掐断网络连接。因此可在root后刷入Unlock CN GMS模块,解除相应限制。

微信

微信建议从Google Play安装。在我的测试条件下,新版微信似乎无需代理,直连即可注册FCM推送。若观察到/data/data/com.tencent.mm/shared_prefs目录中出现了com.google.android.gms.appid.xml文件,则表明其已注册FCM推送。将微信进程完全杀死后,可试着向本机发送测试消息,然后在本机的拨号界面输入*#*#426#*#*,查看调试界面中是否出现了com.tencent.mm相关字样。

若与Google Play服务器连接正常,但仍未在调试界面中看到相应消息,则可能是微信的FCM注册失效。我发现在启用了微信的「深度清理」时,若清除了缓存的「其他」类别,则会导致这种情况。此时可以尝试删除/data/data/com.tencent.mm/no_backup目录下的com.google.android.gms.appid-no-backupcom.google.InstanceId.properties文件,然后重启微信数次,直至相应文件重新生成为止。

此外,若通过FCM推送,则Google Play服务需要唤醒微信以推送消息。为了让微信不常驻后台,应关闭其自启动权限。在这种情况下,由于国内Android系统较为激进的进程管理策略,可能会出现无法唤醒目标应用的问题。为此,可以在root后刷入fcmfix模块,其功能是让FCM唤醒已完全停止的应用。若微信仍无法唤醒,可启用模块中「目标无响应时代发提示通知」。

FCM从接收消息到唤醒微信的流程;由于我将Google Play服务添加至了fcmfix的作用域,故日志中出现了该模块的相关信息

除此之外,也可以尝试Thanox中的「微信代收」功能。但本人并未尝试过该功能,不确定效果如何。

Thanox的微信代收功能

后记

通过上述步骤,微信就可以使用FCM推送了。就主观感受而言,FCM推送更省电。不过消息推送有时会出现延迟,从几十秒到数分钟不等;同时,可能由于微信冷启动较慢,前几条消息的推送有一定概率无法收到。这对我来说影响不大,如果别人真有急事,那么可以直接打电话;如果只是闲聊,那么等一会儿也无妨。但是如果非常注重消息推送的及时性,或许还是需要让微信常驻后台。甚至,关闭微信的推送功能,乃至不使用微信,抑或是转投苹果阵营,也能从根源上解决问题🐶。