梅科尔工作室鸿蒙工程从API9升级API20应用实践-动态示例升级说明文档
本项目不仅是一次代码层面的版本升级,更是对 OpenHarmony 6.0 (API 20)高性能动画引擎的一次深度实践。跨代际技术攻坚与 Kit 化迁移跨越了从 API 9 到 API 20 的版本差异,我们深入实践了 OpenHarmony 全新的 Modularization (Kit化) 架构。特别是针对交互反馈模块,完成了从到的标准化迁移,验证了高版本 SDK 在状态管理与上下文获取上的
DAYU200升级OpenHarmony 6.0
- 安装驱动


2. 给DAYU200烧录镜像源
3. 去官网下载DAYU200的镜像源
网址:https://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist

4. 导入镜像源配置。注意:需要更换镜像实际的路径位置



5. 按住VOL-/RECOVERY 按键(图中标注的①号键)不松开 1.5秒时按一次RESET 按钮(图中标注的②号键)。此时烧录工具显示“发现一个LOADER设备” ,说明进入了烧写模式 松开按键,点击“执行”按钮进行烧录 如果烧写成功, 在工具界面右侧会显示下载完成


大赛开发流程
一、 仓库创建与题目文件上传(基础准备)
步骤 1:在 AtomGit 组织下创建专属仓库

- 登录 AtomGit 账号,进入目标组织主页;
- 点击「新建仓库」,填写仓库信息
- 点击「创建仓库」,完成组织仓库搭建。
步骤 2:仓库克隆与题目文件部署
- 克隆组织仓库到本地:
- 在组织仓库主页复制仓库地址(推荐 HTTPS,更易操作);
- 打开本地终端,切换到目标存放目录,执行克隆命令:
git clone 你的组织仓库地址
- 部署题目文件:
- 下载大赛提供的题目文件包,解压到本地;
- 将解压后的所有题目文件,复制到克隆后的本地仓库目录中,覆盖原有初始化文件。
- 验证文件:确认本地仓库目录中,题目文件完整存在,无缺失或路径错误。
步骤 3:代码提交与推送到远程仓库
cd 你的本地仓库文件夹名称
- 进入本地仓库目录(终端中切换路径):
cd 你的本地仓库文件夹名称 - 执行代码提交三部曲(修正原始流程中git add.的空格缺失问题,避免命令失效):
# 1. 追踪所有新增/修改的文件
git add .
# 2. 提交代码并添加规范版本备注(备注清晰便于后续版本回溯)
git commit -m "V1.0: 上传大赛题目基础文件"
# 3. 推送到组织仓库的main分支
git push origin main
常见问题兜底方案:
问题 1:git commit无响应 / 提示 “please tell me who you are”解决方案:
- 配置 Git 用户信息(全局配置,一次配置永久生效),执行以下命令:
git config --global user.name userID
git config --global user.email userID @noreply.atomgit.com
- 配置完成后,重新执行git commit -m "V1.0: 上传大赛题目基础文件"即可。
问题 2:弹出密钥 / 身份验证弹窗解决方案:

1. 登录 AtomGit 个人主页,找到「个人设置」-「访问令牌」-「新建令牌」;
2. 配置令牌权限(勾选「仓库读写权限」),设置有效期(建议覆盖大赛周期);
3. 生成令牌后,复制令牌内容(仅显示一次,务必保存);
4. 返回验证弹窗,用户名填写 AtomGit 账号,密码填写上述访问令牌,完成验证。
二、 基于 Migrate Assistant 实现自动迁移
- 打开 DevEco Studio,导入本地仓库项目(「File」-「Open」- 选择本地仓库目录,确认导入);
- 使用 Migrate Assistant 工具:

3. 配置迁移参数:
- 选择迁移目标版本(按大赛要求,选择 API 20 及对应 HarmonyOS 版本);
- 勾选「自动修复兼容问题」「保留原始代码备份」(便于迁移失败后回滚);
- 点击「Start Migrate」,开始自动迁移;
- 迁移后校验:
- 查看迁移报告(工具底部弹出),确认无严重错误(警告可按需排查);
- 检查项目目录结构是否变更,核心文件(如 Ability、UI 相关文件)是否正常保留。
三、 API 20 SDK 配置与版本适配(修复配置异常)
步骤 1:配置 API 20 SDK 环境
- 打开 DevEco Studio,进入设置->openharmony SDK
- 配置项目 SDK:

- 选择SDK位置
- 勾选API20->右下角点击确定
步骤 2:修复配置文件异常(精准路径 + 操作说明)
针对项目配置文件不兼容问题,修改指定 JSON5 文件,确保工程适配 API 20:
- 找到项目中的两个核心配置文件(明确文件路径,避免查找错误):
- 文件 1:项目根目录 / build-profile.json5

- 文件 2:项目根目录 /entry/ build-profile.json5

