字节火山AI网关一面凉经
1、你对KMP这套东西怎么理解?
KMP 的核心是一套 Kotlin 公共业务和UI代码,可编译运行于 Android、iOS、鸿蒙等多个平台,同时将平台独有的 系统能力保留为原生实现。
和其他跨端方案对比
(1)KMP vs Flutter
- Flutter:UI + 逻辑全部 Dart 自绘,自带渲染引擎,一套 UI 多端;包大、原生交互复杂,平台能力需要 MethodChannel 桥接。
- KMP:只共享业务逻辑,UI 原生;无独立渲染引擎,包体积小,和原生代码无缝互通;UI 无法复用,两端 UI 代码各自维护。
UI 代码一份共用,Android 原生渲染,iOS / 桌面 Skia 自绘。同时 CMP 支持原生与跨端页面互相嵌入,可以渐进接入现有项目,这是相比 Flutter 很大的优势。
(2)KMP vs React‑Native
RN 用 JS 桥调用原生,存在 JS 和原生通信开销; KMP 是编译到平台本地代码:Android 编译成 Java 字节码,iOS 编译成二进制 Framework,没有 JS 桥,性能更好。
(3)KMP vs 传统 Android+iOS 双原生
传统双端:业务逻辑写两份(Kotlin+Swift),逻辑容易不一致,需求要两边同步改;
KMP 核心收益:业务只维护一份,减少重复开发,统一业务规则。
2、KMP的优势主要在什么地方?不足是什么?
优势:
性能接近原生:Android 编译成 JVM 字节码;iOS 通过 Kotlin/Native 编译为二进制 Framework;UI使用原生渲染;
UI 和业务代码都能在 common 模块中复用,一套代码同时覆盖 Android 和 iOS 两端,开发人员只需掌握 Kotlin 一门语言即可完成跨端业务开发,既节省了人力成本,也降低了团队的学习门槛。新成员加入时无需同时熟悉 Kotlin 和 Swift 两套技术栈,上手更快,团队协作也更顺畅。
渐进式接入原生:KMP 支持渐进式接入存量原生项目,可以在原生工程中逐步引入跨端模块,实现原生和跨端混合开发。团队无需一次性推倒重来,而是可以按模块、按页面逐步迁移,每步改造都能独立验证,改造风险小,也方便在迁移过程中随时回退。
保留原生平台能力:系统 SDK、原生第三方库都可以在 KMP 中直接调用,无需像其他跨端方案那样通过桥接层中转,既减少了性能损耗,也降低了接入复杂度。同时 Kotlin 多平台生态已经比较成熟,官方和社区提供了丰富的工具链与库支持,开发体验和工程化能力都有保障。
劣势:
系统原生能力仍然需要跨端实现,UI依赖各平台原生控件映射,Android/iOS/ 鸿蒙控件表现存在差异,很难实现像素级 UI 统一;
框架较新,生态不如 Flutter 完善,鸿蒙侧第三方组件偏少;
iOS、鸿蒙侧调试难度较大;
3、从KMP的编译原理上说一下怎么解决性能问题吗?
静态编译:Kotlin 代码在 Android 编译为 JVM 字节码,在 iOS 通过 Kotlin/Native 编译为机器码,不依赖 JS 引擎。
原生渲染:最终映射为各平台原生 View,由原生 UI 系统完成布局、绘制和事件处理。
低通信开销:避免传统 JS Bridge 的频繁序列化和跨线程通信,通过批量渲染指令降低交互成本。
增量更新:通过状态依赖追踪和视图树 Diff,只更新发生变化的节点。
例如页面只有一个点赞数字从 10 变成 11:
状态依赖追踪知道只有数字文本依赖点赞数。
因此只重新计算并更新这个 Text 节点。
其他图片、按钮和列表都不重新创建。
视图树 Diff 再比较新旧节点,把“文本变了”转换成一条原生更新指令。
首屏优化:TurboDisplay 可缓存渲染指令,下次启动直接复用,减少业务执行和视图树构建耗时。
正常打开页面需要经历:
执行业务代码 → 构建视图树 → 生成渲染指令 → 原生渲染
TurboDisplay 首次渲染后,会把可复用的首屏渲染结果缓存下来。下次打开时可以先读取缓存,直接让原生端绘制:
读取缓存的渲染指令 → 原生渲染
因此用户能更快看到首屏。之后业务代码正常运行,再通过 Diff 修正缓存画面与最新数据之间的差异。减少重复计算。
4、现在有AI agent可以自动写代码,那KMP还有必要吗?
选KMP,主要一是为了减少重复代码,二是为了保证逻辑唯一、行为一致。
第一层价值,AI能够顺利完成,也能够很快把UI和业务翻译,AI主要是在语法层面,体力活;
第二层价值,AI替代不了,AI能够实现语法、文本翻译,但不是语义层面,长期维护两份代码,长期迭代下来,容易出现语义漂移、行为不一致的问题,会出现逻辑分叉,人工成本也会提高,主要关注的是长期可维护性和逻辑一致。
5、登录、网关、身份鉴权都是标准化东西,为什么每个接入都得这么费劲?
对网络优化这一块有接触吗?
鉴权走短连HTTP,底层网络传输过程你了解吗?
客户端SDK发HTTP请求,网络库要做哪些事情?
我问的是传输层的东西,你了解吗?
那你说说看(传输层基础知识)。
建TCP连接之前要做什么?拿到域名怎么才能TCP建连?
建完TCP之后呢?
要保证传输安全性,要做什么事?
不会被劫持怎么办?
应用层具体用什么手段保证安全?
HTTPS比HTTP多了什么步骤?
TLS握手过程是什么样的?
HTTP是有状态的协议吗?
除了token还有什么方式保证状态?
C++是在学校做的项目吗?实习中没用到吧?
高并发缓存系统里LRU是用C++写的吗?还是用开源库?
用C++把LRU写一下。
在main函数里写测试代码就行。
讲一下你的代码思路。
get接口不会改变使用频率,是吧?
链表为什么自己写node指针?为什么不用STL?
如果用list容器该怎么做?
用list要改哪些地方?怎么改?
为什么一开始要这么麻烦地自己写?
哈希表map和红黑树map的区别是什么?
数据量不大时用哈希更好,是吧?
有哈希碰撞时用unordered_map更好?
怎么判断数据量足够大到可能出现哈希碰撞?
更多推荐




所有评论(0)