1. Play商店不能正常安装应用的来龙去脉:国内安卓设备的谷歌服务差异与域名解析问题
2016年有消息称“谷歌要推出 Google Play China版”,虽然后来没有大范围推广,但这一尝试仍然对国内安卓设备的谷歌服务产生了影响。至今,许多国内安卓手机出厂时自带的谷歌服务(Google Play Service)软件与国际版本存在差异。例如,本人手中的小米、OnePlus 手机自带谷歌服务,在 apkpure 上更新 Google Play Service 时,会提示“安装失败,已安装了签名冲突的应用”。这说明国内安卓手机自带的谷歌服务与国际版本并不一致。
谷歌服务的 API 请求域名也存在差异:
- 国际版的域名为 "services.googleapis.com"
- 国内版的域名为 "services.googleapis.cn"
然而,在一部分代理软件中,默认情况下国内设备会优先使用 "services.googleapis.cn" 域名,并不会将其重定向到 "services.googleapis.com" 域名,这种情况下,代理软件会解析该域名为国内 IP地址。在"services.googleapis.cn"解析为国内地址时,会返回国内cdn的下载地址,其域名形式为"[xxxx].xn--ngstr-lra8j.com",而国内cdn会阻止国外ip的访问,若此时域名"[xxxx].xn--ngstr-lra8j.com"走代理,请求无效,即表现为无法下载;但若在使用nekobox下载play商店应用过程中,在提示"等待中"时关闭代理,则又可以正常下载应用。
2. 进一步分析:Google Play 应用下载地址解析机制与代理问题
在 Play 商店下载应用时,谷歌商店会根据以下因素判断应用的下载地址是 "services.googleapis.cn" 还是 "services.googleapis.com":
- 谷歌账号区域
- 使用者 IP 地址
- 手机系统 ROM
随后,下载地址会通过 302 跳转 转到真正的谷歌全球 CDN 下载地址,其中国内的 CDN 下载地址形式为 "[xxxx].xn--ngstr-lra8j.com"。
特别说明:
国产 ROM 系统不会考虑谷歌账号区域或使用者 IP,默认使用 "services.googleapis.cn"。从 v2rayNG 的日志可以发现,在下载应用时,v2rayNG 会将 "services.googleapis.cn" 重写为 "services.googleapis.com",因此 v2rayNG 可以正常下载谷歌商店应用。但 nekobox 并没有这一配置,所以无法正常安装应用。
此外,国区账号、国内 IP 或部分香港 IP 也很可能被指定为 "services.googleapis.cn"。此时,如果 "services.googleapis.cn" 和 "[xxxx].xn--ngstr-lra8j.com" 没有 “同时直连” ,就无法正常下载安装谷歌商店的应用。
3. 问题解决方案
-
转圈时断开代理或关闭 WiFi,直接用数据下载
- 缺点:每次都需要手动切换代理或 WiFi,操作较为繁琐。
-
※推荐方案:设置谷歌商店相关域名的直连规则
在 nekobox 的路由配置中,修改 “中国Play商店规则” 如下并启用该规则:
- 优点:精准解决问题,无需影响其他流量,且一劳永逸。
domain:
googleapis.cn
xn--ngstr-lra8j.com
outbound:
绕过