验证配置:关闭配置文件后,重新打开确认替换内容无误,无语法错误(JSON5 格式支持注释,注意不要误删注释符号)。
四、 工程同步与自动编译

- 手动触发工程同步:
- 点击 DevEco Studio 顶部工具栏的「Sync Project with Gradle Files」(同步图标,形似刷新的箭头);
- 等待同步完成(底部进度条消失,无报错提示),同步过程中会自动下载缺失的 API 20 依赖包;
- 执行自动编译:
- 顶部菜单栏「Build」-「Build Project」(完整编译工程,推荐首次编译使用);
- 编译失败初步排查:
- 若提示依赖缺失:重新同步工程,或手动在「File」-「Project Structure」-「Modules」中添加对应依赖;
- 若提示配置错误:返回第三步,检查build-profile.json5文件是否替换正确,有无语法错误(如逗号缺失、大括号不匹配);
若提示 SDK 未找到:进入「Settings」-「Appearance & Behavior」-「System Settings」-「HarmonyOS SDK」,下载 API 20 对应的 SDK 包。
五、 新旧接口替换(精准修改 + 报错修复)
EntryAbility.ts文件中存在3个引用是老引用方式,按照接口名称查找api文档,找到新版本下的接口方式并更新,同时修改在更新接口的过程中代码出现报错
步骤 1:定位文件并替换接口引用
- 在项目视图中,找到文件路径:entry /src/main /ets/ability / EntryAbility.ts;
- 替换原始旧接口引用为 API 20 新接口(严格按以下代码替换,避免拼写错误):
引用(删除原有全部 3 行导入代码):
//原代码中的引用
import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
新引用(添加以下 3 行导入代码):
import { hilog } from '@kit.PerformanceAnalysisKit';
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
- 同步代码:保存文件(Ctrl+S),DevEco Studio 会自动进行语法校验。
步骤 2:解决接口替换后的报错问题
- 报错 :“‘window’ is not defined”/ 接口调用报错
- 原因:新接口命名空间变更(旧接口为Window(大写 W),新接口为window(小写 w));
解决方案:在EntryAbility.ts中,将所有旧接口调用(如Window.create)修改为新接口调用(window.create),匹配导入的命名规范。

