文档开发者中心
我的
|

App开发

HarmonyOS 6

鸿蒙缓存逻辑

已解决
为什么我们项目上,打的新包之后,感觉新包偶尔会有旧的缓存在里面,比如fix的bug,在IDE中直接构建到真机是没了,但是通过git提交之后统一打包还存在这个问题
点赞
1
收藏
1
回复
17
分享
举报
浏览198 发布于2026-08-28 09:40陕西
全部评论
最多点赞
最新发布
最早发布
|
采纳答复
这个问题通常不是“缓存逻辑”本身的问题,而是构建系统缓存与应用运行时缓存共同作用的结果。核心原因在于:IDE 直接构建时默认会清理增量缓存,而 CI(持续集成)或统一打包脚本可能未执行完整清理,导致旧的编译产物(如 HAP 包中的资源、代码)被复用。
以下是导致该现象的四个主要原因及对应解决方案:
1. 构建缓存未清理(最常见)
- 原因:Hvigor 构建系统会缓存模块的编译产物。CI 打包时若未执行  clean  或  --no-daemon ,可能复用旧模块的  .hsp  或  .hap  文件,其中包含未修复的旧代码。
- 解决:
- 在 CI 打包脚本中显式执行:
 hvigor clean assembleHap 
或删除  build/ 、 .hvigor/  目录后再构建。
- 检查  build-profile.json5  中是否配置了  cache.enabled: false (建议 CI 环境关闭缓存)。
2. 应用运行时缓存(Preferences / 文件缓存)
- 原因:修复的 bug 可能涉及数据逻辑(如接口返回字段变更),但旧版本写入的 Preferences 或文件缓存未被清除。新包安装后直接读取了旧缓存数据,导致“bug 复现”的假象。
- 解决:
- 在应用启动时增加缓存版本号校验:
若当前缓存版本号 < 新包版本号,则调用  clearAll()  或删除指定 key。
- 测试时先卸载旧包再安装新包,或手动清除应用数据(设置 → 应用 → 存储 → 删除数据)。
3. 模块间依赖未正确更新
- 原因:项目为多模块(HAR / HSP)架构,CI 打包时可能只编译了变更模块,未重新编译依赖它的模块。例如修复了  common  模块的 bug,但  entry  模块仍引用旧编译产物。
- 解决:
- 在 CI 脚本中执行全量编译: hvigor assembleHap --all-modules 。
- 检查  oh-package.json5  中的依赖版本号,确保使用  file:  或  workspace:  协议引用本地模块,避免误用远程缓存。
4. 资源文件缓存($r / Resource)
- 原因:修复的 bug 涉及资源文件(如字符串、图片),但 CI 打包时资源编译缓存未失效,导致旧资源被打包。
- 解决    ◦ ​在 ​ build-profile.json5 ​ 中配置资源清理:
收起
自动换行
深色代码主题
复制
    "buildOption": {
            "strictMode": {
                    "resource": {
                              "enableClean": true
                                      }
                                            }
                                                }
    }

 修改资源文件后,手动删除  build/  目录下的  intermediates/res  文件夹。

验证与预防建议
1. 本地复现:在 IDE 中执行  Build → Clean Project  后再构建,看问题是否消失。若消失,则确认是构建缓存问题。
2. CI 脚本模板:
收起
自动换行
深色代码主题
复制
   # 强制清理并全量构建
      hvigor clean --daemon false
         hvigor assembleHap --all-modules --daemon false

   3. 版本号策略:每次发布前,在  AppScope/app.json5  中递增  versionCode ,并在应用启动时对比  versionCode ,若不一致则清空所有运行时缓存。
如果以上步骤仍无法解决,请检查 CI 环境是否使用了不同的签名证书或混淆配置,导致部分代码被意外移除或替换。
展开全部
6楼回复于2026-08-28 11:47 来自陕西
Git提交merge时操作不当。
学习或培训《GitFlow》。
  1. 个人怎么用好git。
  2. 团队配合怎么分支,怎么合并,怎么约束等。
  3. git 自动化构建项目。
