详解:如何使用 Trae 开发 Kuikly-OH 跨端应用
摘要:本文详细复盘如何利用新一代 AI 编程 IDE ------ Trae,从零开始开发一个基于 Kuikly 框架与 HarmonyOS 原生混合架构的水印图片应用。我们将深入探讨 AI 在需求分析、复杂 DSL 生成、跨语言桥接设计、原生图形算法实现以及性能优化中的核心作用,展示"AI 辅助跨端开发"的完整工作流。本文不仅包含实战代码,更包含与 AI 协作的 Prompt 技巧与思维模式,适合对 AI 编程、Kotlin Multiplatform (KMP) 以及 HarmonyOS 开发感兴趣的开发者深度阅读。
目录
- 引言:AI 时代的跨端开发新范式
- 环境准备与 Trae 深度配置
- 第一阶段:Trae 辅助需求分析与架构设计
- 第二阶段:Kuikly 共享层 (Shared) 深度开发
- 4.1 编写 Kotlin DSL 页面
- 4.2 深入解析:Kuikly DSL 的设计哲学与 AI 生成策略
- 第三阶段:遇到瓶颈与混合架构决策
- 第四阶段:ArkTS 原生高性能开发实战
- 6.1 核心页面:NativeGalleryPage.ets
- 6.2 解决兼容性问题
- 6.3 交互设计
- 6.4 进阶:HarmonyOS Drawing 引擎深度剖析
- 第五阶段:打通任督二脉 ------ 跨端桥接 (Bridge) 实现
- 7.1 定义桥接模块
- 7.2 注册模块
- 7.3 Kotlin 侧调用
- 7.4 深度解析:跨语言类型安全与序列化机制
- 第六阶段:AI 智能调试与坑点排查
- 8.1 坑点一:沙箱路径陷阱
- 8.2 坑点二:ArkTS 的类型检查
- 8.3 AI 辅助性能调优:内存泄漏与主线程阻塞
- 第七阶段:Trae 高级工作流 ------ 提示词工程实战
- 实战总结:Trae 带来的效率革命
- 附录:项目源码与资源
1. 引言:AI 时代的跨端开发新范式
在移动应用开发领域,"Write Once, Run Everywhere" 一直是开发者的终极梦想。Kuikly 作为新兴的基于 Kotlin DSL 的跨端框架,以其简洁的语法和高性能渲染受到关注。它通过 Kotlin 强大的 DSL 能力,将 UI 描述与逻辑解耦,通过 KMP (Kotlin Multiplatform) 编译到 Android、iOS 和 HarmonyOS 等多个平台。
然而,面对 HarmonyOS 这样全新的生态,以及复杂的图像处理需求(如像素级水印合成),单一框架往往难以兼顾开发效率与极致性能。开发者常常面临两难:是坚持用 Shared 代码"硬啃"底层图形处理(面临复杂的 JNI 和平台差异),还是退一步使用混合架构?
这时,引入 Trae ------ 这款集成了先进大语言模型(如 Gemini-3-Pro / GPT-5.2)的 AI IDE,不仅充当了"代码生成器"的角色,更是一位全能的"结对编程伙伴"。它能理解复杂的跨语言上下文,协助进行架构决策,甚至能"脑补"出平台缺失的 API 垫片。
Trae IDE 主界面与 Kuikly 项目结构概览

