智能客服
你问我答,随时在线为你解决问题
ArkTS 是动态类型编程语言,主打易学易用、生态丰富、极简开发、持续创新四大特征;仓颉是静态类型编程语言,主打高性能、强安全、跨平台、智能化等特性。C/C++可通过跨语言互操作封装为ArkTS、仓颉扩展模块,提供给ArkTS、仓颉高效使用。ArkTS、仓颉和C/C++支持高性能互操作,形成优势互补。三者相辅相成,并与其他编程语言协同,共同支撑开发者鸿蒙生态应用开发。
结合当前鸿蒙应用开发者遇到的主要问题及场景,我们锚定高效开发、高性能、安全、跨平台、技术资产保护、AI辅助开发、智能化七大核心场景,以鸿蒙分布式操作系统的技术特性为基底,构建覆盖「开发-运行-安全-生态-沉淀」的全链路生产力闭环。这一选择既源于鸿蒙「万物互联」的战略定位,也直击传统开发模式中效率瓶颈、性能损耗、安全风险、多端割裂及历史资产投入浪费的核心痛点。
适用场景
ArkTS保留了TS大部分语法特性,兼容TS高效语法,提供了许多高效且简洁的语法特性,可以显著提升代码的可读性和开发效率。例如泛型、箭头函数、展开运算符等
- // 使用泛型编写可复用的代码
- function identity<T>(arg: T): T {
- return arg
- }
- const output = identity<string>('hello') // 类型推断为 string
- // 使用箭头函数,简化函数调用
- const add = (a: number, b: number) => a + b
- // 使用展开运算符,高效合并数组
- const arr1 = [1, 2]
- const arr2 = [...arr1, 3] // [1, 2, 3]
全量ArkTS语法列表,参考ArkTS语言介绍。
以线性容器为例,ArkTS提供以下常用的数据结构,充分考虑了数据访问的速度,实现便捷的操作。
- import { ArrayList } from '@kit.ArkTS' // 导入ArrayList模块
-
- let arrayList: ArrayList<string> = new ArrayList()
- arrayList.add('a') // 增加一个值为'a'的元素
- arrayList[0] = 'one' // 修改索引为0的元素
- console.info(`result: ${arrayList[0]}`) // 输出:result: one
全量ArkTS基础库列表,参考ArkTS基础类库。
详见ArkTS高性能能力概述章节。
ArkTS提供了声明式UI范式、状态管理支持等相应的语言基础能力,帮助开发者提升鸿蒙应用界面开发效率。
- // index.ets
- @Entry
- @Component
- struct Index {
- @State message: string = 'Hello World'
- build() {
- Row() {
- Column() {
- Text(this.message)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- }
- .width('100%')
- }
- .height('100%')
- }
- }
有关对ArkUI的支持,详情请参见ArkUI-声明式UI开发框架。
标准TS/JS三方库可以直接被ArkTS引用,供鸿蒙应用调用。当前OpenHarmony三方库中心仓已提供1000+TS/JS三方库,供开发者复用已有TS/JS资产。ArkTS引用TS/JS示例如下:
- // lib.ts
- export class Test {
- greetings(msg: string) {
- console.log(msg)
- }
- }
-
- // app.ets
- import { Test } from 'lib' // 和TS/JS语法一致,通过import关键字导入TS/JS中实体
- let t: Test = new Test() // 和TS/JS语法一致,通过new关键字创建类的实例
- t.greetings('hello world') // 和TS/JS语法一致,通过.访问类的实例方法
全量三方库列表,参考OpenHarmony三方库中心仓。
关于上述特性的详细介绍,请参见仓颉编程语言开发指南。
适用场景
- // 注:以下为模拟业务场景代码片段,部分函数未给出具体实现,仅供示意参考
- @Component
- class CustomView {
- @State var count: Int64 = 0
- ...
- func build() {
- Column {
- Text("${count} times")
- .align( Center )
- .margin(top: 50.vp, bottom: 50.vp)
- Button("Click")
- .align( Center )
- .onClick { evt =>
- count++
- }
- }.width(100.percent)
- .height(100.percent)
- }
- ...
- }
常见的 TS/JS 运行时通常仅支持源码级的运行时解析,并采用解释器或 JIT 的执行模式。而 ArkTS 编译运行时则提供了更为多样的执行能力:它支持将 ArkTS、TS、JS 源代码预编译为字节码文件,运行时可直接加载字节码;同时支持 AOT、解释器和 JIT 的混合执行模式。其中 AOT 编译能显著提升应用的启动性能,使应用在启动时即基于优化后的本地机器码运行。
在模块加载机制上,TS/JS 默认采用预加载方式,即在应用启动时加载所有模块。同时,TS/JS 支持动态加载来延迟模块加载时机,但实现路径依赖异步语义,要求整个调用链保持异步风格,开发成本较高。为解决该问题,ArkTS 运行时引入了 自动延迟加载(lazy import)机制:只需在 import 语句中添加 lazy 关键字,即可使模块在首次使用时按需加载,支持同步与异步调用场景,无需改动业务逻辑结构。
此外,TS/JS 运行时通常为单线程架构,并仅提供基于消息传递的 Worker API。开发者在处理并发任务时需显式封装命令消息及其处理逻辑,使用繁琐。而ArkTS提供了 TaskPool API,允许开发者以函数方式直接提交并发任务,运行时自动调度至线程池执行。TaskPool 支持线程池的负载均衡与弹性扩缩容,极大简化了并发编程模型。
针对多线程通信性能问题,TS/JS 的单线程设计导致跨线程传输对象需复制,尤其在处理复杂对象时可能造成明显卡顿。而 ArkTS 引入了 Sendable 类型,支持线程间以引用方式共享对象。Sendable 对象在线程传递过程中无需拷贝,具备与 Java 等支持共享内存模型的语言类似的高效并发特性。
混合执行模式
ArkTS编译运行时的执行引擎包含解释器、JIT编译器和AOT编译器,支持混合模式的执行,在应用性能与系统资源之间取得平衡。如下图所示:

