0%

Android Studio gradle代理https失败的解决办法

前言

这篇文章所有的方法全都是在stackoverflow上找到的,我也是最近强迫自己使用英语搜索,才发现stackoverflow的好处。以前虽然看一些大牛说stackoverflow是开发者圣,但是我基本都是用中文作为关键词搜索,虽然同样是在Google上搜索,但是找到的内容不可相提并论。越来越后悔以前没有好好学英语了,只能慢慢补了。

设置gradle代理

在 USER_HOME/.gradle/中新建一个gradle.properties,然后输入以下内容

1
2
3
4
5
6
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=1080
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=1080
systemProp.socks.proxyHost=127.0.0.1
systemProp.socks.proxyPort=1080

解决https证书错误

设置好代理之后,可能出现htpps代理失败的问题。因为jc库默认是https的,我用的免费代理软件,需要导入自签证书才能使用。然而我安装官方教程使用keytool向java导入了CA证书,还是无法使用。一般会显示如下的错误

1
2
"Error:(26, 13) Failed to resolve: com.alibaba:fastjson:1.1.34.android"
"Error:A problem occurred configuring project ':app'.peer not authenticated.

去代理软件后台看到其报错

1
Aug 10 16:59:59.618 - [INFO] ssl error: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:590),create full domain cert for host:jcenter.bintray.com

就是因为软件不能信任我们自己的证书,所以导致https通讯失败。而解决办法就是将jcenter仓库地址替换为http。即将build.gradle中的

1
2
3
repositories {
jacenter()
}

全部替换为(应该有两个,一个是app的,一个是module的)

1
2
3
4
5
6
repositories {
jcenter
{
url 'http://jcenter.bintray.com'
}
}

永久替换jcenter()

按照上述方法,就成功的设置了代理。但是缺点是需要每次新建项目后都修改一下仓库地址,尤其是初学Android时,基本上每个示例都要新建一个项目,难不成每个都改一遍么?当然不可能,自然有替换方法,将下面的内容,保存为init.gradle,和gradle.properties一样,也放到USER_HOME/.gradle/中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
allprojects{
repositories {
def REPOSITORY_URL = 'http://jcenter.bintray.com/'
all { ArtifactRepository repo ->
println repo.url.toString()
if ((repo instanceof MavenArtifactRepository) && repo.url.toString().startsWith("https://jcenter.bintray.com/")) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
jcenter {
url REPOSITORY_URL
}
}
}

重新打开Android Studio并进行同步gradle,你会发现一切都正常了。

init.gradle是Gradle的初始化脚本(Initialization Scripts),会再每次gradle运行时执行,即上述代码是在gradle运行时修改jcenter仓库链接而不会去修改build.gradle文件里的内容。

参考来源