前言
2024 年起,越来越多厂商把鸿蒙作为默认系统,国内 App 上架、应用市场、日常开发都开始要求"鸿蒙版"。但鸿蒙生态不会替代 Android,至少未来 3-5 年内一定是双系统共存。这篇从工程师视角,拆清楚两套体系的差异、迁移路径,以及哪些技能可以复用、哪些要重学。
一、生态定位差异
鸿蒙不是"Android 的国产化",而是一套全新架构,但生态上大量参考了 Android 的成熟经验。
二、语言层:Kotlin 工程师怎么过渡到 ArkTS
2.1 语法相似度
ArkTS 与 TypeScript 几乎一样,多了装饰器和分布式调度 API。Kotlin 工程师过 ArkTS 的门槛很低:
// ArkTS:装饰器式组件声明
@Entry
@Component
struct HomePage {
@State message: string = 'Hello'
build() {
Column() {
Text(this.message)
.fontSize(24)
.onClick(() => {
this.message = 'World'
})
}
.width('100%')
}
}
对比 Android 的 Compose:
@Composable
fun HomePage() {
var message by remember { mutableStateOf("Hello") }
Column(modifier = Modifier.fillMaxWidth()) {
Text(message, fontSize = 24.sp, modifier = Modifier.clickable {
message = "World"
})
}
}
结构基本一一对应。ArkTS 的 @State 约等于 Kotlin 的 mutableStateOf。
2.2 协程 vs Promise
Kotlin 的挂起函数,在 ArkTS 里用 Promise + async/await 替代:
async function fetchUser(): Promise<User> {
const resp = await http.fetch('/api/user')
return JSON.parse(resp.body as string)
}
如果业务复杂,ArkTS 也支持 TaskPool / Worker 来跑后台任务。
三、UI 体系:ArkUI vs Compose
3.1 组件映射速查表
整体来说,ArkUI 比 Compose"更精简"。ArkUI 没有 LazyColumn 这种高性能懒加载器,复杂列表需要用 List + ForEach + 手动分页。
3.2 状态管理
ArkUI 的状态管理有 4 个层级,概念上对应 Compose 的几种 remember:
@ObservedObject
class UserVM {
@Link name: string = ''
@Link age: number = 0
async load() {
const u = await fetchUser()
this.name = u.name
this.age = u.age
}
}
@Component
struct UserCard {
@ObjectLink vm: UserVM
build() {
Column() {
Text(this.vm.name)
Text(this.vm.age.toString())
}
}
}
四、平台能力调用
4.1 权限模型差异
Android 是动态申请,鸿蒙也是动态申请,但 API 略有不同:
// 鸿蒙:使用 abilityAccessCtrl
const atManager = abilityAccessCtrl.createAtManager()
const result = await atManager.requestPermissionsFromUser(
this.context,
['ohos.permission.LOCATION']
)
对比 Android:
val perm = Manifest.permission.ACCESS_FINE_LOCATION
ActivityCompat.requestPermissions(this, arrayOf(perm), 100)
4.2 后台任务
Android 用 WorkManager 或 JobScheduler;鸿蒙用 BackgroundTaskManager:
// 鸿蒙
import backgroundTaskManager from '@ohos.backgroundTaskManager'
const request: backgroundTaskManager.DelaySuspendInfo = {
delaySuspendSeconds: 600,
requestId: 1,
reason: 'dataSync',
}
backgroundTaskManager.startBackgroundRunning(
context, request, () => {
// 10 分钟内能继续运行
}
)
限制更严——只有数据同步、播放音频、定位几种特定类型能申请长时任务。
五、跨平台共享:如何最大化复用
如果你已经有一个 Kotlin Multiplatform Mobile (KMP) 项目,恭喜:业务逻辑层可以几乎不动。要替换的只有 UI 层。
┌─────────────────────────────────────┐
│ KMP 共享(业务逻辑) │
│ ViewModel / UseCase / Repository │
└─────────────────────────────────────┘
│ │
│ Android │ iOS / HarmonyOS
▼ ▼
┌─────────────┐ ┌──────────────────┐
│ Compose UI │ │ ArkUI(TS) │
└─────────────┘ └──────────────────┘
实际操作方式有两种:
方案 A:UI 全重写
Android 端 Compose、鸿蒙端 ArkUI
业务层用 KMP 共享
工作量:高
方案 B:使用第三方跨端框架
推荐:Flutter / React Native 三端统一
但 ArkUI 的分布式特性用不上
对于"必须上架鸿蒙"的团队,方案 A 更主流。
六、迁移工程经验
6.1 人员分工建议
6.2 IDE 与工具
Android:Android Studio + Koala
鸿蒙:DevEco Studio(基于 IntelliJ)
API 接口调试:Postman / APIFox
设备调试:手机 + Watch + 车机(如需)
DevEco Studio 装好后能直接导入 Android 工程的部分 layout 作为参考(手动迁移)。
6.3 上架要点
鸿蒙应用市场必须提交 HarmonyOS 应用签名(与 Android 不同)
应用图标格式必须传 PNG(不接受 mipmap)
隐私协议独立一份(不能复用 Android 的)
鸿蒙 5.0(API 12+)开始不支持后台拉活,大部分长连接要换成推送
七、技能加分项
学 ArkTS 的同时,把 TypeScript 基础课补上(继承、泛型、解构)
看一遍 HarmonyOS 的"分布式软总线"原理——这是鸿蒙的杀手锏
跑一遍官方提供的"应用迁移"工具("convert"),它能给你的 Android 项目出一个 ArkUI 初版
重点理解
@Component与@Entry区别——这是 ArkUI 与 Compose 最大的心智差异
小结
鸿蒙不是 Android 的简单替换,但是工程师视角下,迁移成本可控。技能上,**ArkTS ≈ TS + 一层声明式 UI,**有 Compose 经验的工程师上手一周能写业务。架构上,最大化复用业务逻辑(KMP)是省力关键。
下一篇进入性能专题:Memory Profiler 内存抖动排查实战——从一次线上 OOM 说起,看完整链路怎么定位到方法、行、对象。
参考阅读
HarmonyOS Developer 官方文档
DevEco Studio 下载与上手教程
Kotlin Multiplatform 官方指南