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设置
一开始就设置代理到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那样设置了代理,就一定会弹出下面这个烦人的提示(最近两次更新已经提供了闭嘴选项,左下角那里)
选了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