执行模式原理
解释执行模式可以满足应用开发者一次编译,编出来的App包支持在鸿蒙多种设备运行。ArkTS的优化编译(包括AOT闲时编译和JIT编译)能支持更高性能的运行,同时也会使用更多的内存空间。
启动性能优化——动态加载与懒加载
为了解决大型、复杂应用开发过程中,部分代码编译时被多次拷贝导致包体积增大、文件依赖、代码与资源共享困难以及单例和全局变量污染等问题,同时为了方便开发者代码编写与功能维护,ArkTS支持应用模块化编译打包运行。
模块加载方式
默认情况下,模块的加载是静态加载,即在应用启动时,所有模块都会被加载。这种方式在大型应用中会导致启动时间变长,影响用户体验。
应用开发的有些场景中,有些模块被使用的可能性很低,或者并不需要立即被使用。针对这些模块,ArkTS提供了两种优化启动性能的方法:动态加载和延迟加载。
动态加载与延迟加载的对比:
加载方式 | 启动性能优化 | 代码侵入性 | 控制粒度 | 使用建议 |
|---|---|---|---|---|
动态加载 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 精细控制 | 适用于加载时机明确、功能较独立的模块。 |
延迟加载 | ⭐⭐⭐⭐ | ⭐ | 自动触发 | 适用于快速实现懒加载、依赖较少的模块。 |
SmartGC——感知场景的内存回收
ArkTS运行时选择最为常见的基于对象追踪(即Tracing GC)算法。GC的性能通常以暂停时间、内存使用和吞吐率来衡量,而在GC的算法中又不能对这三项做到面面俱到,一般的GC算法只能针对其中一项或者两项做倾向性优化。ArkTS运行时针对鸿蒙应用场景做了精细化的GC策略调整,在不同的场景采取不同的策略和算法达到场景最优化选择
在应用性能敏感场景,通过将GC触发水线临时调整到线程堆较大值来避免触发GC,避免GC可能导致的应用卡顿。
当前支持的敏感场景包括:应用冷启动、应用滑动、应用点击页面跳转、超长帧。
用算法检测应用空闲场景,根据检测到的空闲等级触发不同类型的压缩GC,尽量回收空闲应用内存。闲时GC既可以减少系统整体内存负载,同时确保应用再次进入敏感场景时内存保持最佳,间接提升性能,减少GC导致的应用丢帧。
ArkTS 运行时基于对象追踪技术实现对象生命周期的自动管理,并针对不同应用场景进行了策略优化,从而更好地满足实际业务对性能的需求。
在 ArkTS中,强引用(Strong Reference)是默认的引用类型,会阻止对象被垃圾回收(GC);而弱引用(Weak Reference)不会阻止 GC,当对象仅存弱引用时会被自动回收。
定义:最常用的引用类型。只要对象被任意强引用指向,它就被视为 “可达”,GC 绝对不会回收。
定义:一种 “非占有式” 引用。它允许你访问对象,但不保护对象不被 GC 回收。
核心作用:解决内存泄漏,尤其适用于缓存、元数据、DOM 节点关联等场景。
JS 实现:
特性 | 强引用 (Strong) | 弱引用 (Weak) |
|---|---|---|
GC 影响 | 阻止回收 | 不阻止回收 |
实现 | 变量、对象、Map、Set | WeakMap、WeakSet、WeakRef |
键 / 成员类型 | 任意 (包括原始值) | 仅限对象 (不能是 string/number) |
可枚举 | ✅是 (可遍历) | ❌否 (不可遍历) |
内存风险 | 易泄漏 (循环引用) | 自动清理 (防泄漏) |
使用场景 | 常驻数据、业务对象 | 缓存、元数据、DOM 关联、临时映射 |
ArkTS的并发能力
ArkTS提供的TaskPool和Worker均支持多线程并发能力。TaskPool的工作线程会绑定系统的调度优先级,并支持负载均衡(自动扩缩容)。相比之下,Worker需要开发者自行创建,不支持设置调度优先级。因此,性能方面TaskPool优于Worker,推荐在大多数场景中使用TaskPool。
在ArkTS并发模型中,普通对象所属的内存是隔离的,不会出现线程竞争同一内存资源的情况,开发者无需处理内存上锁相关的问题,提高开发效率。对普通对象的线程间通信,ArkTS采用了标准的Structured Clone算法(序列化和反序列化),此时需要进行深拷贝,性能开销可能较大。对此,ArkTS还提供了Sendable对象的共享能力来优化线程间通信开销。
TaskPool为应用程序提供多线程环境,降低资源消耗、提高系统性能,无需管理线程生命周期。其运作机制示意图如下:

