Administrator
发布于 2026-08-26 / 46 阅读
0
0

系列文章《Android 工程师的 100 篇进阶笔记》第 89 篇:Android 海外网络优化:连接策略、协议选择与弱网适配

前言

做海外业务的工程师,最容易踩坑的地方不是 UI,而是网络。弱网、高延迟、跨运营商、跨境链路——都比国内的直连情况复杂得多。本篇聊 HTTP/3、QUIC、海外连接池、SDK 选型,以及弱网下的工程策略。

一、海外网络的核心挑战

挑战

国内

海外

链路质量

内网直连

跨洲链路,丢包率高

网络延迟

30-80ms

200-500ms(跨境)

运营商分布

三大

数十个

政策

简单

数据出端合规、隐私法律、GCD

DNS

单一

多区域 + 跨境污染

CDN

国内厂商

全球厂商(Akamai、Cloudflare)

每个点都需要单独的工程策略。

二、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 秒延迟。技术方案:

方案

特点

阿里 DNS + DoH

国内厂,海外 CDN 友好

Google DNS over HTTPS

国内访问可能受限

Cloudflare 1.1.1.1

全球服务,国内受限

自定义 Resolver

在客户端做权威服务器查询

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 选型

厂商

优势

节点

Akamai

全球覆盖好

亚美欧都强

Cloudflare

免费 + 反代 API

边缘节点多

Fastly

Varnish 配置灵活

美/欧主流

AWS CloudFront

与 AWS 服务集成

全球

Azure Front Door

与 Azure 集成

全球

阿里云海外

国内出海首选

东南亚强

建议主力 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 弱网下的业务策略

业务

弱网策略

图片

显示占位 + 缩略图先拉,原图延后

视频

切换 360p 码流

列表

减少一次性请求条数(10 → 5)

上传

切片大小减半(5MB → 2MB)

直播

切到低分辨率 + 降低码率

长轮询

增加间隔(5s → 30s)

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)
}

七、海外落地清单

工程上出海前,要准备这些:

项目

工程实现

网络库

OkHttp + Cronet(QUIC)

DNS

HTTPDNS(阿里/腾讯)

协议

优先 HTTP/3 / QUIC

多线路

多 gateway,智能选择

CDN

Cloudflare / CloudFront

配置

不同地区(id-ID / ja-JP / en-US)独立

时区

系统时区 + 业务时区双轨

国际化

strings.xml + locale-aware

隐私合规

GDPR / CCPA 弹窗

本地化推送

FCM(需海外手机)

崩溃监控

Crashlytics 或自建

八、海外网络问题排查工具

工具

用法

Stetho

OkHttp 网络请求可视化

Charles

抓包调试(需 VPN)

Stetho + Frida

高级调试

iperf3

测链路带宽

traceroute

路径分析

Wireshark

协议分析

// Stetho 加速调试
if (BuildConfig.DEBUG) {
    Stetho.initializeWithDefaults(this)
}

九、未来一年值得关注的演进

  1. HTTP/3 普及:Cloudflare、Fastly 大量服务切到 HTTP/3

  2. Edge Computing:边缘函数(Cloudflare Workers、Lambda@Edge)让交互能力前推

  3. 5G 通信:AR、VR 实时性更好,但海外 5G 覆盖仍不平衡

  4. WebRTC over QUIC:实时音视频用 QUIC 替代 WebRTC 底层

  5. AI-on-edge:AI 处理就近完成,减少往返

十、海外业务的工程红线

红线

后果

没做 GDPR 弹窗

罚 4% 全球营业额

数据传给云端但未告知用户

直接通报

跨境数据传输无 SCC

罚

儿童数据未脱敏

重罚

推送 / 第三方 SDK 自启动

重罚

每个海外 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 网络优化指南


评论