跳转至

Pixel 5 的 VoLTE 又坏了:一次 IMS 故障排查记录#

去年我写过一篇 Google Pixel 5 开启 VoLTE 实录,记录了自己给 Pixel 5 开启国内 VoLTE 的过程。

最近重置手机之后,我又重新配置了一遍 Root 环境。

本来以为把以前用的模块重新装回去就完事了,结果重启之后却发现:

VoLTE 又寄了。

进入 *#*#4636#*#* 查看状态,IMS 一直没有注册。

问题是——我之前同样用过 APatch,同样装这个 VoLTE 模块,当时明明一点问题都没有。

于是就有了这次折腾。


一开始,我以为只是 IMS 配置坏了#

我的设备还是那台 Pixel 5,运营商是中国移动。

手机本身可以正常连接 LTE,移动数据也完全正常,所以显然不是 SIM 卡没识别或者基站没信号。

先看了一下 CarrierConfig:

dumpsys carrier_config | grep -i volte

结果里面有:

carrier_volte_available_bool = false
carrier_volte_provisioned_bool = false

第一眼看到这里,我还挺激动:

抓到了,不就是 CarrierConfig 没加载对吗?

但继续排查之后,事情没这么简单。

系统里的 Qualcomm IMS 服务其实正常存在:

pm list packages | grep -i ims

能找到:

org.codeaurora.ims
com.android.service.ims
...

正在运行的服务里也能看到:

org.codeaurora.ims/.ImsService

所以 IMS 组件并没有丢。


真正有用的线索来自 Radio Log#

既然 Android 这一层看不出明显问题,那就继续往 modem 方向查。

抓取 Radio Log:

logcat -b radio -d | grep -iE "ims|volte|mbn"

其中有一段让我开始觉得不对劲:

GRIL-Q : MODEM: [GRPT][IMS Config] EFS-Ver.:0, VoLTE:Y, VT:Y, VoWiFi:WFC Disabled, CallPref:Cellular preferred, RTT:NA.

GRIL-Q : MODEM: [GRPT][IMS Config] OMA-DMServiceMask: 0x0, SERVICE_ENABLE:N, VOLTE_ENABLE:N, VT_ENABLE:N, PRESENCE_ENABLE:N, VOWIFI_ENABLE:N

意思很直接:

modem 支持 VoLTE,但当前配置并没有把 VoLTE 打开。

接着又看到了:

GRIL-Q : MODEM: [GRPT][MBN] WildCard, sub[0]
GRIL-Q : MODEM: [GRPT][MBN] SW_DEFAULT, sub[1]

MBN 可以简单理解为高通 modem 针对不同地区、运营商准备的一套配置。

而这里加载的是 WildCard,也就是通用配置。

这就奇怪了。

因为我安装的 VoLTE 模块明明就是靠补充 MBN 配置来支持国内运营商的。


模块里明明有 China,系统里却没有#

于是我去看了一下手机当前真正能看到的 MBN:

ls /vendor/rfs/msm/mpss/readonly/vendor/mbn/mcfg_sw/generic/Pixel

结果:

APAC
AUNZ
EU
MEA
NA
PTCRB
SEA
TestSIM
common

没有:

China

再看看 VoLTE 模块里面:

ls /data/adb/modules/Pixel5VolteVoWiFi/vendor/rfs/msm/mpss/readonly/vendor/mbn/mcfg_sw/generic/Pixel

结果却是:

AF
APAC
AUNZ
China
EU
Korea
LATAM
MEA
NA
Russia
SA
SEA
Test
common

这下就有意思了。

模块里有 China,真正的 /vendor 里却没有。

也就是说:

模块装上了,但里面最关键的文件根本没有被挂载进去。

到这里,问题突然从“IMS 为什么注册失败”变成了:

Root 模块到底有没有正常挂载?


手动挂一下试试#

为了验证自己的猜测,我直接把模块里的 MBN 目录 Bind Mount 到系统:

mount --bind \
/data/adb/modules/Pixel5VolteVoWiFi/vendor/rfs/msm/mpss/readonly/vendor/mbn \
/vendor/rfs/msm/mpss/readonly/vendor/mbn

然后再次查看:

ls /vendor/rfs/msm/mpss/readonly/vendor/mbn/mcfg_sw/generic/Pixel

这次:

China

出现了。

接着重新启动 IMS 相关服务,再打开 *#*#4636#*#*