TaskPool支持开发者在宿主线程提交任务到任务队列,系统选择合适的工作线程执行任务,再将结果返回给宿主线程。接口易用,支持任务执行、取消和指定优先级,同时通过系统统一线程管理,结合动态调度及负载均衡算法,可以节约系统资源。系统默认启动一个任务工作线程,任务多时会扩容。工作线程数量上限取决于设备的物理核数,内部管理具体数量,确保调度和执行效率最优。长时间无任务分发时会缩容,减少工作线程数量。
Worker的主要作用是为应用程序提供一个多线程的运行环境,满足应用程序在执行过程中与宿主线程分离,在后台线程中运行脚本进行耗时操作,避免计算密集型或高延迟的任务阻塞宿主线程。
每个Worker子线程和宿主线程拥有独立的实例,包含基础设施、对象、代码段等。因此,启动每个Worker存在一定的内存开销,需要限制Worker子线程的数量。Worker子线程和宿主线程通过消息传递机制通信,利用序列化反序列化机制完成参数对象的重建(注:Sendable对象直接引用共享)。
ArkTS提供了Sendable对象类型,在并发通信时支持通过引用传递来解决并发通信开销大的问题。Sendable对象为可共享的,其跨线程前后指向同一个ArkTS对象。如果底层是Native实现,还需要考虑线程安全性。通信过程如下图所示:

