最近美亚入了一台 Moto G 2nd,拿到手拆封后就发现屏幕破了,找亚马逊索赔,给退了100刀,要知道这手机一共才$150,换个屏花了RMB200,总体来说不亏,赞一下美亚。

Moto G 2nd 已经有了5.0.2的官方OTA,所以我开机后直接就升级了,升级完发现了一个问题,Android 5.0 右上角Wifi和移动网络图标上均有一个小感叹号,我以为升级导致基带出了问题,上网搜了一下发现这其实是5.0的一个特性,这个版本引入了一个新的网络评估机制来确定你当前的网络状况,当你有请求时会根据你的网络状态选取最优的网络连接方式。

这个评估机制的原理就是系统访问一个URL: http://clients3.google.com/generate_204 ,根据返回结果来判断网络状况。而由于众所周知的原因,这个URL在国内是无法访问的,所以系统认为你当前的网络状态是有问题的,所以就蛋疼的帮你显示了两个小感叹号。这其实并不是主要问题,主要问题是操作系统会不断的去访问这个URL,不断的确定你的网络状况,导致单单 Network 这一项的耗电就占到了惊人的40%,和屏幕不相上下,所以,这并不是一个小问题,我们来解决它。

搜了一下相关的东西发现 Android 是通过判断返回值是否为{HTTP 204}来判断网络是否联通的,若为204,则说明网络正常;若不是204,则网络有问题。那么我们就可以创造一个可以访问的并且返回值为204的URL提供给系统,这样问题就迎刃而解了。


下面给出解决办法。

若设备已经root

那么最简单的方法就是修改 /etc/hosts 文件,把clients3.goolge.com 指向一个可以访问的 Google IP即可,至于IP地址就需要自己去找了,这里提供一个工具,自己去研究下。

若设备没有root

开启 Android USB调试,正确安装adb驱动,手机连接电脑。

adb devices

查看设备是否正常连接,如果正常,那么利用adb修改captive_portal_server,使其连接一个能够正常返回204的地址。

adb shell
settings put global captive_portal_server liukebin.sinaapp.com

这是一个位于新浪SAE上的204页面,据搭建者说永久有效。

重启你的手机,检查是否成功。


如何搭建自己的服务

其实只要返回给 Android 是一个204的空页面即可,所以直接在网站的根目录下建立一个名为 generate_204 的空文件即可。

或者如果你的服务器是用nginx搭建的,那么可以修改nginx的配置文件,加上一行:

location /generate_204 { return 204; }

即可。

DONE!


我自己也搭建了一个204返回服务,server: http204.sinaapp.com ,放在新浪SAE上,速度非常快,永久有效!