【鸿蒙心迹】从 Java 到 ArkTS:一个老程序员的鸿蒙踩坑复盘
✍️ 作者:王文峰(外号:神秘小峯 / 山峯)|中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!
【鸿蒙心迹】从 Java 到 ArkTS:一个老程序员的鸿蒙踩坑复盘

📚 我是写了很多年 Java 的"老程序员",去年开始把业余项目迁到鸿蒙(HarmonyOS NEXT)。这篇不讲"鸿蒙多牛",只讲我真实踩过的坑和心路:三方库怎么集成到崩溃、折叠屏适配怎么做才不返工、上架审核被拒三次最后怎么过。同路的朋友,这篇可以当避坑清单用。
一、开篇:一个老程序员的"转场"心路
做 Java 十几年,Spring 全家桶闭着眼能写。但心里清楚:技术人的安全感,从来不是"守住一门语言"给的。鸿蒙生态起来的时候,我决定下场写一个自己的小项目——过程比我想象的狼狈,也比我想象的收获大。
三个阶段的心情,你可能也会经历:
| 阶段 | 状态 | 心态 |
|---|---|---|
| 第 1 周 | 环境都跑不起来 | “这玩意真能开发?” |
| 第 1~2 月 | 业务能跑,全是坑 | “语法不难,生态要命” |
| 第 3 月 | 顺利上架 | “坑趟完,这生态有戏” |
下面按"踩坑时间线"复盘,每条坑都给现象 + 原因 + 解法。
二、环境与工程坑:还没写代码就被拦住
坑 1:DevEco Studio 装好了,模拟器镜像死活下不动
- 现象:Device Manager 里镜像下载进度条纹丝不动,进度 0% 挂一小时;
- 原因:网络环境对下载源不友好;
- 解法:①换稳定网络/镜像源重试;②真机调试优先——华为开发者账号实名后自动签名,手机连上 DevEco 直接跑,比模拟器爽十倍;
- 心迹:模拟器是给"没有测试机的人"准备的,有真机就别跟镜像死磕。
坑 2:签名配置一团乱(调试证书 / Profile / 真机绑定)
- 现象:安装时提示签名不匹配,或设备不在调试设备列表;
- 原因:调试证书与 Profile 绑定设备 UDID,换台手机就要重新生成 Profile;
- 解法:DevEco 的 Project Structure → Signing Configs → 自动签名一条龙;上架前再单独配发布证书,调试和发布两套签名别混用。