当多个并发实例尝试同时更新Sendable数据时,会发生数据竞争,例如ArkTS共享容器的多线程操作。因此,ArkTS提供异步锁机制来避免不同并发实例间的数据竞争,并提供了异步等待机制来控制多线程处理数据的时序。同时,还可以通过对象冻结接口将对象冻结为只读,从而避免数据竞争问题。Sendable对象提供了并发实例间高效的通信能力,即引用传递,适用于开发者自定义大对象需要线程间通信的场景,例如子线程读取数据库数据并返回给宿主线程。
总结与选型建议
并发能力 | 适用场景 | 性能优化建议 | 生命周期管理 | 推荐级别 |
|---|---|---|---|---|
TaskPool | 任务型并发 | ⭐⭐⭐⭐ | 自动 | ✅ 推荐 |
Worker | 交互式后台服务,定时器等 | ⭐⭐⭐ | 手动 | ⚠️ 特殊场景使用 |
Sendable | 大对象跨线程传输 | ⭐⭐⭐⭐ | 自动(GC回收) | ✅ 大对象场景推荐 |
仓颉具有静态类型系统,且其源码被静态编译为直接执行的机器指令。这种静态编译执行方式具有更高的启动性能和安全性。借助仓颉编译器强大的静态分析能力,低效或有风险的代码在应用构建过程中识别,开发工具自动帮助或提示开发者优化代码,达成最佳应用体验。
静态类型和静态编译优化
仓颉编译器具有多层级优化能力,通过前端-后端-运行时融合的垂直分析优化技术,仓颉在计算机语言基准测试Benchmarks Game上展现了优越的基础性能。

仓颉的静态编译先进技术包括:
仓颉语言用包组织源码,支持应用功能以包为粒度按需加载。
低时延高效率的自动内存管理
时延敏感性是鸿蒙移动应用的关键特征之一。造成应用时延高的因素有很多,从编程语言角度看,GC暂停耗时是关键因素之一。与现有的STW GC或近似并发GC(如下图)不同,仓颉的并发GC采用轻量同步机制,具有更短的GC暂停耗时,仓颉应用线程完成GC同步的平均耗时小于2毫秒,典型情况下完成一次GC同步的耗时在百微秒量级。仓颉并发GC可以帮助应用大幅减少GC暂停导致的丢帧,是时延敏感场景的优选编程语言,如:

仓颉对象采用了精简的内存布局。对象内存中仅保留一个8字节的头记录其类型信息,其余数据都是有效内容,用仓颉语言开发的应用在运行时占用更少的内存。

仓颉GC采用了内存整理(compact)技术,通过把存活对象搬移到指定的一块连续内存中,全部回收堆内存中的死亡对象及其中的内存碎片,减少了堆内存用量。仓颉GC采用的内存整理技术可实现内存块一边整理一边释放,降低GC过程中的内存峰值(如下图)。

