Gradle: SSL peer shut down incorrect与 read timeout处理

目录

    • 问题
      • 症状一
      • 症状二
      • 症状三
    • 问题分析
    • 解决方案
      • 方案一
      • 方案二
      • 方案三
    • 将依赖库设置为阿里的地址

问题

在建立新项目或者添加新的第三方依赖时,gradle无法正常下载相关.jar

症状一

Android Studio下执行syncbuild等Gradle任务出现如下症状:

项目build一直卡在:Gradle: Resolve dependencies ‘:app:_debugCompile’
下载第三方依赖时,日志输出: Gradle sync failed: Read timed out

症状二

commend模式下进行: gradlew build --info 日志提示:

Remote host closed connection during handshake
SSL peer shut down incorrectly

症状三

浏览器分明可以下载相应的.jar包,然而Gradle却不能自动下载.jar包。
明明有科学上网还是没办法。

问题分析

(如果只关心解决方案解决方案,可跳过此部分)
上述情况均由gradle无法正常下载,为何gradle无法正常下载?

  • 情况一

服务器不可达,需要科学上网(在科学上网后任然可能会出现情况二、三)或者修改maven仓库地址。

  • 情况二

gradle无法辨别服务器的CA证书,无法建立https连接。

SSL peer shut down incorrectly
  • 情况三
    gradle的网络请求没有走Shadowsocks本地端口,具体表现为浏览器可下载,但是gradle无法自动完成下载任务。

解决方案

方案一

配置maven仓库地址(免科学上网),用于解决服务器不可达,又无法科学上网的情况;

maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}

方案二

在本地导入服务器证书,下面以checker-qual-1.8.0.jar这个包的导入为例:

  1. 首先,找到jar包的服务器地址:

https://jcenter.bintray.com
https://jcenter.bintray.com/org/checkerframework/checker-qual/1.8.0/:checker-qual-1.8.0.jar

  1. 下载https://jcenter.bintray.com所在服务器的的CA证书:
    Gradle: SSL peer shut down incorrect与 read timeout处理_第1张图片

  2. 将证书导入本地。
    File→Setting→Server Certificates→添加复制第2步中的证书
    Gradle: SSL peer shut down incorrect与 read timeout处理_第2张图片

方案三

设置gradle请求网络端口代理;

由于很多开发者在使用类Shadowsocks工具,并非采用VPN实现科学上网,导致浏览器可以下载但是gradle却无法自动下载。导致这种情况的原因可能是由于gradle无法识别CA证书问题,另外一个原因就是代理软件(客户端s–ss-local)并没有将gradle的网络请设置为由ss-local的端口代理,只是设置了浏览器请求代理端口(在较低级的客户端ss-local中甚至需要手动设置浏览器请求代理端口)导致浏览器可达,gradle不可达,所以需要需要手动设置代理端口。这样CA证书的验证任务就交由服务器负责,也保证了gradle可达目的主机网络。

//systemProp.https.proxyHost=127.0.0.1
//systemProp.https.proxyPort=8080
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=1080//ShadowSocks本地端口

当然,网络上也存在许多免费服务得端口可以作为代理,这样即使没有搭建梯子,照样可以获取相应资源。例如:

systemProp.https.proxyHost=mirrors.neusoft.edu.cn
systemProp.https.proxyPort=80
systemProp.http.proxyHost=mirrors.neusoft.edu.cn
systemProp.http.proxyPort=80

将依赖库设置为阿里的地址

        maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}

关于Shadowsocks的学习: 篇一、篇二

你可能感兴趣的:(Android,Android基础)