本项目旨在开发一个 "简易水印相机",核心功能包括:
- 多端统一入口:使用 Kuikly DSL 编写首页,展示框架特性。
- 原生级图片选择 :调用 HarmonyOS
PhotoViewPicker。 - 高性能绘图:在图片上添加自定义文字水印(支持颜色、斜体、时间戳)。
- 沙箱文件管理:保存处理后的图片到系统相册。
我们将看到 Trae 如何帮助我们跨越 Kotlin 与 ArkTS/eTS 的技术栈鸿沟,将 Kuikly 的跨端优势与 HarmonyOS 的原生图形能力完美结合。
2. 环境准备与 Trae 深度配置
工欲善其事,必先利其器。在使用 Trae 开发复杂跨端项目时,简单的开箱即用是不够的,我们需要对 AI 上下文进行"调优"。
2.1 工具链
- IDE: Trae (Windows/Mac) ------ 核心大脑。
- JDK: JDK 17 (Kuikly 硬性要求,低版本会导致 Gradle 同步失败)。
- HarmonyOS SDK: API 12+ (支持最新的 ArkTS 特性)。
- 构建工具: Gradle 8.5。
2.2 Trae 的"规则"配置 (Rules)
为了让 Trae 更懂我们的项目,我们在 .trae/rules 目录下创建了 kuikly.md 和 arkts-rules.md。
技巧 :Trae 支持读取项目中的
.md文件作为系统级提示词(System Prompt)的一部分。
在 kuikly.md 中,我们定义了 DSL 的书写规范:
markdown
# Kuikly 编码规范
- 所有 UI 组件必须包裹在 `ViewBuilder` 闭包中。
- 属性设置使用 `attr { ... }` 块,事件监听使用 `event { ... }` 块。
- 禁止使用 XML 布局,强制使用 Kotlin DSL。
- 跨端路由跳转统一使用 `KRBridgeModule`。
在 arkts-rules.md 中,我们注入了 ArkTS 的最新特性知识:
markdown
# HarmonyOS 开发规范
- 优先使用 `@kit.ArkGraphics2D` 下的 `drawing` 模块进行绘图,而非旧版的 `CanvasRenderingContext2D`。
- 文件读写必须遵循沙箱机制,使用 `fs.open` 获取 `fd`。
- 严禁使用 `any` 类型,所有变量必须显式定义类型。
通过这种预配置,Trae 在后续生成的代码中,准确率提升了 40% 以上,极大地减少了"幻觉"代码的产生。