仓颉的值类型也可以用于优化堆内存。值类型数据作为局部变量时占用的内存直接分配在函数栈空间里,在函数退出时随之释放。相比堆对象,值类型变量具有更高的内存分配和回收效率,内存回收更及时。通过在应用代码中合理地使用值类型,可以减少堆内存用量,降低GC负载。
仓颉编译器也能通过逃逸分析识别出函数内的局部对象,像对待值类型变量一样把它分配在栈空间,开发者不需改动源码即可与手动改为值类型具有等同的内存优化效果。
综上,仓颉自动内存管理技术具有时间空间多维度优势,是时延敏感场景和内存敏感场景(如内存受限的中低端设备)的优选编程语言。
简洁轻量的并发编程
仓颉采用数据共享的多线程模型,提供了轻量用户态线程和高效易用的无锁并发数据结构让并发编程变得轻松,将高效并发处理的能力直接置于开发者的手中。
在仓颉提供的轻量化线程模型中,开发者可以通过简单的 spawn 语法创建仓颉线程。与业界一些其他语言的使用 async/await 语法的并发模型不同,使用仓颉的轻量化线程模型,开发者无需在编程过程中手动标记(如用 async 标记异步函数并用 await 标记其调用点),也彻底杜绝了这些标记的“传染性”(包含 await 的函数必须标记为 async)导致的“函数染色”问题,大大降低了并发编程的复杂性。
在运行层面,仓颉线程是用户态线程,与传统的操作系统线程相比,其实现完全在用户空间进行,不依赖操作系统的线程管理,这从根本上减少了线程创建和销毁的开销,在性能上具有明显优势。在线程调度上,仓颉使用了 M:N 线程模型,即 M 个仓颉线程在 N 个 native 线程(通常即为操作系统线程)上调度执行,其中 M 和 N 不一定相等。每个仓颉线程都受到底层 native 线程的调度执行,并且多个仓颉线程可以由一个 native 线程执行。每个 native 线程会不断地选择一个就绪的仓颉线程完成执行。仓颉线程的调度支持抢占,如果仓颉线程在执行过程中发生阻塞(例如等待互斥锁的释放),那么 native 线程会将当前的仓颉线程挂起,并继续选择下一个就绪的仓颉线程。发生阻塞的仓颉线程在重新就绪后会继续被 native 线程调度执行。
对于仓颉线程间的数据共享和同步,仓颉也提供了一系列简洁易用的机制来确保线程安全,主要包括:
更进一步,仓颉提供了基于细粒度并发算法实现的无锁并发对象,而用户通过调用并发对象的接口来操作多线程共享内存,从而实现:
关于并发模型相关特性的更详细介绍,请参见仓颉编程语言开发指南。
适用场景
- let picsUrl: Array<String> = ... // 每张图片的 url
- @Entry
- @Component
- class PicsViewDiskCache {
- @State
- var pixelMaps: ObservedArray<?PixelMap> =
- ObservedArray<?PixelMap>(Array<?PixelMap>(picsUrl.size, item: None))
- protected func aboutToAppear() {
- let client = getClient(poolSize: 20) // 创建网络请求客户端
- for (i in 0..picsUrl.size) {
- let filePath = Path(getFilePath(i))
- if (exists(filePath)) {
- // 已经做了文件缓存,直接从文件读
- let data = File.readFrom(filePath)
- // 将data转换成PixelMap
- let pixelMap = getPixelMapFromData(data)
- // 更新UI
- UpdateUI(pixelMap)
- return
- }
- let request = HttpRequestBuilder().url(picsUrl[i]).get().build()
- // 1. 下载图片:发送网络请求,请求图片数据
- let response = client.send(request)
- // 2. 解析:读取网络数据
- let data: Array<Byte> = getNetWorkData(response)
- // 3. 创建:根据网络图片数据创建 pixelMap 对象
- let pixelMap = getPixelMapFromData(data)
- // 4. UI 渲染:网络图片数据获取解析完毕,回主线程刷新 UI
- UpdateUI(pixelMap)
- // 5. 缓存到本地文件
- writeToFile(filePath, data)
- }
- }
- func build() {
- Column(10) {
- ForEach(pixelMaps,
- itemGeneratorFunc: { item: ?PixelMap, index: Int64 =>
- if (let Some(item) <- item) {
- Image(item).width(160).height(160)
- } else {
- // 如果 PixelMap 数据还未获取完成,先用占位图
- }
- },
- keyGeneratorFunc: {
- item: ?PixelMap, index: Int64 =>
- // 配置 item 的 key 值
- })
- }.width(100.percent)
- }
- }

