Retrofit 1.9+OkHttp 2.4.0在Android4.2.2设备上无法启用HTTP/2求助
这个问题的核心原因和Android系统底层的TLS协议支持直接相关,咱们一步步拆解清楚:
1. HTTP/2依赖ALPN,而Android 5.0之前的系统没有这个能力
HTTP/2要在TLS握手阶段完成协议协商,必须用到ALPN(应用层协议协商)——这是HTTP/2标准强制要求的协商机制。但Android 4.2.2(API 17)的系统TLS栈基于旧版本的OpenSSL,完全没有实现ALPN功能。没有ALPN,OkHttp就没法和服务器协商使用HTTP/2,只能自动降级到HTTP/1.1,这就是你看到OkHttp-Selected-Protocol: http/1.1日志的根本原因。
2. OkHttp 2.x对旧Android的HTTP/2支持存在限制
你使用的OkHttp 2.4.0虽然已经加入了HTTP/2支持,但它在Android设备上依赖系统原生的TLS栈来提供ALPN能力。由于Android 5.0以下系统缺失ALPN支持,OkHttp 2.x在这些设备上完全无法启用HTTP/2,没有任何变通空间——除非你升级OkHttp版本。
3. 关于SPDY的补充说明
你提到有人说Android 5.0前不支持SPDY,这个说法不完全准确:早期Android(4.0+)的系统HttpURLConnection是支持SPDY的,但OkHttp 2.x在旧设备上如果依赖系统TLS栈,SPDY确实可能可用。不过这对你的场景没用,因为你的服务器已经禁用了SPDY,而且咱们的核心问题是HTTP/2的支持,和SPDY关联不大。
可行的解决方案
如果你的业务必须在Android 4.2.2设备上使用HTTP/2,有两个关键步骤:
- 升级OkHttp到3.x及以上版本(建议选用3.12.x这类稳定版,它仍支持Android 4.0+)
- 集成
Conscrypt库,它会替换系统的TLS栈,提供ALPN支持,让OkHttp可以在旧Android设备上完成HTTP/2的协议协商
如果暂时没法升级依赖,那只能接受在Android 5.0以下设备上使用HTTP/1.1,或者针对Android 5.0+的设备单独启用HTTP/2优化。
内容的提问来源于stack exchange,提问作者Bajrang Hudda

