✍️ 作者:王文峰(外号:神秘小峯 / 山峯)|中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!

在这里插入图片描述

📚 我是写了很多年 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 分不清

一句话理清:

概念是什么
HAPHarmony Ability Package,能力包,最小部署单元
HSPShared 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 没进包;
  • 解法:
    1. 检查 build-profile.json5 里 nativeLib 的 abiFilters 配置;
    2. CMakeLists.txt 的 target_link_libraries 名字与实际库名一致;
    3. 用 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",全是合规细节。技术人容易轻视文案和合规,但这恰恰是上架的临门一脚。

七、三个月,我真正的收获

  1. 技术安全感的来源又多了一个:从"我会 Spring"变成"我能快速吃下任何新生态";
  2. 声明式 UI + 状态管理是大势:写过鸿蒙再看 Compose/SwiftUI,一通百通;
  3. 生态早期入场有红利也有代价:坑多,但你趟过的坑就是文章、就是简历、就是别人搜不到的答案;
  4. 心态上,还是那句老话——但行好事,莫问前程;道法自然,先把坑踩完。

给同路人的三句建议:环境用真机、适配进架构、合规早启动。

八、写在最后(互动区)

上面这些坑,都是我这几个月一条条趟出来的。如果你也在做鸿蒙开发:

  • 🔥 评论区聊聊:你在鸿蒙开发里踩过最痛的坑是什么?
  • 后续我打算继续写:《鸿蒙三方库集成脚本化实战》《折叠屏一多适配 checklist》《审核合规自查表(可下载模板)》——想看哪个方向告诉我,我优先安排!

🎯 学习教程(传送门)

序号专栏学习内容当前状态
01JAVA从入门到进阶的系统知识持续写作中……
02Oracle数据库从用法到实战创作中……
03vbs脚本手把手教你做脚本完善中……
04IDEA牛逼哄哄的编程利器编写中……
05面试吐血整理的面试技巧更新中……

在这里插入图片描述

🔥 往期文章

🧭 精选往期好文,更多请移步 我的博客主页

在这里插入图片描述

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

在这里插入图片描述

✨ 以上就是今天的全部内容,关注我,技术之路不迷路!

📖 本人详解
✍️ 作者:王文峰,参与 CSDN 2020 年度博客之星评选,《Java王大师王天师》,外号:神秘小峯 / 山峯
🏮 中国国学、传统文化与代码爱好者的程序人生,期待你的关注和支持!
🔗 转载说明:务必注明来源(注明:作者:王文峰哦)

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