小程序架构上重点涉及到两个模块。在JsBridge中加入仓颉api的派发逻辑,和在JSAPI中加入仓颉实现,仓颉具备高效的与C语言互操作的能力。C语言与仓颉代码互相调用只需要声明和使用,代码简单,执行快,不需要调用Napi协议接口,仓颉具备线程池能力。仓颉语言的JSAPI执行不占用主线程时间。仓颉线程间具备天然的内存共享能力,省去序列化和反序列化开销。这个架构可以让主线程聚焦处理Web渲染任务,而大量的系统请求通过仓颉的并发线程处理。
ArkTS 不仅在语言层面引入了类型系统、空值安全等特性,在编译工具链和运行时的设计上也提供了额外的安全机制。其目标是在保障开发者效率的同时,降低运行时攻击面,提升系统整体可信度。
应用字节码文件的合法性校验
为了防止恶意篡改应用字节码并上传至应用市场,鸿蒙应用市场在上架审核阶段引入字节码合法性校验机制,具体包括:
该机制削减了从分发渠道源头控制恶意应用流入用户终端的风险。
代码签名与运行时验签
ArkTS 对所有上架应用进行代码签名,并在运行时加载字节码前执行签名校验:
这一机制防止了上线后应用注入代码或篡改行为。
仓颉是静态类型语言,程序中所有变量和表达式的类型都是在编译期确定的,并且禁止隐式类型转换,即在程序运行过程中不会发生改变,能够在编译期尽量早的发现程序中的错误,提升程序安全性。
仓颉在编译和运行时支持多种安全检测,如数组越界、除0、整型溢出、移位检查等。以数组越界检查为例,支持编译时和运行时安全检查。
仓颉采用 tracing GC 技术,通过在运行时跟踪对象之间的引用关系,来识别活动对象和垃圾对象。垃圾收集(GC)是一种自动内存管理机制,它能够自动识别和回收不再需要使用的对象,将开发者从手工释放内存中解放出来,不仅可以提高开发效率,还能有效避免各种常见内存错误,提升程序的安全性。
仓颉支持运行时地址随机化、堆栈不可执行、控制流完整性等漏洞利用缓解机制,能有效避免运行时漏洞利用,让攻击者难以利用漏洞控制应用执行流并窃取、篡改应用客户数据。
适用场景
涉及金融交易对业务逻辑有安全要求的场景
- func safeAdd(a: Int8, b: Int8): Int8 {
- a + b
- }
- main(): Int64 {
- let a: Int8 = 120
- let b: Int8 = 20
- try {
- let result = safeAdd(a, b)
- println("result = ${result}")
- } catch (e: OverflowException) {
- println("捕获到整型溢出: ${e}")
- println("说明仓颉没有发生静默回绕,而是抛出了异常。")
- }
- 0
- }
- class Person {
- let name: String
- var age: Int64
- init(name: String, age: Int64) {
- this.name = name
- this.age = age
- }
- func sayHello() {
- println("你好,我是 {name}, 今年 {age} 岁。")
- }
- }
- func makePerson(name: String, age: Int64): Person {
- Person(name, age)
- }
- main(): Int64 {
- let p1 = Person("张三", 20)
- p1.sayHello()
- let p2 = makePerson("李四", 25)
- p2.sayHello()
- println("程序结束时,对象内存由仓颉自动管理,无需手动释放。")
- 0
- }
ArkTS 依托平台无关的方舟字节码分发格式、适配多开发平台(鸿蒙、Windows、Linux、MacOS)的编译及调试调优工具链,以及支持在主流操作系统(鸿蒙、Android、iOS、Windows、Linux、MacOS)上运行的语言运行时,实现了 ArkTS 代码在不同开发平台的编译、分发,以及在多个主流运行系统上的跨平台运行。
在后续演进规划中,ArkTS 将通过多后端机制对接不同运行平台或系统原生开发语言的运行环境,旨在使 ArkTS 代码在各平台上的开发与运行体验达到最优,实现与平台原生语言代码的高效交互及平台 API 的无损调用。
仓颉语言将跨平台能力作为语言、编译器、运行时和工具链协同设计目标之一,在保证开发体验、运行效率和工程可维护性的前提下,为开发者提供统一而可扩展的跨平台方案。仓颉提供三方面跨平台能力:跨平台编译、跨平台生态复用以及跨平台调试。
仓颉编译器面向主流平台提供编译与交叉编译能力,当前能力覆盖鸿蒙、Android、iOS、MacOS、Windows、Linux 等目标场景。仓颉提供条件编译宏和 common/specific 代码组织机制,支持开发最大限度的共享代码。

