KNOI 架构详细分析报告

KNOI 架构详细分析报告

1. 整体架构

1.1 架构图

graph TD subgraph 开发工具链 A[KNOI Gradle Plugin] -->|配置生成| B[KSP 处理器] B -->|代码生成| C[TypeScript 接口] B -->|注解处理| D[Kotlin 实现类] end subgraph 运行时核心 E[Kotlin 核心库] <-->|NAPI 桥接| F[C++ 适配层] F <-->|ArkTS NAPI| G[ArkTS 运行时] E --> H[服务注册中心] E --> I[类型转换引擎] end subgraph 应用层 J[Kotlin 业务模块] -->|依赖| E K[ArkTS UI 模块] -->|调用| G J -->|同一侧调用| J K -->|同一侧调用| K end A -->|依赖注入| E J -->|服务注册| H K -->|服务发现| H

2. 跨语言交互模型

2.1 调用模式全梳理

2.1.1 双向跨语言调用

ArkTS → Kotlin

kotlin:%2FUsers%2Fhfq%2Fcodes%2FKuiklyBase-components%2Fknoi%2Fdocs%2Fservice.md 复制代码
@ServiceProvider
open class TestServiceB {
    fun methodWithCallbackReturnCallback(a: (Array<JSValue>) -> Unit): ((Array<JSValue>) -> String) {
        a.invoke(arrayOf(ktValueToJSValue(getEnv(), "result", String::class)))
        return { "callback result" }
    }
}

Kotlin → ArkTS

typescript:%2FUsers%2Fhfq%2Fcodes%2FKuiklyBase-components%2Fknoi%2Fdocs%2Ffunction-zh.md 复制代码
bind("testCallback", (callback: (String) => Unit) => {
  callback("arkts_callback_response")
  return (data: String) => data + "_processed"
})
2.1.2 同一侧调用

Kotlin 调用 Kotlin 服务

kotlin:%2FUsers%2Fhfq%2Fcodes%2FKuiklyBase-components%2Fknoi%2Fdocs%2FserviceDiscover-zh.md 复制代码
// 同进程内服务调用
val result = KNOI.get<TestServiceBApi>().methodWithIntReturnInt(1)

ArkTS 调用 ArkTS 函数

typescript:%2FUsers%2Fhfq%2Fcodes%2FKuiklyBase-components%2Fknoi%2Fdocs%2Ffunction.md 复制代码
// 直接函数调用(无需 KNOI 桥接)
function localCallDemo() {
  const handler = () => console.log("arkts_local_callback")
  handler()
}

2.2 回调机制详解

2.2.1 跨语言回调传递

1. ArkTS 传递回调给 Kotlin

typescript 复制代码
// ArkTS 侧注册带回调参数的函数
bind("withCallback", (callback: (String) => Unit) => {
  callback("from_arkts")
})
kotlin 复制代码
// Kotlin 侧调用并接收回调
invoke<Unit>("withCallback") { result: String ->
  info("Kotlin received: \$result")
}

2. Kotlin 返回回调给 ArkTS

kotlin 复制代码
// Kotlin 侧定义返回函数类型的方法
fun getCallback(): (String) -> String {
  return { it + "_from_kotlin" }
}
typescript 复制代码
// ArkTS 侧调用并执行回调
const callback = service.getCallback()
const result = callback("input") // 结果: input_from_kotlin
2.2.2 回调生命周期管理
typescript:%2FUsers%2Fhfq%2Fcodes%2FKuiklyBase-components%2Fknoi%2Fdocs%2Fpref-zh.md 复制代码
// 最佳实践:单回调绑定 + Kotlin 侧分发
let singleCallback: (data: String) => void

bind("registerListener", (cb: (data: String) => void) => {
  singleCallback = cb
})

// ArkTS 内部事件触发时
singleCallback("event_data")

3. 性能优化策略

3.1 回调缓存机制

kotlin:%2FUsers%2Fhfq%2Fcodes%2FKuiklyBase-components%2Fknoi%2Fdocs%2Fpref.md 复制代码
// Kotlin 侧缓存回调实例
object CallbackCache {
    private var cachedCallback: (String) -> Unit = {}

    fun setCallback(cb: (String) -> Unit) {
        cachedCallback = cb
    }

    fun triggerCallback(data: String) {
        cachedCallback(data)
    }
}

3.2 线程模型优化

调用场景 线程切换策略 性能影响
主线程 → 主线程 无切换 低延迟(推荐)
子线程 → Worker 线程 自动负载均衡 高并发场景首选
主线程 → Worker 线程 禁止(会触发运行时异常) 需避免

4. 典型调用场景示例

4.1 跨语言回调链

sequenceDiagram participant AT as ArkTS participant K as Kotlin AT->>K: 调用 methodWithCallback( (res) => { ... } ) K->>K: 处理业务逻辑 K->>AT: 执行回调函数(res="processed") AT->>AT: 本地处理回调结果

4.2 同一侧服务组合

graph LR A[ServiceA] -->|本地调用| B[ServiceB] B -->|本地调用| C[ServiceC] C -->|返回结果| B B -->|返回结果| A

5. 最佳实践指南

  1. 优先本地调用:同一语言内优先直接调用,避免不必要的跨语言桥接
  2. 回调精简原则:跨语言回调链不超过2层,复杂逻辑通过服务拆分实现
  3. 缓存策略:静态数据和高频回调在Kotlin侧缓存()
  4. 线程匹配:子线程调用优先匹配Worker线程注册的服务实例

注:完整类型转换表和异常处理机制见原文档章节3.1和4.2

相关推荐
张居斜4 小时前
GitHub Actions + 阿里云 OSS:OIDC 免密同步构建产物
github·oss·llm-wiki
用户3228360084477 小时前
python-rapidjson:用 C++ 速度处理 JSON 的 Python 库
github
逛逛GitHub8 小时前
4 个比较实用的 GitHub 开源项目,浅浅的收藏一波。
github
Hommy888 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
2601_9618451511 小时前
粉笔行测5000题电子版|pdf|解析
pdf·新媒体运营·github·个人开发·内容运营·规格说明书·极限编程
用户7735300845114 小时前
gorillamux:Go语言路由库的实用选择
github
BBWEYY终身尊贵会员15 小时前
2026年6月四款建站工具怎么选?BBWEYY、比文云、GitHub Copilot、Dreamweaver 简明对比
github·copilot·dreamweaver
DogDaoDao15 小时前
【GitHub】CL4R1T4S:AI 系统提示词的透明革命
人工智能·python·ai·大模型·github·ai agent·cl4r1t4s
CHENG-JustDoIt15 小时前
AI工具 | 爆火开源项目Odysseus AI 工作台:从项目介绍、部署情况及其使用等多方位分析指南(含详细步骤)
大数据·人工智能·windows·python·ai·开源·github
MicrosoftReactor15 小时前
技术速递|从一次性提示到标准化工作流:如何在 GitHub Copilot CLI 中使用自定义智能体
github·copilot·cli·智能体