
当你面临"需要同时开发 Android、iOS、鸿蒙(HarmonyOS)三端 App"的需求时,最常见的困境是:三套代码库、三支团队、三倍维护成本。本文介绍目前业界最完整的三端统一开发方案——腾讯开源的 Kuikly 框架,并给出从环境搭建到上线的完整最佳实践指南。
痛点 | 传统方案 | Kuikly 方案 |
|---|---|---|
代码重复 | Android/iOS/鸿蒙各写一遍 | 90%+ 代码共享 |
团队成本 | 需要 Android + iOS + ArkTS 三支团队 | Kotlin 团队即可覆盖三端 |
一致性维护 | 三端逻辑各自演进,容易出现差异 | 同一份业务逻辑,行为天然一致 |
鸿蒙支持 | 主流跨端框架均不支持鸿蒙原生渲染 | 正式支持 ArkUI 原生渲染 |
性能要求 | WebView/JS Bridge 方案性能不达标 | 原生二进制产物,性能与纯原生持平 |
Kuikly 是腾讯公司级前端团队推出的基于 Kotlin Multiplatform(KMP) 的跨平台 UI 与逻辑综合解决方案。
平台 | 支持状态 | 编译产物 | 渲染方式 |
|---|---|---|---|
Android | ✅ 正式支持 | .aar | FrameLayout 原生渲染 |
iOS | ✅ 正式支持 | .framework | UIView 原生渲染 |
HarmonyOS(鸿蒙) | ✅ 正式支持 | .so | ArkUI 原生渲染 |
Web / H5 | 🔵 Beta | .js | DOM 渲染 |
微信小程序 | 🔵 Beta | .js | 小程序 API 渲染 |
鸿蒙是核心差异化优势:Kuikly 通过 Kotlin/C 绑定桥接 ArkUI 原生视图体系,是目前唯一正式支持鸿蒙原生渲染的主流跨端框架。
Kuikly 采用「Kotlin 多平台 + 平台原生渲染」混合架构,核心思路是:用 Kotlin 写业务逻辑,让各平台用自己的原生组件渲染。
plaintext
┌──────────────────────────────────────────────────────┐
│ 业务代码层(Kotlin,commonMain) │
│ Compose DSL / Kuikly DSL │
├──────────────────────────────────────────────────────┤
│ KMP 跨平台共享层 │
│ expect/actual 机制 · Bridge 通信 │
├──────────────────────────────────────────────────────┤
│ 平台原生渲染层 │
│ Android → .aar(FrameLayout) │
│ iOS → .framework(UIView) │
│ HarmonyOS → .so(ArkUI) │
└──────────────────────────────────────────────────────┘项目目录结构:
plaintext
src/
├── commonMain/ # 跨平台共享代码(90%+ 代码在此)
│ └── kotlin/
│ └── com/example/
│ ├── pages/ # 页面
│ ├── components/ # 组件
│ └── data/ # 数据模型
├── androidMain/ # Android 平台特有实现
├── iosMain/ # iOS 平台特有实现
└── ohosArm64Main/ # HarmonyOS 平台特有实现工具 | 用途 | 版本要求 |
|---|---|---|
JDK | 基础编译环境 | 17+ |
Android Studio | 主 IDE + Kuikly 插件 | 推荐最新版(Gradle JDK 切换为 17) |
Xcode | iOS 编译 | 最新稳定版 |
CocoaPods | iOS 依赖管理 | sudo gem install cocoapods |
DevEco Studio | 鸿蒙编译 | 5.1.0+,API Version ≥ 18 |
安装 Kuikly 插件(强烈推荐):
plaintext
Android Studio → Settings → Plugins → Marketplace → 搜索 "Kuikly" → InstallKuikly 插件提供:
方式一:通过 Kuikly 插件(推荐)
plaintext
File → New → New Project → Kuikly Project Template
→ 选择 DSL 类型(Compose)
→ 勾选平台:Android ✅ iOS ✅ HarmonyOS ✅
→ 完成创建方式二:手动配置 Gradle
shared/build.gradle.kts:
kotlin
plugins {
kotlin("multiplatform")
id("com.google.devtools.ksp") version "1.9.22-1.0.17"
}
kotlin {
androidTarget()
iosArm64()
iosSimulatorArm64()
iosX64()
sourceSets {
val commonMain by getting {
dependencies {
implementation("com.tencent.kuikly-open:core:$kuiklyVersion")
implementation("com.tencent.kuikly-open:compose:$kuiklyVersion")
}
}
}
}
dependencies {
add("kspCommonMainMetadata", "com.tencent.kuikly-open:core-ksp:$kuiklyVersion")
}
// Kuikly 2.5.0+ 需要添加 maven 源
repositories {
maven("https://mirrors.tencent.com/nexus/repository/maven-tencent/")
}Android(androidApp/build.gradle.kts):
kotlin
dependencies {
implementation("com.tencent.kuikly-open:core-render-android:$kuiklyVersion")
}iOS(iosApp/Podfile):
ruby
source 'https://cdn.cocoapods.org/'
platform :ios, '14.1'
target 'iosApp' do
inhibit_all_warnings!
pod 'OpenKuiklyIOSRender', '$kuiklyVersion'
end或使用 SPM:
plaintext
https://github.com/Tencent-TDS/KuiklyUI.gitHarmonyOS(ohosApp/hvigor/hvigor-config.json5):
json
{
"dependencies": {
"kuikly-ohos-compile-plugin": "latest"
}
}kotlin
// commonMain:只需一个注解,KSP 编译时自动生成路由注册代码
@Page(name = "homePage")
class HomePage : ComposeContainer() {
@Composable
override fun Content() {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(
text = "Hello, 三端统一!",
fontSize = 24.sp,
color = Color.Black
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { /* 跳转逻辑 */ }) {
Text("进入详情页")
}
}
}
}KSP 自动生成(无需手写):
kotlin
// 编译时自动生成,开发者无需关心
class KuiklyCoreEntry {
fun triggerRegisterPages() {
router.registerPage("homePage", HomePage::class)
}
}kotlin
// commonMain:声明跨平台抽象
expect fun getPlatformName(): String
// androidMain:Android 实现
actual fun getPlatformName(): String = "Android"
// iosMain:iOS 实现
actual fun getPlatformName(): String = "iOS"
// ohosArm64Main:鸿蒙实现
actual fun getPlatformName(): String = "HarmonyOS"kotlin
@Page(name = "feedPage")
class FeedPage : ComposeContainer() {
private val items = (1..100).map { "Item $it" }
@Composable
override fun Content() {
// LazyColumn 三端均支持按需渲染,优化长列表性能
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(
count = items.size,
key = { index -> index }
) { index ->
FeedItem(text = items[index])
}
}
}
}
@Composable
private fun FeedItem(text: String) {
Box(
modifier = Modifier
.fillMaxWidth()
.height(60.dp)
.padding(horizontal = 16.dp, vertical = 8.dp)
) {
Text(text = text, fontSize = 16.sp)
}
}kotlin
// commonMain:通过 Bridge 调用各平台原生能力
class NetworkModule : Module() {
fun fetchData(url: String, callback: (String) -> Unit) {
// Bridge 自动将调用转发到各平台原生网络实现
nativeBridge.call(
method = "network.get",
params = mapOf("url" to url)
) { result ->
callback(result.toString())
}
}
}原则 | 说明 |
|---|---|
共享优先 | 业务逻辑、UI 布局、数据模型全部放 commonMain |
平台隔离 | 仅平台特有 API(相机、传感器等)放对应平台目录 |
接口驱动 | 平台差异通过 expect/actual 抽象,不在业务层感知 |
模块化 | 按功能拆分模块,通过 KSP subModules 配置多模块路由 |
场景 | 推荐做法 |
|---|---|
长列表 | 使用 LazyColumn / LazyRow,配置 key 参数避免重复渲染 |
首屏优化 | iOS 开启 TurboDisplay 增量渲染,缓存渲染指令树 |
布局计算 | 启用 Shadow 布局分离,将测量计算移至 Worker 线程 |
图片缓存 | 使用 MemoryCacheModule 管理图片缓存,页面退出时清理 |
内存管理 | 页面退出时调用 onDestroy() 清理资源,避免循环引用 |
动画 | 使用 Vsync 帧同步机制,保障三端动画流畅度一致 |
kotlin
// buildSrc/src/main/java/KuiklyVersions.kt
object KuiklyVersions {
const val KUIKLY = "2.x.x" // 三端版本号必须保持一致!
}⚠️ 重要:Android(Gradle)、iOS(Podfile)、鸿蒙(oh-package.json5)三端的 Kuikly 版本号必须保持一致,否则会出现 API 不兼容问题。
平台 | 调试方式 |
|---|---|
Android | Android Studio 原生调试工具 + Logcat |
iOS | Xcode Instruments + KuiklyRenderViewControllerBaseDelegator 性能监控 |
HarmonyOS | DevEco Studio 调试工具 |
通用 | println() 跨平台日志输出 |
常见问题排查:
plaintext
Page not registered → 检查 @Page 注解是否正确,KSP 是否执行
KSP not executed → 确认 KSP 插件已启用,执行 Build → Clean Project
ClassNotFoundException → 检查依赖配置,三端版本号是否一致
iOS 线程崩溃 → 所有 Kuikly UI 操作必须在主线程调用方案 | Android | iOS | 鸿蒙 | 性能 | 学习成本 |
|---|---|---|---|---|---|
Kuikly(推荐) | ✅ | ✅ | ✅ 原生 | ⭐⭐⭐⭐⭐ | 低(Kotlin) |
Flutter | ✅ | ✅ | ⚠️ 社区 | ⭐⭐⭐⭐ | 中(Dart) |
React Native | ✅ | ✅ | ❌ | ⭐⭐⭐⭐ | 中(JS/TS) |
各端独立开发 | ✅ | ✅ | ✅ | ⭐⭐⭐⭐⭐ | 高(三套技术栈) |
如果你的目标是同时覆盖 Android、iOS 和鸿蒙三端,Kuikly 是目前最完整、最成熟的开源解决方案,核心优势总结如下:
✅ 三端原生渲染:Android/iOS/鸿蒙均使用平台原生组件渲染,性能与纯原生持平
✅ 90%+ 代码共享:业务逻辑、UI 布局一次编写,三端同步生效
✅ 零学习成本:Kotlin/Android 开发者可直接上手,支持 Compose DSL 语法
✅ KSP 编译时优化:@Page 注解自动生成路由,零手写初始化代码
✅ 企业级验证:腾讯 5 亿+ 日活产品中大规模验证,稳定可靠
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。