第三方 Android ROM 无法连接 Google Play 的原因排查

现在用的手机已经服役快要四年了,这年头这种的手机大概也就真的只能拿来当手机用了,于是就刷了个第三方适配的 Flyme 好好用着。虽然平时不太从 Google Play 下载软件,必要时也可以用 APKPure 代替,但是聊聊 LINE 什么的没有 GCM 的推送十分不方便,有时候打开提示一条消息,结果已经是三小时前的了。于是想了想还是决定安装 Google 的那一套东西。然而,无论我用任何第三方工具安装,或者是下载 opengapps 的卡刷包刷入,Google Play 都无法工作。

具体表现为在第一次进入 Play 提示要登录账号的时候提示“无法连接 与 Google 服务器通信出现问题”,而且完全看不到登录账号的界面。在确信梯子没有问题之后,我尝试了:

  • 更换 WiFi/移动网络
  • 使用魅族商店的谷歌安装器
  • 清除 Google 服务框架的全部数据
  • 开启定位服务并授予 Google 服务框架所有的权限
  • 删除 /system/etc/hosts 文件
  • 降级 Google 套件
  • 重置手机

都没有什么卵用。想到之前用 lineageOS 和 MIUI 的时候 Google 框架都正常工作,到网络上搜索相关问题找到的大部分也是 Flyme 用户问的,于是怀疑是不是 Flyme 偷偷做了什么不可描述的事情。但是,Flyme 用户提出的所有解决问题的办法对我来说都没有用。

在 StackOverflow 上,有玩家提到可以用 adb 排查原因,于是照做发现,确实可行。如果你也遇到相似的问题,可以尝试下面的步骤排查,然后解决。

首先到开发者选项中打开 USB 调试,连接电脑,在手机上操作授权调试。建议关闭后台的所有程序,然后在电脑端执行:adb logcat 命令。接着终端会闪过一堆的字,这是在打印 log. 等到终端打出来的字差不多稳定的时候,在手机上打开 Google Play,进入添加账号界面。此时电脑上会显示 Google 框架的 log,查找是否有以 E Checkin failed 类似的错误提示,例如在我这里是:

CheckinTask: Checkin failed: https://android.clients.google.com/checkin (request #0): java.io.IOException: Rejected response from server: invalid hardware identifier: "HM NOTE 1LTE" is not a valid device.

从错误信息当中我们可以知道,设备没有通过 Google 的设备验证 (checkin),原因是当前设备无效,而前面那个很明显是手机的型号。然而,考虑到之前用 lineageOS 的时候是可以用的,跟手机型号的关系应该不是很大。于是进一步查找原因,root 后查看 /system/build.prop, 发现上文的手机型号是 ro.product.namero.product.device 的值。

于是猜测问题应该出在这里了。找出之前用的 lineageOS 的包,对比两个 ROM 的 build.prop 文件,发现 ro.product.name 大家都是一样的,但是在 lineageOS 中,ro.product.device 是这台设备的代号 (dior) 而不是具体型号。尝试将当前系统的 ro.product.device 修改,重启之后,问题解决,Google Play 可以正常使用,GCM 也 OK 了。

再搜索相关资料,发现原来在登录 Google 账号之前,Google 框架会先和 Google 服务器通信,对当前设备进行验证,提交的信息包括设备型号和 IMEI 等等。提交的设备型号就是 ro.product.device 的值,但是 Google 要求提交的型号不允许带有空格和中文等值,于是就造成了上述验证不通过的问题。

所以这个锅 ROM 作者背定了。