如何修复Android API21以下OkHttp/Retrofit的崩溃问题
嘿,这个问题我之前帮同事排查过,原因其实很直白:你用的OkHttp版本太高了,已经不支持API21以下的Android系统了。
从OkHttp 3.13版本开始,官方就把最低兼容的Android API版本提升到了21,而你当前使用的是3.14.x版本,所以在API19这类低版本设备上初始化OkHttpClient时,就会触发那个Expected Android API level 21+ but was 19的异常,直接导致启动崩溃。
下面给你两个可行的解决方案,优先推荐第一个,简单又靠谱:
方案1:降级OkHttp到支持低版本的稳定版
OkHttp 3.12.x系列是最后一批支持Android API 16+的版本,而且是稳定维护到最后的低兼容版本(最新版是3.12.13)。你只需要修改Gradle依赖,把OkHttp和对应的日志拦截器都替换成这个版本:
dependencies { // 替换原有的OkHttp相关依赖 implementation 'com.squareup.okhttp3:okhttp:3.12.13' implementation "com.squareup.okhttp3:logging-interceptor:3.12.13" // 其他依赖保持不变即可 }
这个版本完全适配你的API19设备,同时和Retrofit、RxJava2的配合也没有任何问题,不会影响你现有接口的逻辑。
方案2:启用Core Library Desugaring(不推荐,复杂度高)
如果你实在不想降级OkHttp,可以尝试启用Android的Core Library Desugaring功能,让低版本系统支持高版本的Java API,但这个配置比较繁琐,而且不一定能完全解决OkHttp底层的SSL API兼容性问题:
- 先在项目根目录的
build.gradle中添加desugar的构建依赖:
buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.0.0+' // 需要使用较新的Gradle版本 classpath 'com.android.tools.build:desugar_jdk_libs:2.0.4' } }
- 然后在app模块的
build.gradle中启用desugaring并添加依赖:
android { compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { coreLibraryDesugaring 'com.android.tools.build:desugar_jdk_libs:2.0.4' }
不过还是要提醒你,这种方法可能会引入其他未知的兼容性问题,所以除非你有必须使用高版本OkHttp的理由,否则优先选方案1。
另外确认一下:你用到的Retrofit 2.x最低支持API14,RxJava2最低支持API16,都能兼容API19,所以降级OkHttp后不会有依赖冲突的问题。
内容的提问来源于stack exchange,提问作者Jake warton