18楼编辑于2026-09-02 09:10 来自北京

这种情况我一般会先怀疑“构建产物缓存”,不一定是手机里的应用缓存。

因为你在 IDE 里直接构建到真机已经验证 bug 消失,但 Git 提交后统一打包又出现,说明两条构建链路很可能拿到的代码或产物不完全一样。

重点排查这几个地方:

  1. 统一打包机器有没有 build、hvigor、模块产物缓存,增量编译可能继续用了旧产物。可以先做一次 clean build 验证。
  2. 检查统一打包实际 checkout 的 commit,确认修复代码真的已经包含进去,尤其是多分支、子模块或者 cherry-pick 的情况。
  3. 看统一打包的构建参数。比如 build profile、product、模块配置不同,可能实际编译的不是 IDE 测试的那套代码。
  4. 如果使用了三方库、HAR/HSP,重点检查有没有引用旧版本产物。源码已经改了,但依赖仍然指向旧 HAR/HSP,也会出现“本地好了,统一打包还是有问题”。
  5. 最后再查设备侧缓存。统一打包出来的新包安装时如果没有彻底覆盖旧数据,像数据库、Preferences、文件缓存这些业务数据仍然会保留。不过这种情况通常不会导致“代码 bug 又回来”,除非 bug 本身和持久化数据有关。

可以让 CI 每次正式构建先执行一次完整 clean,然后把最终产物的 commit ID、版本号、构建时间打印到日志里。这样很快就能判断到底是“打包用了旧代码/旧产物”,还是“新代码读取了旧业务数据”。

按照你描述的“IDE 构建已经修复,Git 统一打包又复现”来看,我会优先查 CI 的增量构建缓存和 HAR/HSP 等依赖产物。

17楼回复于2026-08-31 09:42 来自辽宁

清理下编译缓存跟构建包缓存试试看

cke_2085.pngcke_841.png

11楼编辑于2026-08-31 07:56 来自广东

问题本质:很多人把"缓存"和"持久化"混为一谈。鸿蒙里:

  • @StorageLink / Preferences 是同步落盘的小 KV,适合配置项,不适合大对象;
  • 大文件/图片缓存应放 cacheDir,且系统低内存时会被清;
  • 网络层缓存要自己控制有效期。

常见"缓存逻辑不生效"根因:

1. Preferences 写完必须 flush() 才真正写盘,否则只在内存在。

收起
自动换行
深色代码主题
复制
const pref = dataPreferences.getPreferences(this.context, 'app');
pref.put('token', value);
await pref.flush();   // 关键标记:PreferenceCacheV2 的落盘动作

2. cacheDir 里的文件不保证长期存在,别用它当持久存储;要持久用 filesDir。

3. 想做"内存+磁盘"二级缓存,推荐 @StorageProp 配合手动写 filesDir,或在 API 12+ 用 cached 装饰的状态。

验证:改完杀进程再进,能读回说明落盘成功;读不回说明只写了内存(漏 flush 或写到了 cacheDir)。

15楼编辑于2026-08-31 08:36 来自北京

这个有可能是构建的时候有缓存残留问题。

如果是通过 IDE 直接构建到真机时,DevEco Studio 通常会自动处理增量编译缓存,确保最新代码生效。

但通过 CI/CD 流水线或命令行统一打包时,如果构建环境中的缓存未被正确清理,hvigor 的增量编译机制可能会复用旧的编译产物,导致新代码没有被真正编译进最终包中。

推荐方案:在 CI/CD 流水线的打包步骤前,增加清理操作进行强制清理。

cke_3043.png

14楼回复于2026-08-31 08:07 来自北京

