FCM 频繁超时重连

我一直有一个疑惑,为什么手机耗电很快,但是在电池用量里却怎么也找不到元凶。手机一晚上待机掉 21% 的电,即便把所有的 APP 都冻结了也无济于事。直到前段时间偶然间发现这个 issue 。

仔细看了一下所有的回复,主要问题出在 Shadowsocks 身上,它会主动关闭超时的长连接,导致 FCM(Firebase Cloud Messaging) 不断重连。例如 Shadowsocks 默认配置的 timeout 是 60,这就导致 FCM 每过 60 秒就会断开重连。(;´д`)ゞ。在拨号盘中输入 *#*#426#*#*,在 EVENTS 中可以看到类似下面这种日志。

10-27 01:19:56.234 net=-1: Sent Close
10-27 01:18:34.155 net=1: Connected
10-27 01:18:24.612 net=1: Close err:FIN time:60
10-27 01:18:24.594 net=1: Sent Close
10-27 01:16:21.953 net=1: Connected
10-27 01:16:15.417 net=1: Close err:FIN time:60
10-27 01:16:15.372 net=1: Sent Close
10-27 01:14:13.346 net=1: Connected
10-27 01:14:07.479 net=1: Close err:FIN time:60
10-27 01:14:07.462 net=1: Sent Close
10-27 01:12:05.995 net=1: Connected
10-27 01:11:58.446 net=1: Close err:FIN time:61
10-27 01:11:58.432 net=1: Sent Close
10-27 01:09:56.638 net=1: Connected

解决方法已经很明确了,只要把 Shadowsocks 配置里的 timeout 这一项改的大一点即可,例如改成 600。这个修改需要 Server 和 Client 都修改,不然会以最小的为准。Server 端的好改,打开 json 文件一改就完事了。但是 Android 端就有不那么容易了,timeout 值是硬编码写在代码里的,就需要修改源代码重新编译一份。

为了以后方便一点,我 fork 了 shadowsocks-android 的仓库,修改了 ProxyInstance.kt 文件中的 timeout 为 600,然后找了一个 CI 编译了一份。我以后会定期合并上游代码编译好后丢到 Release 里,有需要的可以去我的仓库 里下载。

修改完成后我观察了几天,一晚上待机耗电 5% 左右,不知道比以前好到哪里去了。

Leave a Reply

Your email address will not be published. Required fields are marked *