结果:

IMS 注册:已注册
LTE 语音通话:可用
视频通话:可用

看到这里的时候,问题其实已经实锤了。

不是运营商问题。

不是 SIM 卡问题。

不是 Qualcomm IMS 服务坏了。

甚至 VoLTE 模块本身也没有问题。

纯粹就是模块没有正确挂载到 /vendor


那为什么以前可以,现在不行?#

这个问题一开始最让我困惑。

因为我以前确实也是 APatch,而且 VoLTE 一直正常。

后来去翻 APatch 的更新记录,才发现中间发生过一个很重要的变化。

2026 年 1 月,APatch 加入了 MetaModule 机制,并明确表示:

此后 APatch 本身不再负责模块挂载,挂载工作交给 MetaModule。

换句话说,以前大概是:

APatch
  ↓
直接处理模块挂载
  ↓
VoLTE 模块正常进入 /vendor

现在则变成了:

APatch
  ↓
MetaModule
  ↓
由具体挂载实现决定模块怎么进入系统

而我这次使用的是:

meta-overlayfs

所以真正改变的并不是 VoLTE 模块,而是 APatch 的模块挂载机制


最后抓到了 OverlayFS 的报错#

继续看 meta-overlayfs 自己的输出:

/data/adb/modules/meta-overlayfs/meta-overlayfs --help

它其实已经正确识别到了 VoLTE 模块:

Processing module: Pixel5VolteVoWiFi
  + system/
  + vendor/

/system 也成功挂上了。

但到 /vendor 时:

mount overlay for /vendor

随后出现:

bind mount ./firmware_mnt -> /vendor/firmware_mnt

failed to mount overlay for child /vendor/firmware_mnt:
Function not implemented

mount vendor failed:
Function not implemented

Pixel 5 的 /vendor 下面还有一个独立挂载的:

/vendor/firmware_mnt

meta-overlayfs 在处理整个 /vendor Overlay 时,碰到这个子挂载失败,最后把整个 Vendor Overlay 回滚了。

结果就是一种非常迷惑的状态:

/system 模块内容:正常
/vendor 模块内容:没挂上

平时可能根本察觉不到。

但偏偏这个 VoLTE 模块最重要的 MBN 就在 /vendor 里面。

于是 IMS 就没了。


换成 Magic Mount,问题消失#

既然已经确定是 OverlayFS 的问题,我最后没有继续折腾它,而是换成了:

Hybrid Mount

然后把挂载方式改成:Magic Mount,之后重启。

再次打开 IMS 状态:

IMS 注册:已注册
LTE 语音通话:可用
视频通话:可用

彻底恢复。

Magic Mount 没有走之前那条会在 /vendor/firmware_mnt 上失败的 OverlayFS 路径,于是模块里的 MBN 终于能够正常出现在 /vendor 里。


所以这次到底发生了什么?#

简单总结一下就是:

以前的 APatch
    ↓
模块可以正常挂载
    ↓
China MBN 生效
    ↓
IMS 正常

后来:

APatch 的模块挂载交给 MetaModule
    ↓
我用了 meta-overlayfs
    ↓
/vendor Overlay 因 firmware_mnt 失败
    ↓
VoLTE 模块里的 China MBN 没挂进去
    ↓
modem 加载 WildCard
    ↓
VOLTE_ENABLE=N
    ↓
IMS 不注册

最后:

换 Hybrid Mount
    ↓
使用 Magic Mount
    ↓
MBN 正确挂载
    ↓
IMS 注册成功

一点感想#

这次最折磨人的地方,是问题表面上看起来完全像 IMS 或运营商配置出了问题。

CarrierConfig 是 false

IMS 没注册。

modem 里 VOLTE_ENABLE=N

MBN 又是 WildCard

每一条看起来都能单独让人研究半天。

结果一路查到底,真正的问题却只是:

模块里的文件压根没挂上去。

更坑的是,APatch 管理器里模块始终显示为正常启用,/system 下的模块内容也确实生效了。

所以从表面上看,完全没有理由怀疑“模块其实只挂上了一半”。

以后如果再遇到升级 Root 方案之后某个模块突然失效,我大概会先去确认一件事:

模块里的文件,真的出现在它应该出现的位置了吗?

有时候比研究半天配置有效得多。

总之,折腾了一下午。

最后看到:

IMS 注册:已注册

只能说——

舒服了。

评论