解决OKhttp在Android11上运行时异常Expected Android API level 21+ but was 30

本文探讨了在Android 11系统中项目因旧版OKhttp3引发的运行时闪退问题,提供了升级至3.14.9版本以兼容并保持工具类稳定的方法,重点在于适配策略和版本选择。

一、运行时异常

应用在安卓11系统版本上运行时闪退,在其他低版本的系统能正常运行,异常如下:

运行时异常错误信息

看提示是使用okhttp3的时候报错了。

原因是由于我在项目中使用的OKhttp版本低,没有适配Android11的原因。

二、解决办法

将项目引用的OKhttp3版本号换成最新版本OKhttp Tags

由于个人项目中有工具类使用了旧版OKhttp的api,短时间内不能直接升级到最新OKhttp版本。所以我选择了相对较新,能适配Android11又不用修改工具类代码的版本3.14.9

这个问题的根本原因在于 OkHttp 的某些版本在 Android API level 19(即 Android 4.4)上运行,会尝试加载仅在 API level 21Android 5.0)及以上才支持的类或方法,从而导致 `java.lang.IllegalStateException: Expected Android API level 21+ but was 19` 的异常OkHttp 从版本 4.x 开始逐步移除了对旧版 Android(如 API level 19)的支持,特别是在其内部的 `AndroidPlatform` 类中,它会检查当前运行API level。如果检测到低于 21 的版本,则会抛出异常,阻止客户端继续运行。这是为了确保使用现代 TLS 版本和更安全的网络通信[^3]。 ### 解决方案 1. **降级 OkHttp 版本** 如果项目必须支持 Android 4.4(API level 19),可以考虑降级到支持 API level 19 的 OkHttp 版本,例如使用 OkHttp 3.x 系列。OkHttp 3.x 仍然兼容 Android 4.4,并且可以与 Retrofit 2.x 配合使用。 ```gradle implementation 'com.squareup.okhttp3:okhttp:3.12.0' ``` 2. **使用 OkHttp 官方提供的兼容性补丁** OkHttp 官方提供了一个兼容性库 `okhttp-tls`,用于支持旧版本 Android 上的现代 TLS 协议。对于希望继续使用 OkHttp 4.x 的项目,可以尝试引入以下依赖: ```gradle implementation 'com.squareup.okhttp3:okhttp-tls:4.x.x' ``` 但需注意,即使使用该库,OkHttp 4.x 也可能仍然不完全兼容 API level 19,因为某些底层类已被移除或修改[^3]。 3. **使用反射绕过 API level 检查(不推荐)** 可以通过反射修改 `AndroidPlatform` 类中的初始化逻辑,跳过 API level 的检查。这种方式属于“黑科技”,可能带来稳定性风险,且随着 OkHttp 版本更新容易失效。 4. **放弃对 API level 19 的支持** 如果产品用户群体中使用 Android 4.4 的比例极低,建议直接将 `minSdkVersion` 设置为 21,以避免此类兼容性问题,并享受更现代的网络栈和更安全的通信协议。 ### 推荐做法 对于需要长期维护和安全更新的项目,建议逐步放弃对 Android API level 19 的支持,并将 `minSdkVersion` 提升至 21 或更高。这将减少因兼容性问题带来的维护成本,并提升应用的整体安全性与性能。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值