Administrator
发布于 2026-08-25 / 26 阅读
0
0

系列文章《Android 工程师的 100 篇进阶笔记》第 74 篇:鸿蒙(HarmonyOS)与 Android 迁移对比:双系统工程师怎么写

前言

2024 年起,越来越多厂商把鸿蒙作为默认系统,国内 App 上架、应用市场、日常开发都开始要求"鸿蒙版"。但鸿蒙生态不会替代 Android,至少未来 3-5 年内一定是双系统共存。这篇从工程师视角,拆清楚两套体系的差异、迁移路径,以及哪些技能可以复用、哪些要重学。

一、生态定位差异

维度

Android

HarmonyOS(API 9+)

内核

Linux(HAL + AOSP)

LiteOS / OpenHarmony(微内核 + Linux 兼容层)

主语言

Kotlin / Java

ArkTS(TypeScript 超集) + 少量 C/C++

UI 范式

XML View / Compose

ArkUI 声明式 / 命令式

包格式

APK / AAB

HAP(HarmonyOS Ability Package)

跨设备

原生仅单设备

一次开发多端(手机/平板/手表/车机)

应用市场

Google Play / 国内应用市场

AppGallery / 国内应用市场

鸿蒙不是"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 组件映射速查表

Android Compose

HarmonyOS ArkUI(声明式)

Column

Column

Row

Row

Box

Stack

LazyColumn

List

LazyRow

List({ listDirection: Axis.Horizontal })

Modifier.padding(16.dp)

.padding(16)

Text("hi", fontSize = 20.sp)

Text('hi').fontSize(20)

Image(painter, ...)

Image(src, ...)

Scaffold

无直接对应;用 Tabs + Navigation

BottomNavigation

Tabs({ barPosition: BarPosition.End })

IconButton

Button + 内部 Image

整体来说,ArkUI 比 Compose"更精简"。ArkUI 没有 LazyColumn 这种高性能懒加载器,复杂列表需要用 List + ForEach + 手动分页。

3.2 状态管理

ArkUI 的状态管理有 4 个层级,概念上对应 Compose 的几种 remember:

ArkUI 状态

用途

类比 Compose

@State

组件内部状态

mutableStateOf

@Link

父子单向同步

derivedStateOf + 参数传递

@Provide/@Consume

跨组件共享

CompositionLocal

@ObservedObject

ViewModel 风格

ViewModel + StateFlow.collectAsState

@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 人员分工建议

工作

谁来做

业务逻辑层(KMP)

现有 Android 工程师

Android UI 微调

现有团队

鸿蒙 UI(ArkUI)

新招或培训 ArkTS 工程师

鸿蒙平台能力对接

ArkTS 工程师

测试 / 上架

原测试工程师 + DevOps

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+)开始不支持后台拉活,大部分长连接要换成推送

七、技能加分项

  1. 学 ArkTS 的同时,把 TypeScript 基础课补上(继承、泛型、解构)

  2. 看一遍 HarmonyOS 的"分布式软总线"原理——这是鸿蒙的杀手锏

  3. 跑一遍官方提供的"应用迁移"工具("convert"),它能给你的 Android 项目出一个 ArkUI 初版

  4. 重点理解 @Component 与 @Entry 区别——这是 ArkUI 与 Compose 最大的心智差异

小结

鸿蒙不是 Android 的简单替换,但是工程师视角下,迁移成本可控。技能上,**ArkTS ≈ TS + 一层声明式 UI,**有 Compose 经验的工程师上手一周能写业务。架构上,最大化复用业务逻辑(KMP)是省力关键。

下一篇进入性能专题:Memory Profiler 内存抖动排查实战——从一次线上 OOM 说起,看完整链路怎么定位到方法、行、对象。

参考阅读

  • HarmonyOS Developer 官方文档

  • DevEco Studio 下载与上手教程

  • Kotlin Multiplatform 官方指南


评论