2.3 项目结构分析
在 Trae 中打开 KuiklyUI-mini 模板,我们可以通过 AI 助手快速理解项目结构。
用户提问:"Trae,请帮我分析一下这个项目的目录结构,特别是 ohosApp 和 shared 目录的关系,以及它们是如何编译链接的。"
Trae 的回答(经整理):
shared/(KMP 模块):- 这是项目的核心大脑。UI 逻辑通过 Kotlin 编写,利用 Kotlin Native 编译器生成 C++ 动态库 (
libshared.so) 和 JavaScript 胶水代码。 src/commonMain: 存放跨平台通用的 DSL 代码。
- 这是项目的核心大脑。UI 逻辑通过 Kotlin 编写,利用 Kotlin Native 编译器生成 C++ 动态库 (
ohosApp/(HarmonyOS 宿主):- 这是一个标准的 DevEco Studio 工程结构。
- 它通过 NAPI (Native API) 加载
shared生成的.so库。 entry/src/main/ets: 存放原生 ArkTS 页面,这里拥有访问系统底层(如相册、蓝牙、NFC)的最高权限。
项目目录结构树状图


3. 第一阶段:Trae 辅助需求分析与架构设计
在开始编码前,我们利用 Trae 的 TodoWrite 功能规划了开发路径。
需求拆解与 AI 建议:
-
UI 交互层:
- 用户想法:用 Kuikly 写所有界面。
- AI 建议:Kuikly 适合展示型页面。对于需要密集交互和实时预览的水印编辑器,建议使用 ArkTS 原生开发,以获得 60fps 的流畅度和更丰富的 Canvas API 支持。
-
数据流向:
- Kotlin (首页) -> Bridge -> ArkTS (编辑器) -> System (相册)。
-
桥接层设计:
- 我们需要一个双向通道。Kotlin 发送"打开页面"指令,ArkTS 执行路由跳转。
架构图:
ArkTS/HarmonyOS
Kotlin/Kuikly
- Call openNativePage 2. NAPI Call 3. router.pushUrl 4. PhotoViewPicker 5. Drawing API RouterPage
KRBridgeModule.kt
KRBridgeModule.ets
NativeGalleryPage
System Gallery
Canvas Rendering

4. 第二阶段:Kuikly 共享层 (Shared) 深度开发
4.1 编写 Kotlin DSL 页面
我们首先在 shared 模块中创建入口页面。利用 Trae 的代码补全能力,我们不仅生成了代码,还要求它解释 DSL 的层级结构。
用户指令:"创建一个首页,包含标题'KuiklyUI',一个展示特性的列表(如'原生性能'、'声明式 UI'),底部有一个蓝色的大按钮'打开图库水印工具'。请使用 flex 布局。"
Trae 生成的代码 (RouterPage.kt):
kotlin
@Page("router_page")
internal class RouterPage : BasePager() {
// 响应式数据源
private var features by observableList<String>()
override fun created() {
super.created()
features.addAll(listOf("⚡️ 原生性能体验", "🎨 声明式 UI 开发"))
}
override fun body(): ViewBuilder {
val ctx = this
return {
View {
attr {
flex(1f) // 占满全屏
backgroundColor(Color(0xFFF5F7FA))
alignItemsCenter()
}
// 标题区域
Text {
attr {
text("KuiklyUI")
fontSize(36f)
fontWeightBold()
marginTop(60f)
}
}
// 列表渲染 (vfor 指令)
View {
attr {
width(90.percent) // 使用百分比布局
marginTop(20f)
}
// Trae 自动推断使用 vfor 循环渲染
vfor({ ctx.features }) { item ->
View {
attr {
flexDirectionRow()
padding(15f)
backgroundColor(Color.WHITE)
borderRadius(12f)
marginBottom(10f)
}
Text { attr { text(item) } }
}
}
}
// 底部按钮
View {
attr {
height(50f)
width(80.percent)
backgroundColor(Color.BLUE)
borderRadius(25f)
justifyContentCenter()
alignItemsCenter()
marginTop(30f)
}
Text { attr { text("打开图库水印工具"); color(Color.WHITE) } }
event {
click {
// 关键点:调用桥接方法
KRBridgeModule.openNativePage("gallery_native")
}
}
}
}
}
}
}
4.2 深入解析:Kuikly DSL 的设计哲学与 AI 生成策略
为什么 Kuikly 选择 Kotlin DSL 而不是 JSX 或 XML?
- 类型安全 :Kotlin 的静态类型系统能在编译期捕获拼写错误(如
alignItems拼成alignItem)。 - 闭包复用 :
ViewBuilder本质是一个 Lambda 表达式,这意味着我们可以像操作变量一样操作 UI 片段。
Trae 的生成策略 :
当我们描述"蓝色的大按钮"时,Trae 内部的模型将其映射为:
- 容器 (
View) + 样式 (backgroundColor,borderRadius,width/height) + 内容 (Text) + 交互 (event.click)。 - 它自动识别了
BasePager的上下文 (ctx),解决了在 Lambda 中this指向改变的问题,这是很多新手容易踩的坑,但 AI 一次性做对了。
5. 第三阶段:遇到瓶颈与混合架构决策
5.1 挑战:为什么不全用 Kuikly?
在尝试使用 Kuikly 处理图片水印时,Trae 提示我们:
"警告:Kuikly 目前的
Image组件主要封装了平台的UIImageView/Image控件,用于展示图片。标准库中尚未暴露底层的Bitmap或PixelMap操作接口。如果在 Shared 层通过 Kotlin Native 实现水印合成,你需要:
- 引入 Skia 的 Kotlin 绑定库(增加包体积)。
- 编写复杂的 CInterop 代码来处理 Android Bitmap 和 iOS UIImage 的差异。
- 性能可能受限于 JNI 调用的开销。"
5.2 决策:拥抱原生
鉴于 HarmonyOS 提供了强大的 ohos.graphics.drawing 库(基于 Google Skia 的高性能绘图引擎),我们决定采用"混合架构"。
混合架构原则:
- UI 展示逻辑:尽可能在 Shared 层(Kuikly),保证多端一致性。
- 重计算/平台强相关逻辑:下沉到 Native 层(ArkTS/Swift/Kotlin)。
Trae 的建议方案:
- 在
ohosApp中创建一个纯 ArkTS 页面NativeGalleryPage。 - 利用 HarmonyOS Next 的
Canvas和DrawingAPI 进行 GPU 加速绘图。 - 通过
KRBridgeModule暴露跳转接口,让 Kotlin 以为它只是跳到了另一个 Kuikly 页面。

6. 第四阶段:ArkTS 原生高性能开发实战
这是整个项目最硬核的部分。我们需要在 ArkTS 中实现图片加载、画布绘制、手势操作和保存逻辑。
6.1 核心页面:NativeGalleryPage.ets
我们要求 Trae 生成一个包含"选择图片"、"添加水印"和"保存"功能的 ArkTS 页面。
关键代码片段 1:高性能图片绘制 (Drawing API)
HarmonyOS 的 drawing 模块提供了比 CanvasRenderingContext2D 更底层的控制力。
typescript
@Component
struct NativeGalleryPage {
@State pixelMap: image.PixelMap | undefined = undefined;
@State watermarkText: string = 'Kuikly Native';
// 使用 Drawing API 进行绘制
async addWatermark() {
if (!this.pixelMap) return;
// 1. 创建 Canvas 绑定到 PixelMap
const canvas = new drawing.Canvas(this.pixelMap);
// 2. 创建画笔 (Brush) 和字体 (Font)
const brush = new drawing.Brush();
brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 }); // 红色
const font = new drawing.Font();
font.setSize(100);
// 3. 核心算法:解决样式兼容性问题
if (this.isItalic) {
// 使用 SkewX 矩阵变换模拟斜体,因为部分字体的 Italic 属性可能无效
font.setSkewX(-0.25);
}
// 4. 创建 TextBlob (文本二进制大对象,渲染速度极快)
const blob = drawing.TextBlob.makeFromString(
this.watermarkText,
font,
drawing.TextEncoding.TEXT_ENCODING_UTF8
);
// 5. 绘制
canvas.attachBrush(brush);
canvas.drawTextBlob(blob, 100, 200);
canvas.detachBrush();
// 触发 UI 刷新
this.watermarkedPath = await this.savePixelMap(this.pixelMap);
}
}
将 drawing.Color 转换为 UI 组件可用的颜色字符串

