Android中使用Crashlytics发送报告时出现SSLHandshakeException问题
这个问题我之前帮不少开发者排查过,结合你给出的日志来看,核心是应用没法验证Crashlytics服务器的SSL证书,导致崩溃报告发不出去。给你几个针对性的解决方向,按优先级来试:
首先先明确日志里的错误核心:
D/CrashlyticsCore: 尝试发送4份报告
E/CrashlyticsCore: 发送报告com.crashlytics.android.core.SessionReport@e6586d3时出错
io.fabric.sdk.android.services.network.HttpRequest$HttpRequestException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 未找到证书路径的信任锚点。
at io.fabric.sdk.android.services.network.HttpRequest.part(HttpRequest.java:2546)
at io.fabric.sdk.android.services.network.HttpRequest.par...
优先迁移到Firebase Crashlytics(最关键)
你日志里出现的io.fabric.sdk.android是旧版Fabric框架的Crashlytics,而Fabric服务早在2020年就停止维护了,对应的服务器证书大概率已经失效,这几乎是这类问题的最常见原因。建议直接迁移到Firebase整合的Crashlytics:- 项目级
build.gradle添加依赖:dependencies { classpath 'com.google.gms:google-services:4.4.1' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' } - App级
build.gradle替换插件和依赖:apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' dependencies { // 移除旧的Fabric Crashlytics依赖 // implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' // 添加Firebase Crashlytics implementation 'com.google.firebase:firebase-crashlytics:18.6.2' implementation 'com.google.firebase:firebase-analytics:21.3.0' }
迁移完成后重新打包测试,基本能解决证书信任问题。
- 项目级
处理企业网络/自定义CA证书场景
如果你的应用是在企业内网环境下运行,网络中存在自定义CA证书拦截SSL连接,需要让应用信任这些证书:- 在
res/xml目录创建network_security_config.xml:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="false"> <trust-anchors> <!-- 信任系统默认证书 --> <certificates src="system" /> <!-- 信任用户安装的企业CA证书 --> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config> - 在
AndroidManifest.xml的<application>标签中配置:<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
- 在
排除网络代理/VPN干扰
临时关闭设备上的代理工具或VPN,切换到普通移动数据或公共Wi-Fi测试。有些代理会替换SSL证书,导致应用无法验证Crashlytics的原始证书,从而触发信任锚点错误。检查设备系统时间
这个细节很容易被忽略:如果设备的系统时间和实际时间偏差过大(比如差几个月),SSL证书的有效期验证会失败,也会抛出这个错误。确保设备时间设置为自动同步状态。
内容的提问来源于stack exchange,提问作者Piotr Temp