坑 3:HAP / HSP / APP 分不清
一句话理清:
| 概念 | 是什么 |
|---|---|
| HAP | Harmony Ability Package,能力包,最小部署单元 |
| HSP | Shared Package,共享包,多模块共享代码与资源(类似 Android 的 library) |
| APP | 打包上架的总包,由多个 HAP/HSP 组成 |
心路:一开始不理解模块化,后面优化包体积时全是债。建议第一天就按"entry(主入口)+ feature(业务模块)+ common(共享层)"搭好工程结构。
三、语言关:从 Java 到 ArkTS 的思维转换
ArkTS = TypeScript + 声明式 UI + 鸿蒙约束(禁反射、禁动态代理等)。老 Java 人最不适应的三件事:
1. UI 是"描述出来的",不是命令式操作
@Entry
@Component
struct Index {
@State message: string = '你好,鸿蒙';
build() {
Column() {
Text(this.message).fontSize(20)
Button('点我').onClick(() => { this.message = '状态驱动刷新' })
}.width('100%').padding(16)
}
}
没有 findViewById、没有 XML 布局文件——状态变,UI 自动变。一开始别扭,习惯后是真香。
2. 状态管理是"命门"(最大的坑在这里)
| 装饰器 | 用途 | 我踩的坑 |
|---|---|---|
@State | 组件内状态 | 只能在组件内用,跨组件传不动 |
@Prop / @Link | 父子单向/双向同步 | @Link 必须用 $r 式引用初始化,忘了就运行报错 |
@Provide / @Consume | 跨层级共享 | 深层组件忘记用 @Consume 声明,数据"看起来传了其实没通" |
AppStorage / @StorageLink | 全局状态 | 轻量全局用它,重业务别硬塞 |
@Observed + @ObjectLink | 对象内部字段变化 | 不加装饰器,对象属性变了 UI 不刷新——排查一小时的血泪 |
心迹:Java 里我们习惯了"改对象就刷新",鸿蒙里"没装饰就不刷新"。排查 UI 不更新,第一步永远是查装饰器。
3. 性能习惯:build 里别做重活
build() 是高频调用的"纯描述"函数——在里面 new 对象、做计算、打日志,都是给自己埋性能坑。计算放方法里、日志放生命周期里,这条是我从 Android 迁过来后依然要提醒自己的。
四、三方库集成:生态期的"阵痛",也是最真实的坑
鸿蒙生态在快速成长,但三方库的丰富度和成熟度仍在追赶。这部分是我花时间最多的地方。
坑 4:ohpm 装库顺利,一跑就"找不到模块"
- 现象:
ohpm install成功,运行时Module not found; - 原因:三方库版本与项目 SDK 版本不匹配,或
oh-package.json5里依赖路径写错; - 解法:锁定版本号,先用官方示例工程验证库能跑,再引入自己项目。
坑 5:native 三方库(so)加载失败
- 现象:引入带 C/C++ 的库后闪退,报 so 加载失败;
- 原因:ABI 目录不匹配、
CMakeLists.txt里库名写错、打包时 so 没进包; - 解法:
- 检查
build-profile.json5里 nativeLib 的 abiFilters 配置; CMakeLists.txt的target_link_libraries名字与实际库名一致;- 用
hdc shell抓真实报错,比看编译日志准。
- 检查
坑 6:三方 SDK 的合规"暗雷"(上架前必查)
统计、推送、支付等三方 SDK 会在上架审核时被重点关照:
- 隐私政策必须逐一披露收集了什么、给了谁;
- SDK 的开源协议要过一遍(商用限制、传染性协议);
- 建一张"三方 SDK 清单表":名称 / 用途 / 收集字段 / 官网链接——审核被拒时它是救命稻草。
💡 工具脚本福利:我写了个小脚本扫描工程里所有三方依赖生成清单初稿(
oh-package.json5+ 隐私字段比对),有需要的朋友评论区吱一声,我出一篇配套教程。
五、折叠屏与多形态适配:一多开发的真实体验
折叠屏、平板、手机——鸿蒙的"一次开发、多端部署"是真需求,也是真工作量。
1. 断点与栅格:别再硬编码 360vp
@Entry
@Component
struct MainPage {
build() {
GridRow({ columns: { sm: 4, md: 8, lg: 12 }, gutter: { x: 8, y: 8 } }) {
GridCol({ span: { sm: 4, md: 4, lg: 3 } }) {
// 小屏占满、中屏三列、大屏四列
ArticleCard()
}
}
}
}
- sm/md/lg 对应手机 / 折叠屏展开 / 平板大屏;
- 媒体查询方案:
@Media或 breakpoints 组件,同样按断点走; - 心迹:我第一版所有页面按手机宽度写死,展开折叠屏那一刻——页面右边空出一大条,当场破防。适配要从第一版就进架构,不是最后"补"的。
2. 折叠态切换:生命周期别漏
- 屏幕展开/合上会触发窗口尺寸变化:监听
window.on('windowSizeChange')或用断点组件自适应; - 页面级布局用
SideBarContainer做"侧边栏 + 内容"在大屏下天然好用; - 坑:折叠态切换时滚动位置、输入法、临时状态容易丢——重要页面把状态收敛到
AppStorage,别只存在组件里。
3. 平行视界与多窗口:同应用双窗口的适配要点
平行视界(同一应用左右开两个窗口)下,最典型的坑是两个窗口共享单例状态导致互相污染:
- 业务状态尽量按"页面实例"隔离,别滥用全局单例;
- 左右窗口各自维护页面栈,导航逻辑别写死"全局唯一入口";
- 适配后在大屏上自查:左窗浏览、右窗详情这种双栏体验,才是平行视界的正确打开方式。
六、上架审核:被拒三次换来的经验
真实记录:我的应用被拒了三次,每次原因都"离谱但合理":
| 次数 | 拒审理由 | 整改 |
|---|---|---|
| 第 1 次 | 隐私政策链接在审核环境打不开 | 换稳定 HTTPS 托管 + 全球可访问测试 |
| 第 2 次 | 申请相机权限,但首屏功能用不到相机(权限与功能不符) | 权限延迟到实际使用时申请,并在页面说明用途 |
| 第 3 次 | 使用了三方统计 SDK,隐私政策未披露 | 补全 SDK 清单,隐私政策加"第三方共享"章节 |
总结的审核自查清单:
- ✅ 隐私政策:可访问、说清权限用途、列出三方 SDK 与共享信息;
- ✅ 权限最小化:
ohos.permission.*都要配reason与usedScene,用时再申请; - ✅ 内容合规:UGC 功能要有举报/投诉入口;
- ✅ 应用信息:名称、图标、截图与实际功能一致,别挂羊头;
- ✅ 国内上架别忘了 App 备案(政策要求,别抱侥幸);
- ✅ 提审前自己完整走一遍"新用户流程",权限弹窗时机、隐私协议勾选都要顺。
心迹:三次被拒没有一次是"技术 bug",全是合规细节。技术人容易轻视文案和合规,但这恰恰是上架的临门一脚。
七、三个月,我真正的收获
- 技术安全感的来源又多了一个:从"我会 Spring"变成"我能快速吃下任何新生态";
- 声明式 UI + 状态管理是大势:写过鸿蒙再看 Compose/SwiftUI,一通百通;
- 生态早期入场有红利也有代价:坑多,但你趟过的坑就是文章、就是简历、就是别人搜不到的答案;
- 心态上,还是那句老话——但行好事,莫问前程;道法自然,先把坑踩完。
给同路人的三句建议:环境用真机、适配进架构、合规早启动。
八、写在最后(互动区)
上面这些坑,都是我这几个月一条条趟出来的。如果你也在做鸿蒙开发:
- 🔥 评论区聊聊:你在鸿蒙开发里踩过最痛的坑是什么?
- 后续我打算继续写:《鸿蒙三方库集成脚本化实战》《折叠屏一多适配 checklist》《审核合规自查表(可下载模板)》——想看哪个方向告诉我,我优先安排!
🎯 学习教程(传送门)
| 序号 | 专栏 | 学习内容 | 当前状态 |
|---|---|---|---|
| 01 | JAVA | 从入门到进阶的系统知识 | 持续写作中…… |
| 02 | Oracle | 数据库从用法到实战 | 创作中…… |
| 03 | vbs脚本 | 手把手教你做脚本 | 完善中…… |
| 04 | IDEA | 牛逼哄哄的编程利器 | 编写中…… |
| 05 | 面试 | 吐血整理的面试技巧 | 更新中…… |

🔥 往期文章
🧭 精选往期好文,更多请移步 我的博客主页
- 📕 MySQL 参数秘籍:my.cnf 关键参数详解与调参方法论
- 📗 Java 算法分层刷题:6 道高频题三件套解析
- 📘 2026 Java+AI 面试题全解析
- 📙 平安壹钱包面试官:请你说一下Mybatis的实现原理
- 📚 往期文章大全……

👍 点赞 + ⭐ 收藏 + 💬 评论,一键三连走起!
你们的支持,是我持续创作的最大动力~

✨ 以上就是今天的全部内容,关注我,技术之路不迷路!
📖 本人详解
✍️ 作者:王文峰,参与 CSDN 2020 年度博客之星评选,《Java王大师王天师》,外号:神秘小峯 / 山峯
🏮 中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!
🔗 转载说明:务必注明来源(注明:作者:王文峰哦)
更多推荐



所有评论(0)