Pixel设置VoLTE

入手 pixel{.interpreted-text role="ref"} 手机,经过一周的调教,已经如丝般滑顺(前提是摈弃所有国产软件),并且root之后的Android提供了超越iOS的便利之处。

然而,中国移动运营商摒弃2G/3G技术导致很多地方如果没有VoLTE的4G语音技术加持,几乎无法正常通话。这就遇到一个尴尬的难题:自从2010年,Google被迫退出中国市场之后,已经没有正式渠道能够获得官方的产品和技术支持。同样Pixel以及后几代产品,在中国市场上只有水货,并且没有得到运营商VoLTE的数据配置支持。这是中国消费者的悲哀...

本文是我的探索记录,比较杂乱。我的最终解决方法见我的Cloud Atlas中文章。

硬件支持

Pixel 和 Pixel XL硬件上是支持VoLTE技术的(2016底年印度市场Pixel已经通过更新Android Nougat 7.1.1 OTA支持VoLTE),并且当前Google Android系统对于支持VoLTE技术是非常友好的,只要运营商提供了配置,就可以直接开启。然而,不幸的是在中国市场上的运营商都没有提供配置。

通过电话拨号: *#*#4636#*#* 可以进入 Testing 设置,然后再点 Phone Info 其中就可以看到 VoLTE Provisioned 是灰色不可设置项。

可以通过 Magisk voenabler (XDA原帖见 VoLTE & VoWiFi Enabler (2018-09-20) ) 激活VoLTE功能,原理就是修改 [vender/build.prop]{.title-ref} 添加激活volte的配置:

# Debug Options
persist.dbg.ims_volte_enable=1 
persist.dbg.volte_avail_ovr=1 
persist.dbg.vt_avail_ovr=1
persist.dbg.wfc_avail_ovr=1

# Radio Options
persist.radio.rat_on=combine
persist.radio.data_ltd_sys_ind=1
persist.radio.data_con_rprt=1
persist.radio.calls.on.ims=1

GitHub Magisk-Module-Repo 下载... 目前已经没有直接下载的voenabler模块,不过原作者的 GitHub Toucan-Sam VoEnabler 有很多fork出来的项目,例如 edgd1er / voenabler 提供直接直接可用适合最新Magisk\'s module template 20.x的版本,可以直接下载:voenabler-v1.6.zip

  • voenabler-v1.6.zip 推送到手机:

    adb push voenabler-v1.6.zip /sdcard/
  • 启动Magisk程序,然后选择菜单 Modules ,并点击屏幕上 + 按钮,并通过文件管理器找到 voenabler-v1.6.zip 进行安装

  • 安装以后按照提示重启手机,重启以后在 Settings => Network & Internet => Mobile network 中查看,就可以看到增加了一项 VoLTE 选项并且已经激活:

  • 验证VoLTE功能:

启用LTE 4G上网浏览网页,同时拨打10086听语音,如果语音同时还能够上网,则表示VoLTE工作正常。

很不幸,虽然此时激活了VoLTE开关,但是实际上该功能还是无效的,电话同时并不能上网。这是因为此时手机中缺少中国地区运营商参数配置(因为Google压根就没有和中国三大运营商合作,中国政府不会允许的)。解决方法是从其他国产手机(如小米)提取国内运营商的VoLTE配置,制作成Magisk模块加载。

运营商配置Magisk模块(失败)

参考宁静的雨 开通VoLTE后发现Pixel手机不支持?装上这个Magisk模块就好了 下载其提供的 VoLTE配置包 也通过Magisk加入。这个配置软件包也可以从 magisk-pixel2-china-volte 获得。

上述方法是针对Pixel 2/2XL,我在Pixel XL上验证没有效果。原因是每款产品的配置文件目录实际是不同的,例如 Pixel 2 和 Pixel 2XL的运营商配置目录不同,相应的Pixel一代的运营商配置也有差异。

/firmware/radio/modem_pr/mcfg/configs/mcfg_sw/generic/common/wildcard/wildcard 文件中有包含中国移动波段:

0 2 4 6 7 37 38 39 40

在安装了上述magisk的module之后 /sbin/.magisk/mirror/data 目录下可以找到 mcfg_sw 配置目录:

./misc/radio/modem_config/mcfg_sw
./misc/modem_config/mcfg_sw

其中 /sbin/.magisk/mirror/data/misc/radio/modem_config/mcfg_sw/generic 目录下包含了 china 目录 以及 common 目录。

更进一步可以看到 /sbin/.magisk/mirror/data/misc/radio/modem_config/mcfg_sw/generic/common/wildcard/wildcard/mcfg_sw.mbn 配置文件

手工配置VoLTE

Pixel2(2XL) Anroid 8+/9.0 破解电信4G网络+开启VOLTE通话 提供了完整的手工设置方法(在2楼是中国移动配置方法),虽然是Pixel 2/2XL,不过可以借鉴尝试。

  • 下载

    pixel2/2xl配置调整包

    下载后解压缩,其中有一个目录

    modem_pr/mcfg/configs/mcfg_sw/generic/china

    子目录,这个子目录完整复制到下一步所说的手机内部的对应目录:

    • Pixel 2:

      vendor/rfs/msm/mpss/readonly/mbn/mcfg/configs/mcfgsw/generic/

    • Pixel 2XL: vendor/mbn/mcfg/configs/mcfg_sw/generic