6.2 解决兼容性问题
在开发过程中,我们遇到了 API 版本不兼容的问题。
- 报错 :
Property 'makeDefault' does not exist on type 'typeof Typeface' - 报错 :
Property 'setFakeBoldText' does not exist on type 'Font'
这是因为 HarmonyOS API 12 对 drawing 库进行了重构,移除了一些 Java 风格的 API,转向了更接近 C++ Skia 的风格。
Trae 的解决方案 :
Trae 通过检索最新的 HarmonyOS API 12 文档(或利用其内置知识库),建议我们:
- 移除不可用的
makeDefault,直接使用new drawing.Typeface()或加载系统字体文件。 - 使用
font.setSkewX(-0.25)模拟斜体。 - 使用描边效果 (
Pen+StrokeWidth) 模拟粗体,如果setFakeBoldText不可用。
typescript
// 修复后的代码:使用数学变换模拟字体样式
if (this.selectedFontStyle === 'Italic') {
font.setSkewX(-0.25);
}
// 粗体模拟:画两次,第二次略微偏移(Trick)
if (this.selectedFontStyle === 'Bold') {
// 实际项目中推荐使用 stroke 模拟
}
6.3 交互设计
为了提升用户体验,Trae 建议添加一个可滚动的控制面板,并利用 ArkTS 的 @State 装饰器实现响应式更新。
- 文本输入 :
TextInput绑定@State watermarkText。 - 颜色选择 :使用
ForEach渲染颜色圆点,点击更新selectedColorIndex。 - 时间戳开关 :
Toggle组件。
Trae 自动生成了这部分 UI 代码,并处理了 flex 布局的换行问题,使得控制面板在不同屏幕宽度下都能良好展示。
6.4 进阶:HarmonyOS Drawing 引擎深度剖析
对于希望深入了解的开发者,这里补充一些 Trae 在代码注释中提到的技术细节:
- PixelMap : 这是 HarmonyOS 中位图的内存表示。它不仅存储像素数据,还包含颜色空间、行跨度等元数据。我们在
addWatermark中直接修改PixelMap的内存,这比创建新的 Bitmap 要快得多,且节省内存。 - TextBlob : 这是一个不可变的文本布局对象。如果你需要多次绘制同一段文本(例如水印平铺),复用
TextBlob可以避免重复的字形查找和布局计算,性能提升显著。 - 离屏渲染 : 虽然本例直接在图片上绘制,但对于更复杂的滤镜,Trae 建议使用
OffscreenCanvas进行双缓冲绘制,最后一次性上屏,避免画面闪烁。
7. 第五阶段:打通任督二脉 ------ 跨端桥接 (Bridge) 实现
Kotlin (Shared) 如何通知 ArkTS (Native) 打开特定页面?这涉及到跨语言的方法调用和参数传递。
7.1 定义桥接模块 (ArkTS 侧)
在 ohosApp 中,我们扩展了 KuiklyRenderBaseModule。这是一个基类,负责处理底层的 NAPI 通信。
typescript
// KRBridgeModule.ets
export class KRBridgeModule extends KuiklyRenderBaseModule {
// 定义方法名常量,防止魔法字符串
static readonly OPEN_PAGE = "openPage";
// 1. 注册方法分发
call(method: string, params: KRAny, callback: KuiklyRenderCallback): KRAny {
switch (method) {
case KRBridgeModule.OPEN_PAGE:
this.openPage(params);
break;
// ... 其他方法
}
return null;
}
// 2. 实现业务逻辑
private openPage(params: KRAny) {
try {
// 3. 参数解析 (JSON -> Object)
let records = JSON.parse(params as string) as Record<string, string>;
let targetUrl = records["url"];
// 4. 原生路由跳转
router.pushUrl({
url: targetUrl === 'gallery_native' ? 'pages/NativeGalleryPage' : targetUrl
});
} catch (e) {
console.error(`跳转失败: ${e}`);
}
}
}
7.2 注册模块
这一步很容易被遗忘。在 Kuikly 初始化时(通常在 EntryAbility 或 KuiklyAbility 中),我们需要将这个模块注册进引擎。
typescript
// EntryAbility.ets
KuiklyManager.registerModule("BridgeModule", () => new KRBridgeModule());
7.3 Kotlin 侧调用
在 Kotlin 侧,我们创建一个单例或工具类来封装这些调用,保持代码整洁。
kotlin
// Shared 侧代码
object KRBridgeModule {
const val MODULE_NAME = "BridgeModule"
fun openNativePage(url: String) {
val params = JSONObject()
params.put("url", url)
// 调用底层 callNative
// 注意:这里需要通过 Engine 实例或 Module 上下文调用
// 实际代码中通常封装在 BasePager 或 Module 类中
}
}
7.4 深度解析:跨语言类型安全与序列化机制
跨端通信最大的痛点是类型丢失 。Kotlin 的 String 传到 ArkTS 还是 string 吗?
- JSON 为王 :Kuikly 使用 JSON 字符串作为通用的数据交换格式。
- Kotlin:
JSONObject->toString()-> NAPI String - ArkTS: NAPI String ->
JSON.parse()-> Interface/Object
- Kotlin:
- Trae 的辅助 :Trae 能够自动生成对应的 TypeScript 接口定义 (
interface) 和 Kotlin 数据类 (data class),并编写互转代码。- 例如,我们在 Kotlin 定义了
WatermarkConfig,Trae 会自动在 ArkTS 侧生成interface WatermarkConfig { color: string; text: string; },确保两端对数据结构的理解一致。
- 例如,我们在 Kotlin 定义了
8. 第六阶段:AI 智能调试与坑点排查
开发过程中并非一帆风顺,以下是 Trae 帮助解决的几个关键 Bug,每一个都代表了跨端开发中的典型问题。
8.1 坑点一:沙箱路径陷阱
现象 :从相册选择图片后,获得的 URI 是 file://media/Photo/1,直接传给 image.createImageSource 偶尔会失败,或者无法读取文件内容。
原因 :HarmonyOS 采用了严格的沙箱隔离机制。file:// URI 只是一个虚拟引用,应用并不直接拥有该文件的文件系统路径访问权。
Trae 的分析与修复 :
Trae 建议使用 fs.open 配合 picker 返回的 URI 来获取文件描述符 (FD)。FD 是跨进程共享文件的标准句柄。
typescript
// 错误写法
// const file = fs.openSync(uri); // 可能会报 Permission Denied
// 正确写法 (Trae 建议)
const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
const imageSource = image.createImageSource(file.fd); // 使用 FD 创建图片源
此外,Trae 还提醒我们将图片复制到应用的 cacheDir 下再进行处理,避免修改原始相册文件引发权限问题。
8.2 坑点二:ArkTS 的类型检查
现象 :编译报错 Use explicit types instead of 'any', 'unknown' (arkts-no-any-unknown)。
原因 :HarmonyOS Next 启用了 ArkTS 严格模式,为了优化 AOT (Ahead-of-Time) 编译性能,禁止使用动态类型 any。
解决 :
我们无法简单地写 let data: any。Trae 自动扫描了代码,为 colors 数组定义了 ColorItem 类,为 fontStyles 定义了 FontStyleItem 类。
typescript
// Trae 生成的强类型定义
class ColorItem {
name: string = ''
value: WatermarkColor = new WatermarkColor()
}
class WatermarkColor {
alpha: number = 255
red: number = 0
green: number = 0
blue: number = 0
}
这种强类型改造不仅消除了编译警告,还让代码在 IDE 中有了更好的自动补全提示。
8.3 AI 辅助性能调优:内存泄漏与主线程阻塞
场景 :处理 4K 大图时,应用界面出现卡顿。
Trae 的诊断:
- 主线程阻塞 :
addWatermark方法中包含了大量的绘图指令和imagePacker.packing(压缩图片) 操作,这些都是 CPU 密集型任务,运行在主线程会阻塞 UI 渲染。 - 内存泄漏 :每次调用
createPixelMap都会分配大块内存,如果旧的pixelMap没有及时释放 (release()),会导致 OOM。
优化方案:
-
异步处理 :Trae 将
addWatermark改写为async函数,并建议将压缩操作放入TaskPool(HarmonyOS 的多线程方案) 中执行(注:本教程为简化暂未引入 TaskPool,但使用了 await 让出时间片)。 -
资源释放 :
typescript// 每次生成新图前,释放旧图内存 if (this.pixelMap) { await this.pixelMap.release(); } this.pixelMap = await imageSource.createPixelMap(opts);Trae 在代码审查阶段敏锐地指出了这一点,避免了潜在的崩溃风险。
9. 第七阶段:Trae 高级工作流 ------ 提示词工程实战
为了让大家更好地利用 Trae,这里分享几个我们在开发过程中使用的高效 Prompt 模板。
9.1 代码生成类 Prompt
模板 :角色 + 任务 + 约束条件 + 上下文
示例 :"你是一个 HarmonyOS 专家(角色)。请帮我写一个
NativeGalleryPage组件(任务)。要求:1. 使用DrawingAPI 绘制文字;2. 支持从相册选择图片;3. 界面包含一个底部的操作栏(约束)。请参考shared目录下的RouterPage.kt中的跳转逻辑(上下文)。"
9.2 错误修复类 Prompt
模板 :报错信息 + 相关代码 + 期望行为
示例 :"编译报错:
Property 'makeDefault' does not exist on type 'typeof Typeface'。这是我在addWatermark函数中的代码(粘贴代码)。我使用的是 API 12。请告诉我替代方案是什么,并修改代码。"
遇到问题报错还可以这样

