3、初始化阶段常见崩溃类型概述
说实话,做了这么多年 Android 开发,每次遇到启动崩溃心里还是一紧。特别是 OkHttp 初始化这块,出问题往往非常隐蔽。你想想看,整个应用的网络请求都指望它,它要是没站稳,后面全是连锁反应。
我个人习惯把 OkHttp 的初期崩溃先分个类。不是所有崩溃都长得一样,处理方式也不同。今天咱就系统性盘一盘,这些崩溃到底是怎么回事。
核心思路: 先分类,再定位,最后对症下药。别上来就埋头看日志,效率太低。
崩溃类型速查表
| 崩溃类型 | 典型异常 | 核心原因 | 排查要点 |
|---|---|---|---|
| NPE | NullPointerException | 拦截器或 EventListener 中使用了未初始化的依赖 | 检查自定义组件的构造时机 |
| 状态异常 | IllegalStateException | Dispatcher 或 ConnectionPool 已被 shutdown | 查看客户端单例的生命周期 |
| 原生库异常 | UnsatisfiedLinkError | Conscrypt / BoringSSL 原生库加载失败 | 检查 Security.insertProviderAt 的调用点 |
| 平台兼容 | ExceptionInInitializerError | 反射平台 API 失败(如 InetAddress) | 关注 Android 版本适配和定制 ROM |
| 死锁 / ANR | 无明确异常,主线程卡死 | 主线程同步请求 + 调度器锁竞争 | 检查 Application.onCreate 中的网络调用 |
NullPointerException:最常见的「初始化三连」
说白了,NPE 在初始化阶段出现,大部分情况下是因为你的自定义组件没准备好。可能是因为依赖注入框架还没初始化,也可能是 Builder 漏掉了关键配置。
举个具体的例子。有些朋友喜欢在自定义 Interceptor 里访问全局缓存对象,但那个对象可能还没被赋值。
// 错误写法示例
class CustomInterceptor implements Interceptor {
private Cache cache; // 可能为 null
public CustomInterceptor(Cache cache) {
this.cache = cache; // 如果传入 null,后续调用直接崩溃
}
@Override
public Response intercept(Chain chain) throws IOException {
//