由于我是Pixel XL,搜索目录 mcfg_sw 可以看到 :

./data/misc/radio/modem_config/mcfg_sw
./data/misc/modem_config/mcfg_sw
./firmware/radio/modem_pr/mcfg/configs/mcfg_sw
./sbin/.magisk/mirror/data/misc/radio/modem_config/mcfg_sw
./sbin/.magisk/mirror/data/misc/modem_config/mcfg_sw

其中最后2条是之前安装过Magisk的模块保留的?所以可能需要存放运营商配置的是前3个目录。分别检查这3个目录下的 generic 子目录,其中2个目录包含了各地运营商的配置信息:

/data/misc/radio/modem_config/mcfg_sw/generic
/firmware/radio/modem_pr/mcfg/configs/mcfg_sw/generic

但是,其中后一个目录 /firmware/radio/modem_pr/mcfg/configs/mcfg_sw/generic 是系统目录,只读无法写入。

参考 pixel XL VOLTE求助 有人提到 pixel的目录应该是这个 /firmware/radio/modem_pr/mcfg/configs/mcfg_sw/generic/common

但是如何写入这个目录是一个疑问?

所以推断应该将中国运营商的配置信息存放到 /data/misc/radio/modem_config/mcfg_sw/generic 目录下,在没有添加中国运营商配置信息之前,该目录下有5个子目录,分别代表欧洲、北美、亚太等5个地区:

apac aus common eu na

::: {.note} ::: {.title} Note :::

如果使用Pixel 2/2XL则:

  • Pixel 2目录

    vendor/rfs/msm/mpss/readonly/mbn/mcfg/configs/mcfgsw/generic/

  • Pixel 2XL目录 vendor/mbn/mcfg/configs/mcfg_sw/generic

    :::

我们需要把解压缩的文件中 china 文件夹复制进去,成为并列的第6个文件夹。不过直接用 adb push china <目标目录> 都提示 Permission denied

所以先使用 adb push china /sdcard 将文件传输到手机内的存储目录,然后再在手机内部执行:

cd /data/misc/radio/modem_config/mcfg_sw/generic
cp -R /sdcard/china ./

::: {.note} ::: {.title} Note :::

检查发现实际上安装了 Magisk 的 enable_volte_pixel2_china.zip ,系统会挂载2个目录:

/sbin/.magisk/block/vendor 295M  249M   46M  85% /sbin/.magisk/mirror/vendor
/sbin/.magisk/block/data   112G   11G  101G  11% /sbin/.magisk/mirror/data

这样应该是一个overlay的解决方案,如果后续改成Magisk方式,可以尝试执行如下方式overlay。 :::

  • 上述步骤完成以后,就会发现开启了工程模式查看 phone info 中,原先灰色的 VoLTE Provisioned 虽然还是灰色,但是灰色部分却显示为激活状态(虽然看上去不能调整)。这比之前始终灰色且关闭状态前进了一步。

  • (未找到该文件,没有执行)在gneric同级目录下有一个 oem-sw.txt 文件,在最后添加如下内容:

    mcfg_sw/generic/china/cmcc/commerci/volte_op/mcfg_sw.mbn
  • build.prop 文件中添加以下内容激活volte代码

常规是需要修改 /system/build.prop 配置的,但是在android 10中,默认不能读写根文件系统。并且以前采用的命令:

mount -o remount,rw /

会提示报错:

'/dev/root' is read-only

解决方法是参考 Android O, failed to mount /system, /dev/block/dm-0 is read only 执行:

adb root
adb disable-verity
adb reboot
adb remount
adb shell
mount -o rw,remount /system

需要注意,上述 adb disable-verity 只能在 userdebug builds使用,默认通过 cat /system/build.prop | grep build.type 可以看到:

ro.system.build.type=user
ro.build.type=user

这种user模式下,执行 adb disable-verity 会报错:

disable-verity only works for userdebug builds
verity cannot be disabled/enabled - USER build

magisk提供了覆盖方法,在 /sbin/.magisk/ 目录下搜索可以看到有如下配置:

./mirror/vendor/odm/etc/build.prop
./mirror/vendor/build.prop
./mirror/system_root/system/product/build.prop
./mirror/system_root/system/build.prop

但是也不能修改(因为是软链接) ./mirror/system_root/system/build.prop :

ro.mtk_ims_support=1                                
ro.mtk_volte_support=1
persist.mtk.volte.enable=1
persist.dbg.volte_avail_ovr=1

# 可能只要添加以上4行就可以
persist.dbg.ims_volte_enable=1
persist.dbg.volte_avail_ovr=1
persist.dbg.vt_avail_ovr=1
persist.dbg.wfc_avail_ovr=1
persist.radio.rat_on=combine
persist.radio.data_ltd_sys_ind=1
persist.radio.data_con_rprt=1
persist.radio.calls.on.ims=1

非常失败,实际上没有搞定Android 10环境下激活Pixel的VoLTE,实在太折腾了。Pixel全系列不能在墙内使用VoLTE真是让人折磨死,即使后续各个版本,能够通过破解来激活VoLTE,但依然没有保障,任何升级都可能破坏激活。

看来,Pixel注定只能是移动终端兼备机角色了

参考

Last updated