仓颉提供了统一的多端调试工具cjdb,以统一的方式支撑多平台程序的调试工作。cjdb 基于 lldb 演进而来,面向仓颉程序提供源码级调试能力。cjdb 功能覆盖断点、代码执行控制、信息查看、内存操作等调试场景。并在单步、协程调试上进行了调试体验改进。
适用场景
- // log.cj
- package cjmpfoundation
-
- public common func log(tag:String, msg: String): Unit
- public common func logE(tag:String, msg: String): Unit
-
- // android/platform_utils.cj
- package cjmpfoundation
-
- foreign {
- func __android_log_print(prio: Int32, tag: CString, fmt: CString): Int32
- func FfiLogUtils(tag: CString, msg: CString): Unit
- }
-
- public platform func log(tag:String,msg:String): Unit {
- unsafe {
- let cTag = LibC.mallocCString(tag)
- let cMsg = LibC.mallocCString(msg)
- FfiLogUtils(cTag, cMsg)
- LibC.free(cTag)
- LibC.free(cMsg)
- }
- }
-
- public platform func logE(tag:String,msg:String): Unit {
- unsafe {
- let cTag = LibC.mallocCString(tag)
- let cMsg = LibC.mallocCString(msg)
- __android_log_print(6, cTag, cMsg)
- LibC.free(cTag)
- LibC.free(cMsg)
- }
- }
-
- // ios/platform_utils.cj
- package cjmpfoundation
-
- foreign {
- func FfiLog(logString: CString): Unit
- }
-
- public platform func log(tag: String, msg: String): Unit {
- unsafe {
- let cStr = LibC.mallocCString(tag + " : " + msg)
- FfiLog(cStr)
- LibC.free(cStr)
- }
- }
-
- public platform func logE(tag: String, msg: String): Unit {
- unsafe {
- let cStr = LibC.mallocCString(tag + " : " + msg)
- FfiLog(cStr)
- LibC.free(cStr)
- }
- }

ArkTS为开发者提供了源码混淆工具ArkGuard,其主要针对ArkTS、TS和JS语言提供基础混淆功能,将代码中的变量名、函数名、类名、文件名等替换为简短无意义的名称,增加通过逆向产物猜测其用途的难度。
ArkGuard混淆能力
ArkGuard支持基础的名称混淆,不支持控制混淆、数据混淆等高级混淆功能,已有名称混淆选项汇总如下表:
功能 | 选项 |
|---|---|
属性名称混淆 | |
字符串属性名称混淆 | |
顶层作用域名称混淆 | |
导入导出名称混淆 | |
文件名混淆 |
仓颉提供了外形混淆、数据混淆、控制流混淆等多种混淆技术用于保护开发者的软件资产,提升攻击者逆向攻击仓颉软件的难度。攻击者可采用逆向工程技术对程序进行攻击,并获取程序的符号名、路径信息和行号信息、特征字符串和特征常数,以及控制流信息。仓颉混淆技术可以对这些信息进行混淆和隐藏,让攻击者难以借用这些信息辅助理解程序的运行逻辑。
仓颉混淆详细介绍请见《仓颉编程语言白皮书》。
适用场景
金融行业对业务逻辑有保密要求场景
混淆前符号信息示例

混淆后符号信息示例

混淆前敏感字符串示例

混淆后敏感字符串示例

混淆前程序控制流示例

混淆后程序控制流示例

