前言
做海外业务的工程师,最容易踩坑的地方不是 UI,而是网络。弱网、高延迟、跨运营商、跨境链路——都比国内的直连情况复杂得多。本篇聊 HTTP/3、QUIC、海外连接池、SDK 选型,以及弱网下的工程策略。
一、海外网络的核心挑战
每个点都需要单独的工程策略。
二、HTTP/3 与 QUIC:海外的首选协议
2.1 为什么 QUIC
连接复用:0-RTT 握手,丢包恢复
多路复用:解决 HTTP/2 的队头阻塞
加密:自带 TLS 1.3
抗丢包:更好的恢复算法
QUIC 的握手在 TCP+TLS 之上省 1-3 个 RTT(每个 200ms = 3 次 RTT 就省 600ms)。
2.2 OkHttp + QUIC
// build.gradle.kts
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.okhttp3:okhttp-quic:1.0.0")
// 通过 cronet 或者 OkHttp 走 QUIC
val client = OkHttpClient.Builder()
.pingInterval(20, TimeUnit.SECONDS)
.build()
注意:QUIC 在 Android 上需要自己集成 cronet 或 OkHttp 5.x + QUIC support。
2.3 Cronet(Google 的网络库)
implementation("org.chromium.net:cronet-api:0.0.1")
val cronetEngine = CronetEngine.Builder(context)
.enableHttp3(true)
.enableBrotli(true)
.setUserAgent("MyApp/1.0")
.build()
val urlRequest = cronetEngine.newUrlRequestBuilder(
"https://api.example.com/v1/data",
callback, executor
).setHttpMethod("GET").build()
Cronet 支持 QUIC、HTTP/3、Brotli,是海外工程的首选。
三、海外连接策略
3.1 多线路重试
val networkTypes = listOf(
"Global_via_Cloudflare",
"Direct_via_Akamai",
"Asia_via_Alibaba"
)
suspend fun fetchWithFallback(url: String): Result {
for (net in networkTypes) {
runCatching { tryNetwork(net, url) }
.onSuccess { return@fetchWithFallback it }
.onFailure { /* 重试 */ }
}
return Result.Error("All paths failed")
}
海外的 HTTP API gateway 通常提供多个线路。
3.2 Smart Connect
class SmartConnector {
private val healthyLines = mutableMapOf<String, LatencyStats>()
private val warm = ConcurrentHashMap<String, AtomicLong>()
fun pickBestLine(domain: String): String {
// 用过去 60 秒内的平均延迟
val stats = healthyLines.filterKeys { it.contains(domain) }
if (stats.isEmpty()) return "default"
return stats.minByOrNull { it.value.avgLatency }!!.key
}
fun report(line: String, latency: Long, success: Boolean) {
// 更新 health stats
...
}
}
后台轮询探测多个线路,把"低延迟 + 高成功率"的挑选为默认。
四、DNS 优化
4.1 DNS 解析慢是海外延迟大头
普通 DNS + 多次重试 = 1-2 秒延迟。技术方案:
4.2 OkHttp + DoH
val client = OkHttpClient.Builder()
.dns(object : Dns {
override fun lookup(hostname: String): List<InetAddress> {
return DoHResolver.lookupOverHttps(hostname)
}
})
.build()
实测能把 DNS 时间从 200ms+ 降到 50ms。
4.3 HTTPDNS
使用阿里云、腾讯云的 HTTPDNS 服务:
suspend fun httpDnsLookup(host: String): List<InetAddress> {
val resp = client.newCall(Request.Builder()
.url("https://dns.alidns.com/resolve?host=$host")
.build()).execute()
val json = JSONObject(resp.body!!.string())
return json.getJSONArray("ip").let { arr ->
(0 until arr.length()).mapNotNull {
InetAddress.getByName(arr.getString(it))
}
}
}
HTTPDNS 是海外场景最有用的优化之一。
五、海外 CDN 选型
建议主力 CloudFront + 备份 Cloudflare。
5.1 缓存策略
// Cache-Control 在海外更重要
Cache-Control: public, max-age=3600
Cache-Control: private, no-cache
Cache-Control: no-store
地区差:
印度、东南亚:max-age 减半(信号不稳)
美/欧:max-age 长一些
六、弱网适配策略
6.1 弱网识别
class NetworkQualityDetector(context: Context) {
private val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
fun detect(): NetworkQuality {
return when (cm.activeNetwork) {
null -> NetworkQuality.NONE
else -> {
val capabilities = cm.getNetworkCapabilities(cm.activeNetwork!!)
when {
capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> {
val signal = capabilities.signalStrength
if (signal < -100) NetworkQuality.WEAK
else if (signal < -85) NetworkQuality.MEDIUM
else NetworkQuality.GOOD
}
capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> {
NetworkQuality.GOOD
}
else -> NetworkQuality.MEDIUM
}
}
}
}
}
6.2 弱网下的业务策略
6.3 重试与超时
class NetworkRetryPolicy {
fun configureRetrofit(builder: OkHttpClient.Builder) {
builder.addInterceptor(RetryAndFollowUpInterceptor(maxRetries = 3))
.callTimeout(20, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
}
}
// 智能重试
fun shouldRetry(e: IOException, attempt: Int): Boolean {
return attempt < 3 && (e is SocketTimeoutException || e is ConnectException)
}
// 退避
fun backoffMs(attempt: Int): Long {
return (1L shl attempt) * 500L + Random.nextLong(100, 300)
}
七、海外落地清单
工程上出海前,要准备这些:
八、海外网络问题排查工具
// Stetho 加速调试
if (BuildConfig.DEBUG) {
Stetho.initializeWithDefaults(this)
}
九、未来一年值得关注的演进
HTTP/3 普及:Cloudflare、Fastly 大量服务切到 HTTP/3
Edge Computing:边缘函数(Cloudflare Workers、Lambda@Edge)让交互能力前推
5G 通信:AR、VR 实时性更好,但海外 5G 覆盖仍不平衡
WebRTC over QUIC:实时音视频用 QUIC 替代 WebRTC 底层
AI-on-edge:AI 处理就近完成,减少往返
十、海外业务的工程红线
每个海外 App 上市前,过 1 次 EU DPA 审核。
小结
海外网络优化,第一原则是减少 RTT——能减少一次 RTT 就减少一次。QUIC、HTTP/3、HTTPDNS、多线路 fallback,都围绕这一个目标。弱网要识别、要退让——不能让用户从 4G 切到 GPRS 就直接白屏。
下一篇是大结局:Android 应用瘦身——从 100MB 到 20MB 的完整实战。这是系列到 100 篇的最后一篇,全面拆解包大小优化的所有方法。
参考阅读
Cronet Android 文档
HTTP/3 Explained(Daniel Stenberg)
Akamai、Cloudflare、Fastly 网络优化指南