简介:本文深入探讨跨平台技术、跨平台UI框架及Kotlin Multiplatform在bilibili的实践,分析其技术优势、架构设计及实际成效,为开发者提供可借鉴的跨平台开发经验。
在移动互联网早期,企业需为iOS、Android、Web等多个平台分别组建开发团队,导致代码重复开发、功能同步困难、维护成本高昂。例如,bilibili早期需维护两套独立的客户端代码,功能迭代时需同步修改两个仓库,不仅效率低下,还容易因平台差异引入bug。
跨平台技术的核心目标是“Write Once, Run Anywhere”(一次编写,多端运行)。其演进可分为三个阶段:
bilibili作为一家以视频社区为核心的平台,需同时支持iOS、Android、Web、桌面端(Windows/macOS)等多终端,跨平台技术成为其降本增效的关键。
| 框架 | 技术原理 | 优势 | 劣势 |
|---|---|---|---|
| React Native | JavaScript桥接原生组件 | 社区活跃,学习成本低 | 性能瓶颈,复杂动画支持差 |
| Flutter | 自绘引擎(Skia) | 性能接近原生,UI一致性高 | 包体积大,学习曲线陡峭 |
| Kotlin Multiplatform | 共享逻辑层+原生UI | 逻辑100%复用,UI完全原生 | 需配合各平台UI框架使用 |
bilibili在选型时需权衡开发效率、性能、维护成本等因素。例如,Flutter虽能实现UI一致性,但包体积增加可能影响用户下载意愿;React Native的桥接机制在复杂交互场景下易出现卡顿。
bilibili最终采用“Kotlin Multiplatform + 各平台原生UI”的方案,原因如下:
Kotlin Multiplatform(KMP)是JetBrains推出的跨平台开发框架,其核心设计包括:
commonMain目录编写跨平台代码,iosMain/androidMain等目录编写平台特定代码。bilibili选择KMP的原因在于:
bilibili将跨平台代码划分为三类模块:
示例代码(共享网络层):
// commonMain/src/NetworkClient.ktexpect class NetworkClient {suspend fun fetchVideoInfo(videoId: String): VideoInfo}// androidMain/src/NetworkClient.ktactual class NetworkClient {actual suspend fun fetchVideoInfo(videoId: String): VideoInfo {return HttpClient(Android).get("https://api.bilibili.com/video/$videoId")}}// iosMain/src/NetworkClient.ktactual class NetworkClient {actual suspend fun fetchVideoInfo(videoId: String): VideoInfo {return URLSession.shared.dataTask(with: URL(string: "https://api.bilibili.com/video/$videoId")!) { data, _, _ in// 解析数据}}}
bilibili通过以下方式保障跨平台代码质量:
expect/actual机制抽象平台特定逻辑,例如:
expect fun requestCameraPermission(): Booleanactual fun requestCameraPermission(): Boolean {// Android实现return ActivityCompat.checkSelfPermission(...) == PERMISSION_GRANTED}
--incremental)。bilibili计划进一步扩大KMP的应用范围,包括:
跨平台技术已成为bilibili高效迭代、快速响应用户需求的核心支撑。通过Kotlin Multiplatform,bilibili在保障多端体验一致性的同时,显著降低了开发成本,为行业提供了可复制的跨平台实践范本。