问题背景

最近在集成 firebase-crashlytics 的时候,发现编译 release 的时候会抛出如下的错误:

* What went wrong:
Execution failed for task ':app:uploadCrashlyticsMappingFileXXXRelease'.
> org.apache.http.conn.HttpHostConnectException: Connect to firebasecrashlyticssymbols.googleapis.com:443 [firebasecrashlyticssymbols.googleapis.com/172.217.160.74] failed: Connection timed out: connect

从错误信息看是发现 firebasecrashlyticssymbols.googleapis.com 这个 host 请求超时了,但是我确实科学上网了呀?我在浏览器中去访问这个 host 也能正常请求,那这是什么原因呢?

首先我们了解下这个 task 是用来干嘛的?在打 release 包的时候,Firebase Crashlytics SDK 需要将项目混淆后的 Mapping 等文件上传到Google的服务器,也就是app模块的 uploadCrashlyticsMappingFileXXXRelease 这个task,然后出现 crash 后我们可以直接在线上拿到未混淆的崩溃日志,帮助定位问题。

现在问题就出在上传 Mapping 文件到 Google 服务器这一步,既然我机器已经科学上网了,那肯定是 Android Studio 是有什么方法去配置代理的,那如何进行配置?

设置 Android Studio 代理

Android Studio 支持 HTTP 代理设置,因此您可以在防火墙后面或使用安全网络运行 Android Studio。如需在 Android Studio 中设置 HTTP 代理设置,请执行以下操作:

  1. 在菜单栏中,依次点击 File > Settings(在 macOS 上,依次点击 Android Studio > Preferences)。
  2. 在左侧窗格中,依次点击 Appearance & Behavior > System Settings > HTTP Proxy。此时将显示 HTTP Proxy 页面。
  3. 选择 Auto-detect proxy settings 以使用自动代理配置网址配置代理设置,或选择 Manual proxy configuration 以自行输入每一项设置。有关这些设置的详细说明,请参阅 HTTP 代理
  4. 点击 ApplyOK 以使更改生效。

Android Plugin for Gradle HTTP 代理设置

若从命令行或在未安装 Android Studio 的计算机上运行 Android 插件,应在 Gradle 构建文件中设置 Android Plugin for Gradle 代理设置。

对于特定于应用的 HTTP 代理设置,请根据各应用模块的要求在 build.gradle 文件中设置代理设置。

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...
        systemProp.http.proxyHost=proxy.company.com
        systemProp.http.proxyPort=443
        systemProp.http.proxyUser=userid
        systemProp.http.proxyPassword=password
        systemProp.http.auth.ntlm.domain=domain
    }
    ...
}

对于整个项目的 HTTP 代理设置,请在 gradle/gradle.properties文件中设置代理设置。

# Project-wide Gradle settings.

systemProp.http.proxyHost=proxy.company.com
systemProp.http.proxyPort=443
systemProp.http.proxyUser=username
systemProp.http.proxyPassword=password
systemProp.http.auth.ntlm.domain=domain

systemProp.https.proxyHost=proxy.company.com
systemProp.https.proxyPort=443
systemProp.https.proxyUser=username
systemProp.https.proxyPassword=password
systemProp.https.auth.ntlm.domain=domain

proxyHost: 代理的主机的地址,如果是你自己电脑开的科学上网软件,那么可以填写 127.0.0.1; proxyPort: 代理的端口地址,一般你的科学上网软件开启之后你可以去软件的设置中查看下它的代理端口是多少然后填写到这里就可以了;

添加完成之后再试试,就大功告成了。

参考链接

https://developer.android.google.cn/studio/intro/studio-config

https://firebase.google.com/docs/crashlytics/get-started?authuser=0&platform=android