Kuikly Network¶
Kuikly Network 是面向 KMP 与 Kuikly 的模块化网络库。接口、请求参数、返回类型和策略写在同一个 Contract 中;Android 使用 Retrofit/OkHttp,iOS 使用 NSURLSession,鸿蒙通过 Kuikly 原生模块接入 NetworkKit。公共层不依赖 Activity、ViewModel 或具体业务。
模块¶
| 模块 | 职责 | 是否必选 |
|---|---|---|
network-core |
类型化调用、协程/Flow、序列化、缓存、韧性、安全、指标及双端引擎 | 是 |
network-ksp |
编译期生成 Retrofit 风格接口实现,不使用运行时反射 | 使用注解接口时 |
network-kuikly |
Kuikly Pager 生命周期、任务取消和旧 JSON 调用兼容层 | Kuikly 页面 |
network-inspector |
有界、脱敏、只保留内存的请求交换快照 | 调试环境 |
network-koin |
可覆盖 Engine 的 Koin 模块 | 使用 Koin 时 |
network-realtime |
SSE 增量解析与平台无关 WebSocket SPI | 实时业务 |
network-testing |
确定性脚本 Engine、离线/超时/延迟场景 | 测试 |
network-bom |
对齐全部发布物版本 | 推荐 |
network-ohos |
可发布的 OHPM 源码包,提供 NetworkKit/Kuikly 原生桥接 | 鸿蒙宿主 |
能力矩阵¶
| 等级 | 已完成能力 |
|---|---|
| P0 | GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS、Path/Query/Header、JSON/Form/Multipart/ByteArray、Kotlin Serialization、Android Gson、自定义 Converter、统一成功/失败、协程取消、冷 Flow 单向状态、链式操作符 |
| P1 | 有界缓存、Cache First/Network First/Cache Only/SWR/过期兜底、标签精确失效、请求合并、并发背压、优先级队列、限流、重试预算、三态熔断、Cookie、内容协商、受控重定向 |
| P2 | Android/iOS 传输、上传/下载进度、动态 HTTPS URL、响应大小边界、TLS/证书 Pin 轮换、认证单飞刷新、脱敏 Inspector、滚动指标、轮询/批量/并行编排、SSE/WebSocket SPI |
| P3 | Kuikly 生命周期适配、Koin、测试工件、Maven BOM/POM/可选签名、KMP ABI 快照、CI 门禁、基准脚本、鸿蒙 NetworkKit 桥接及后续平台 Engine 扩展点 |
最小接入¶
commonMain.dependencies {
implementation(platform("com.catchzoon.network:network-bom:0.1.1"))
implementation("com.catchzoon.network:network-core")
}
启用声明式接口的模块同时添加 network-ksp 到各编译目标。仓库内完整配置可参考
network-core/build.gradle.kts。
@Serializable
data class CardDto(val id: String, val title: String)
@NetworkService
interface CardApi {
/** 获取卡片详情。 */
@GET("/v1/cards/{id}")
@Timeout(15)
@Cache(maxAgeSeconds = 60, tags = ["cards"])
fun detail(
@Path("id") id: String,
@RequestId requestId: String,
): NetworkCall<CardDto>
}
val api = client.createCardApi()
val state = api.detail(cardId, requestId)
.networkFirst(maxAgeSeconds = 60, staleIfErrorSeconds = 3600)
.retryWhen(NetworkRetryPolicy(maxAttempts = 3)) { it.retryable }
.timeout(15)
.asFlow()
生成器也支持 suspend NetworkResult<T>、Flow<NetworkState<T>> 和 suspend T。推荐让领域层保留
NetworkCall<T>,到 UI 边界再决定结果式、异常式还是状态流。
Kuikly 页面¶
宿主应优先在 Application/AppDelegate 创建应用级客户端。不同服务使用命名 Client,不需要把 Base URL 放进页面参数,也不需要在每个页面重复创建 Client:
NetworkClients.initialize(
defaultClient = createNetworkClient(BuildConfig.API_BASE_URL) {
commonHeaders(session::headers)
},
namedClients = mapOf(
"upload" to createNetworkClient(BuildConfig.UPLOAD_BASE_URL),
"analytics" to createNetworkClient(BuildConfig.ANALYTICS_BASE_URL),
),
)
@NetworkService(client = "upload") 生成的 createUploadApi() 会自动从注册表选择对应 Client;未声明
client 时使用 default。业务仍可使用 NetworkClients.client("upload") 直接取得 Client。
private val client by lazy {
createKuiklyNetworkClient(pager, BuildConfig.API_BASE_URL) {
defaultTimeout(20)
responseCache()
coalesceRequests()
limitConcurrency(maxConcurrentRequests = 8)
}
}
pager.launchRequest(api.detail(id, requestId), ::render, ::renderError)
override fun pageWillDestroy() {
pager.closeNetworkScope()
super.pageWillDestroy()
}
network-kuikly 负责把页面任务与底层客户端同时取消。非 Kuikly 调用方直接使用
NetworkClient.Builder,两者不会相互依赖。
应用级 Client 不应注册到页面 networkScope;页面只取消自己的协程,Repository/Application Scope 发起的
请求可以继续执行。HarmonyOS 内置 Bridge 当前仍需要活动的 Kuikly Pager,若要在页面销毁后继续执行,宿主
需要提供应用级 NetworkEngine,不能复用已经销毁页面的 Bridge。
平台边界¶
| 平台 | 传输实现 | 扩展方式 |
|---|---|---|
| Android | Retrofit 3 + OkHttp | 注入定制 OkHttpClient 或实现 NetworkEngine |
| iOS | NSURLSession Delegate | 使用公共 NetworkEngine 契约,不暴露 Foundation 给业务 |
| HarmonyOS | ArkTS NetworkKit + KRNetworkModule |
引用 @catchzoon/network-ohos;公共 Contract 与 KSP 接口不改 |
| 新平台 | 无预设依赖 | 实现 NetworkEngine.execute/cancelAll,或提供 Kuikly 原生模块 |
Gson 依赖 JVM 反射,只允许 Android 源集使用;跨端 DTO 默认使用 Kotlin Serialization。鸿蒙采用
Kuikly KBA 工具链,并使用 2.0.21-coroutines-KBA-001 与 1.7.1-KBA-003 的 OHOS KLib;
ArkTS 适配器单独作为 OHPM 包交付,不污染标准 Maven KMP 元数据。
安全默认值¶
- 动态绝对 URL 只接受 HTTPS,禁止用户信息、片段和控制字符。
- 重定向默认同源;跨域必须显式允许,且 Android/iOS 会移除鉴权与 Cookie 头。
- POST/PATCH 等非幂等请求只有提供 Idempotency-Key 或显式允许时才重试。
- Inspector 不保存正文,只记录字节数,并自动脱敏凭据、Cookie 和 token 查询参数。
- 默认限制响应体、并发队列、缓存项、重试次数和熔断探测,避免无限占用内存。
- Pin、密钥和仓库凭据只从部署配置注入,不写进源码。
验证¶
./gradlew :network-core:testDebugUnitTest \
:network-inspector:testDebugUnitTest \
:network-realtime:testDebugUnitTest \
:network-testing:testDebugUnitTest
./gradlew apiCheck
./scripts/benchmark_network.sh
./scripts/build_harmony.sh
./scripts/build_harmony.sh har
鸿蒙构建要求已安装 DevEco/OpenHarmony SDK,并设置 OHOS_SDK_HOME 或 DEVECO_STUDIO_HOME。
构建脚本会使用 Kuikly 官方 OHOS settings,并把 shared、network-core、network-kuikly 和
network-ksp 纳入同一个 KBA 编译图;缺少 SDK 时会在编译前给出明确提示。第二条命令会生成
携带 libshared.so 的 release HAR,使用方式见 HarmonyOS / HAR。