Android Studio(1.3版本)设置Gradle代理的正确姿势

原文出处:http://www.licheedev.com/2015/06/22/gradle-proxy-for-as-1-3/ 

遭遇

手贱把自己电脑的Android Studio升级到最新的1.3 Preview。然后上星期帮朋友配置Robolectric,要各种下载依赖,结果速度慢得要死。检查了一下网络连接,囧了,发现没走梯子(shadowsocks没速度),直连了,如下图:

没走代理走直连

测试

好吧,于是切换了各种代理姿势:

基本的HTTP Proxy设置

基本的HTTP Proxy设置

一开始就设置代理到shadowsocks,不过无效

设置编译参数

编译参数

-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8123 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8123

然而并没有什么卵用。

设置GRADLE_OPTS环境变量

跟上面的差不多,新建环境变量GRADLE_OPTS,值为以下,不过还是无效

-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8123 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8123

按照Android Studio的烦人提示,往gradle.properties文件中添加代理配置
如果使用了AS1.3版本,并按照1那样设置了代理,就一定会弹出下面这个烦人的提示(最近两次更新已经提供了闭嘴选项,左下角那里)

Proxy Settings提示

选了Yes的结果就是,项目的gradle.properties文件中会多了两句(跟1中的设置对应):

具体配置

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8123

然并卵,还是坑。

P.S. 如果不小心让这玩意闭嘴了,又舍不得,可以通过修改下列参数再次打开,具体文件位置请自行搜索。
不要闭嘴

解决

不得不说,Gogole太能玩开发者,自己提供的解决方案,竟然不能用,有考虑过我们这些苦逼的中国开发者的感受么。

好吧,先搜搜看,就用android studio 1.3 proxy做关键词,别用百度,

然后看我找到了什么:

https://code.google.com/p/android/issues/detail?id=176296

Android Studio sets automatically the proxy settings for gradle in gradle.properties.

You should add the proxy-Settings for https, not only for http:

systemProp.https.proxyHost=
systemProp.https.proxyPort=

Reproducable in Android Studio 1.3 (AI-141.1989493) (RC3?)

试试看,往项目的gradle.properties里面多加两句

systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8123

经检验,成功启动代理,麻麻再也不用担心被墙了。

成功代理

总结

其实我在1.2版本之前,本人就试过按照上文那样,在gradle.properties里面设置过代理,但是那时候只要加了那几句配置了,AS就会提示找不到依赖,那时候排查了很久,才发现是那里的问题。
如果是AS1.2或以前,只要在HTTP Proxy那里设置代理,就能很好地运作.
不过到了AS1.3,情况完全相反,不设置还不行。搞不明白Google修改这个的动机是啥。

虽然找到了方法,不过每个项目的改一下太麻烦了,而且代理什么的因人而异,如果项目开源了,别人很有可能不需要设置代理,或者使用的是别的代理,这样修改无异于画蛇添足。

其实Gralde还提供全局gradle.properties方案,参考这里:

https://docs.gradle.org/current/userguide/build_environment.html

Gradle user home是存放依赖库,还有默认gradle参数的地方,默认在这些文件夹

/home//.gradle/ (Linux)
/Users//.gradle/ (Mac)
C:\Users\.gradle (Windows)

当然,也能通过环境变量GRADLE_USER_HOME来指定,
在Gradle user home文件夹下建立gradle.properties文件,然后加上代理的配置即可,如下图

全局代理

这样就完成了全局代理的配置。

附上完整的可选代理配置:

# http
systemProp.http.proxyHost=www.somehost.org
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=userid
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost
# https
systemProp.https.proxyHost=www.somehost.org
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost