最近在编译SocialCall社交Flutter项目,在编译到最后一步时出现以下错误:
* 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
百度后发现这个是Firebase Crashlytics集成引起的错误。当你集成Firebase Crashlytics完毕后,debug模式下的编译运行完全正常,然而但你要打release包的时候此时会出现错误,日志类似上述。
这是因为打release包的时候,Firebase Crashlytics SDK需要将项目混淆后的Mapping等文件上传到Google的服务器,也就是app模块的uploadCrashlyticsMappingFileXXXRelease这个task,然后出现崩溃后我们可以直接在线上拿到正常的崩溃日志,而不是混淆后的日志。
然而问题就出在上传Mapping文件到Google服务器这一步,这里你就必须要科学上网了。
然而当你开启科学上网的软件后,如果不在项目中设置相应的代理信息,编译还是会出错,所以我们还需要在项目的gradle.properties中进行相应的设置:
systemProp.https.proxyHost=xxx.xxx.xxx.xxx
systemProp.https.proxyPort=xxxx
proxyHost:代理的主机的地址,如果是你自己电脑开的科学上网软件,那么可以填写127.0.0.1;
proxyPort:代理的端口地址,一般你的科学上网软件开启之后你可以去软件的设置中查看下它的代理端口是多少然后填写到这里就可以了;
所以以上就是问题的原因及一个解决办法。
但是有的同学说了,我们都是在内网服务器上部署Jenkins然后自动打包的,那我们要在打包服务器上也这么搞么?一般不建议这么搞,因为服务器上搞个科学上网还是很容易被封(前车之鉴了)的吧。所以要么服务器直接部署在海外,然后又有同学问了,我们代码和构件仓库都在内网啊,哈哈哈哈,问的好,找运维同学帮忙吧。
好了,简单说下我们的方式吧。目前我们是部署在了内网,因为内网的各种优势就不用说了吧,在项目app模块的build.gradle文件中直接关闭上面出现问题的Task:
gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("uploadCrashlyticsMappingFile")) {
task.enabled = false
}
}
}
这样的话,自动给测试人员打release包的时候,都不需要和Google的服务器打交道了。但是问题就是,你所有测试人员的崩溃日志就全是混淆后的日志了,无法直视。
然后打正式生产环境的release包的话,建议还是按照一开始的办法,老老实实自己科学上网然后项目中设置代理参数进行打包。
总之我就小声BB下,希望Google大大考虑下各国国情,不然这也太麻烦了,害。