Android SDK and AVD Manager (Linux) : Network is unreachable
去年撰写过一篇博客,解释了如何将默认下载地址从 https 变更为 http,提到其中的原因是由于Gnome 和 SWT 的 BUG,这些小问题往往给人带来很不好的使用体验。事情过去一年多了,由于一些原因,又要安装 Linux 版的 Android SDK,发现去年的问题依旧存在,不幸的是,除此之外,又发现了一个新问题。
问题表现为,当采用 http 下载时,窗口提示:Failed to fetch URL http://dl-ssl.google.com/android/repository/repository.xml, reason: Network is unreachable
。--确信这在去年是没有发生的,那么问题既然已经发生了,就别抱怨了,把精力集中在如何解决它,了解发生的原因。
没有 Log,没有 Debug,还好我们有搜索引擎。How to resolve an issue “Network is unreachable” in Java applications 和 Solved network unreachable when installing Android 是我找到的两篇博客,给了我很大的帮助,根据他们的办法,这才使得问题顺利解决。
问题的解决办法很简单,在 Terminal 执行以下命令(root角色):
eniac:/home/xuhj# sysctl -w net.ipv6.bindv6only=0 net.ipv6.bindv6only = 0 |
这样做无需 reboot,当即可解决问题,不过等到下次开机之后,问题依旧,那就采用修改配置文件(/etc/sysctl.d/bindv6only.conf)的方式来一劳永逸吧。在我的电脑上,该文件只有一行有效信息,确认 net.ipv6.bindv6only 的值为1。
# This sysctl sets the default value of the IPV6_V6ONLY socket option. # # When disabled, IPv6 sockets will also be able to send and receive IPv4 # traffic with addresses in the form ::ffff:192.0.2.1 and daemons listening # on IPv6 sockets will also accept IPv4 connections. # # When IPV6_V6ONLY is enabled, daemons interested in both IPv4 and IPv6 # connections must open two listening sockets. # This is the default behaviour of almost all modern operating systems. net.ipv6.bindv6only = 0 |
让我遗憾的是,找的到解决办法,却找不到问题原因。从表象上来看,这个问题在 Eclipse 也能重现,那么是不是 SWT 的原因呢?从上面配置文件里的注释可以看出,如果选项被打开,即赋值为1,IPV6和IPV4是分别打开监听 socket,如果关闭它,则IPV6也可以收发IPV4的数据(原文为traffic,理解可能有误)。显然,如果关闭这个选项会好一些。
Linux 就是这样“神奇”,你永远不知道接下来的一个问题会是什么。好在自己已经不再像以前那样急躁,现在能耐下心来跟踪问题了。
你不知的gfw?
在当时的情况下,这个问题可以排除GFW的嫌疑。建议参考我文中所提到的两处链接。