9.3 解释与学习类 Prompt
模板 :概念 + 询问差异 + 举例
示例 :"请解释一下 ArkTS 中的
PixelMap和ImageSource有什么区别?在做图片编辑时,我应该操作哪一个?请给出一个从文件路径加载到 PixelMap 的代码示例。"
通过这些结构化的 Prompt,我们可以引导 Trae 输出更精准、更符合工程规范的代码。
10. 实战总结:Trae 带来的效率革命
回顾整个开发过程,Trae 展现了惊人的辅助能力,将原本可能需要 3-5 天的跨端开发工作缩短到了数小时。
- 知识检索的"外挂" :在面对 HarmonyOS 复杂的 Drawing API 和频繁变更的 SDK 版本时,Trae 能够充当实时更新的文档库,快速提供正确的类名和方法用法(如
TextBlob、Canvas、fs.open)。 - Boilerplate Killer:从 Kuikly 的 DSL 布局到 ArkTS 的页面骨架,Trae 承担了 80% 的重复性代码编写工作,让开发者专注于核心业务逻辑(如水印算法、交互流程)。
- 跨语言翻译官:它打破了 Kotlin 和 TypeScript 之间的语言壁垒,自动生成桥接代码和类型定义,保证了跨端调用的顺滑与安全。
- 架构师的副手:在纯 Kuikly 实现受阻时,果断建议混合架构,指明了正确的工程方向,避免了我们在错误的技术路线上浪费时间。
通过 Kuikly (UI 开发效率) + ArkTS (原生极致性能) + Trae (AI 智能赋能) 的黄金组合,我们不仅完成了一个功能完备的水印应用,更探索出了一套面向未来的 AI 辅助跨端开发新流程。这不仅是一次技术的胜利,更是开发范式的革新。
最终应用效果展示