六、 个性化功能开发(落地式步骤,对应需求)
基于大赛需求,将个性化功能拆解为可落地的开发步骤,确保功能完整实现:
- 星球图标替换:
- 步骤 1:在网上下载高清正方形星球图片(太阳 + 八大行星,建议 PNG 格式,背景透明);
- 步骤 2:将星球图片放入项目资源目录(entry /src/main /resources/media);
- 步骤 3:替换原有图标:在 UI 代码中,将原有图标引用(如默认图标组件)修改为本地星球图片路径,配置图片大小与样式。
// ... (前面代码省略)
build() {
Stack() {
Stack() {
// 【功能点 1 - 星球部分】:这里循环渲染八大行星
// 具体的星球图片路径存储在 this.iconModel.imagerArr 中
// 实际渲染图片的 Image 组件在子组件 IconAnimation 中
ForEach(this.iconModel.imagerArr, (item: IconItem) => {
IconAnimation({
item: item,
mainFlag: $mainFlag
})
}, (item: IconItem) => JSON.stringify(item.index))
}
.width(Common.DEFAULT_FULL_WIDTH)
.height(Common.DEFAULT_FULL_HEIGHT)
// ... (中间代码省略)
// 【功能点 1 - 太阳部分】:这里是中心太阳的图标替换
// 资源路径修为 app.media.sun_sun62
Image(
this.mainFlag
? $r("app.media.sun_sun62")
: $r("app.media.sun_sun62")
)
.width($r('app.float.size_130')) // 设置大小
.height($r('app.float.size_130'))
.objectFit(ImageFit.Contain)
.margin(20)
// ...
- 星球环绕太阳效果实现:
- 步骤 1:使用 HarmonyOS ArkUI 的动画 API(如RotateAnimation或explicitAnimation);
- 步骤 2:设置太阳组件为中心节点,星球组件为环绕节点;
// ... (前面代码省略)
// 【功能点 2】:显式动画逻辑
// 点击中心太阳后触发,改变 mainFlag 状态,产生平滑过渡效果
animate() {
animateTo(
{
delay: Common.DELAY_10,
tempo: Common.TEMPO,
iterations: 1,
duration: Common.DURATION_500,
curve: Curve.Smooth, // 动画曲线
playMode: PlayMode.Normal
}, () => {
this.mainFlag = !this.mainFlag;
})
}
build() {
Stack() {
Stack() {
// ... (ForEach 循环星球)
}
.width(Common.DEFAULT_FULL_WIDTH)
.height(Common.DEFAULT_FULL_HEIGHT)
// 【功能点 2】:环绕效果的核心实现
// 当 mainFlag 变化时,整个包含星球的 Stack 会旋转 360 度
.rotate({
x: 0,
y: 0,
z: 1,
angle: this.mainFlag ? Common.ROTATE_ANGLE_360 : 0
})
// ... (后面代码省略)
- 点击图标 + 介绍弹窗功能:
- 步骤 1:为每个星球组件绑定点击事件(onClick);
- 步骤 2:创建弹窗组件(如Dialog),设计弹窗样式(标题 + 介绍文案,调整弹窗宽高、位置);
- 步骤 3:实现弹窗逻辑:点击星球时,根据星球类型弹出对应介绍文案弹窗;
- 步骤 4:保留原有点击图标变化效果(如星球放大、高亮),确保弹窗与图标变化同时触发。
// ...
// 【功能点 3】:定义介绍文案数据
// 数组下标对应星球的 index,例如 index 0 是地球,就显示数组第 0 个文案
@State word:string[]=[
'【地球】:太阳系唯一生机盎然的行星...',
'【金星】:地球近邻...',
// ... 其他星球文案
]
// ... (在 build 中)
// 【功能点 3】:点击交互视觉反馈
// 点击状态下 (clicked 为 true):旋转 360度,放大 (Scale),透明度变低
.rotate({
x: 0,
y: 1,
z: 0,
angle: this.item.clicked ? Common.ROTATE_ANGLE_360 : 0
})
.scale(
this.item.clicked
? { x: Common.SCALE_RATIO, y: Common.SCALE_RATIO } // 放大
: { x: 1, y: 1 } // 正常大小
)
.opacity(this.item.clicked ? Common.OPACITY_06 : 1)
// 【功能点 3】:点击事件处理
.onClick(() => {
// 切换点击状态(触发上面的放大、旋转效果)
this.item.clicked = !this.item.clicked;
// ... (倒计时逻辑见下文)
// 【功能点 3】:弹出介绍弹窗 (Toast)
// 获取当前星球对应的文案:this.word[this.item.index]
// 使用 showToast 显示弹窗
this.getUIContext().getPromptAction().showToast({
message: this.word[this.item.index], // 显示对应星球的介绍
duration: 5000, // 弹窗显示 5 秒
showMode: promptAction.ToastShowMode.DEFAULT,
bottom: 280 // 弹窗位置
});
})
// ...
- 5 秒倒计时自动复原功能:
- 步骤 1:在星球点击事件中,创建定时器(setTimeout),设置延时 5000 毫秒(5 秒);
- 步骤 2:定时器回调函数中,实现复原逻辑:移除星球的放大样式,隐藏弹窗;
// ...
.onClick(() => {
this.item.clicked = !this.item.clicked;
// 【功能点 4】:5 秒自动复原
// 使用 setTimeout 设置一个 5000 毫秒(5秒)的定时器
setTimeout(() => {
// 5秒后,将 clicked 状态改回去
// 星球会缩小回原样,旋转角度归零,透明度恢复
this.item.clicked = !this.item.clicked;
}, 5000)
// ... (弹窗逻辑)
})
// ...
总结
本项目不仅是一次代码层面的版本升级,更是对 OpenHarmony 6.0 (API 20) 高性能动画引擎的一次深度实践。通过本次开发,我们成功达成了以下核心目标:
- 跨代际技术攻坚与 Kit 化迁移:
跨越了从 API 9 到 API 20 的版本差异,我们深入实践了 OpenHarmony 全新的 Modularization (Kit化) 架构。特别是针对交互反馈模块,完成了从@ohos.promptAction到getUIContext().getPromptAction()的标准化迁移,验证了高版本 SDK 在状态管理与上下文获取上的严谨性与先进性。 - 沉浸式动效交互体验:
区别于传统的静态 UI 开发,本项目深度挖掘了 ArkUI 的动画潜力。通过巧妙结合 显式动画 (animateTo) 与 属性动画 (Property Animation),我们实现了“星球膨胀展开”与“微交互反馈”的流畅衔接。在 RK3568 开发板上,成功实现了 60fps 的稳定渲染,证明了 OpenHarmony 完全具备构建高帧率、高互动性教育类应用的能力。 - 全链路开发实战闭环:
从底层的 DAYU200 系统镜像烧录、build-profile.json5的严格模式配置,到上层 Slider 控件与动画系统的毫秒级联动,我们打通了从环境搭建到应用落地的全链路。本项目为开发者在 OpenHarmony 6.0 上开发复杂动效应用提供了可复用的最佳实践范本。
未来,梅科尔工作室将继续深耕 OpenHarmony 生态,探索物理引擎与粒子系统在科普教育场景中的更多落地可能。
【atomgit仓库链接】
https://atomgit.com/MakerStudio/HW_motion_effect_example.git
更多推荐

所有评论(0)