本地 IDE → 真机时,DevEco 一般会检测代码和资源变化,只重编有改动的文件;但 CI 为了提速,可能缓存了 `.hvigor/`、`build/`、`oh_modules/`,甚至复用了旧的 HAR/HSP 产物,导致最终 HAP 中的 `.abc` 或资源文件没有更新。

建议按下面方式排查和处理:

收起
自动换行
深色代码主题
复制
rm -rf .hvigor/ build/ oh_modules/
hvigorw --no-daemon clean
hvigorw --no-daemon assembleHap --mode release

如果项目包含多个本地模块,还要确认上游 HAR/HSP 已重新构建;发版构建建议固定使用 `clean + build`,不要直接依赖增量缓存。构建完成后,也可以解包 HAP,检查其中的 `.abc`、`resources.index` 等文件是否包含最新代码和资源。

如有帮助,欢迎给个采纳。

13楼回复于2026-08-31 08:06 来自北京
优先检查远程仓库中是否存在 target/ 目录,并确保 CI 命令包含 clean 参数。这两项是导致“新包有旧代码”的最常见原因。
12楼回复于2026-08-31 07:59 来自河北

【解决方案概述】

Hvigor增量构建机制在打包时复用了旧的编译产物,导致新包中包含旧缓存。IDE直接构建会触发完整构建流程或自动清理过期缓存,而通过git提交后统一打包(命令行hvigorw)时,增量构建缓存未清理,Hvigor对比上次构建的输入和输出后判定未变化则跳过任务执行,直接复用旧产物。根因是打包前未清理build目录和.hvigor缓存目录。

【实施步骤】

步骤1:在统一打包流程中,执行hvigorw assembleHap之前先执行hvigorw clean清理build目录

步骤2:确认hvigor-config.json5中execution.incremental配置项的状态,如需彻底避免可设为false

步骤3:检查.gitignore文件,确保build/和.hvigor/目录已被忽略,避免构建产物和缓存被提交到git仓库

步骤4:在CI/CD流水线中增加clean步骤,确保每次打包前工作空间被正确清理

【代码示例】

打包脚本示例:

hvigorw clean

hvigorw assembleHap

hvigor-config.json5配置(关闭增量构建):

{

  "execution": {

    "incremental": false

  }

}

.gitignore配置:

build/

.hvigor/

【参考文档】

- 增量构建:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-incremental-build

- hvigor-config.json5配置:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-set-options

【验证方法】

1. 在统一打包前执行hvigorw clean,重新打包后安装到真机,检查fix的bug是否已修复

2. 检查hvigor-config.json5中execution.incremental的配置值,确认是否为true(默认开启)

3. 执行git ls-files build/确认build目录未被提交到仓库(应无输出)

4. 在CI/CD流水线中确认clean步骤存在且在打包步骤之前执行

【注意事项】

关闭增量构建(incremental: false)会导致每次全量构建,构建时间增加,仅在问题频发时建议使用

推荐方案是每次打包前执行hvigorw clean,既保留增量构建的效率优势,又确保产物最新

【备选方案】

方案A:打包前执行hvigorw clean清理build目录(优点:保留增量构建效率,清理彻底;缺点:需修改打包流程)

方案B:关闭增量构建incremental: false(优点:一劳永逸,无需修改流程;缺点:构建时间增加)

方案C:打包前同时删除.hvigor目录和执行hvigorw clean(优点:最彻底的清理;缺点:首次构建时间较长)

展开全部
10楼回复于2026-08-31 01:19 来自广东
先区分应用缓存、构建缓存和 CI 工作区缓存:本地 clean 后正常而统一打包异常,重点检查 CI 是否复用了旧的 build、ohpm 或中间产物目录。固定依赖锁文件,清理构建缓存后再打包,并确认最终 HAP 的资源时间和哈希。 
9楼回复于2026-08-30 14:17 来自四川
共2页
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要提问题

了解社区公约,与您携手共创和谐专业的开发者社区。