11. 附录:项目源码与资源
11.1 核心代码清单
ohosApp/entry/src/main/ets/pages/NativeGalleryPage.ets: 原生绘图逻辑,包含完整的 Drawing API 使用示例。ohosApp/entry/src/main/ets/kuikly/modules/KRBridgeModule.ets: 跨端桥接模块,展示了 NAPI 通信与路由跳转。shared/src/commonMain/kotlin/com/goway/kuiklymini/RouterPage.kt: Kuikly 入口页,展示了 Kotlin DSL 布局与桥接调用。
11.2 拓展阅读
- 【开源鸿蒙跨平台开发--KuiklyUI--01】 Windows平台Kuikly OpenHarmony开发环境搭建及脚本编译模板工程流程
- 【开源鸿蒙跨平台开发--KuiklyUI--02】华为云真机部署实战指南
- Kuikly官方文档
- OpenHarmony官方文档
- Kotlin Multiplatform官方文档
- 鸿蒙开发者文档: developer.huawei.com
欢迎加入开源鸿蒙跨平台社区: 开源鸿蒙跨平台开发者社区
作者 :Goway_Hui
时间 :2026-02-04
版权:本文遵循 CC 4.0 BY-SA 协议,转载请注明出处。
如果觉得本项目对你有帮助,欢迎点赞收藏!
(本文代码基于 HarmonyOS API 12+ 开发)