与其他代码混淆工具一样,ArkTS及仓颉的混淆工具只能在一定程度上增加逆向工程的难度,并不能彻底阻止逆向工程,对于源码安全有高要求的开发者,建议考虑使用应用市场提供的应用加密功能或者三方安全加固等安全措施来保护代码。
鸿蒙ArkTS、仓颉作为新兴应用开发语言,目前开源训练语料储备较为匮乏,致使主流业界大模型对ArkTS、仓颉代码的适配与生成能力普遍偏弱。
尽管 ArkTS 语法体系与 TypeScript 高度相近,但其公开可用语料体量尚不足 TypeScript 的百分之一,这就导致大模型在代码生成时,极易默认沿用 TypeScript 语法逻辑输出内容。而 TypeScript 中大量与 ArkTS 规范不兼容的语法特性,也由此成为鸿蒙 AI Coding 场景下,ArkTS 开发出现语法错误的核心诱因。仓颉语法与其他静态语言语法相近,但公开可用语料同样不足。

短期内无法完成ArkTS、仓颉语料库 2 至 3 倍量级的快速扩容,通过工程化路径优化代码生成精度是必要措施。
经调研广大鸿蒙生态开发者的实际体验,AI 辅助应用开发过程中有三类突出痛点:
1、代码生成环节问题较多,尤以语法错误最为突出,致使项目无法正常构建,需多轮人机协同修改,部分缺陷无法通过 AI 自主修复;
2、程序构建完成并部署至终端设备或模拟器后,频繁出现界面展示错乱、交互逻辑异常等缺陷,人工测试核验重复性强、耗时久;
3、自测试的问题整改依赖开发者手动输入自然语言指令引导 AI 修复,持续陷入编码改错、编译打包、真机测试的低效迭代流程。

鸿蒙应用特性开发与缺陷修复阶段,AI 可有效提升代码编写速率,但多轮纠错调试、人工测试验证、二次修复等流程存在效率阻滞,致使端到端开发效率提升遇阻,开发者普遍反映实际增效效果并不明显。
实现应用落地、完成功能特性迭代,是开发者核心开发目标。开发者初衷本是借助 AI 提升开发效率,可当前在通用 AI辅助工具上的开发流断点,反而拉长整体开发周期。即便最终能够完成功能开发,整体开发体验也大打折扣。
站在全流程开发视角来看,理想开发模式应实现开发旅程的自动化闭环:开发者提交开发需求后,AI 自动完成代码生成,联动语法校验工具智能排查并修复语法问题;无误代码可自动编译构建 HAP 安装包,同步推送至模拟器完成部署,自动开展功能校验与兼容性测试;一旦检测出异常问题,即刻反向回流至代码生成与修改环节,启动迭代优化。经过多轮自动化自验证与迭代修正,直至精准达成特性的开发目标。
鸿蒙将与开发者共同努力,让应用全流程 Agentic 智能开发的理想模式成为现实。实现开发者仅需明确业务需求,即可交由 AI 自主闭环完成代码编写、语法纠错、模拟器/真机自验证、问题整改等全链路工作,直至需求开发完成,最终由开发者确认验收的目标。在大幅提升代码生成正确率的同时,最大限度减少人工干预,压缩开发耗时,全面优化开发者体验。
仓颉通过元编程能力和 DSL 能力构建 Agent DSL 能力,兼顾细粒度控制与开放扩展,构建动态、意图驱动的AI计算范式。包括单 Agent 编程开发、多 Agent 协同、支持 MCP 协议等。
适用场景
鸿蒙智能应用开发场景
在应用内定义一个具备任务理解和工具调用的“鸿蒙日程助理Agent”的示例如下:
- @agent[
- model: "deepseek:deepseek-v3.2",
- description: "鸿蒙应用内的智能日程助理",
- tools: [scheduleToolManager],
- executor: "react"
- ]
- class ScheduleAssistant {
- @prompt("你是一个日程助理,负责理解用户需求,并生成规范的日程处理结果。")
- }
- let assistant = ScheduleAssistant()
- // 用户输入:明天上午 10 点提醒我参加项目评审
- let result = assistant.run("明天上午10点提醒我参加项目评审")