HarmonyOS应用实战-启示散页-46-文章素材别混进应用包:把 CSDN 图片和运行资源分开管理
HarmonyOS应用实战-启示散页-46-文章素材别混进应用包把 CSDN 图片和运行资源分开管理发布前做包体复查时最容易被忽略的一类问题不是“图片太大”而是“这张图片本来就不该进包”。答案之书这类项目经常同时维护应用源码、商店截图、CSDN 文章封面、流程图和结构图。目录一乱文章用的 PNG 很容易被拷进entry/src/main/resources/base/media最后 HAP 变大资源来源说不清发布复盘也不知道该删哪一个文件。这篇文章只解决一个具体问题CSDN 文章素材如何和 HarmonyOS 运行资源彻底分开。读完后你应该能拿到四个结果判断一张图片到底服务文章、商店发布还是应用运行时。用资源账本解释包体里每个新增文件的 owner。用脚本在提交前拦住文章图片误入resources或rawfile。把检查结果写进发布清单而不是只说“构建通先还原一次真实事故链假设发布前发现 HAP 比上一个版本多了几百 KB。第一反应通常是压缩图片、删日志、查依赖。但继续往下看发现新增文件里有the_book_of_answers_46_cover.png、the_book_of_answers_46_flow.png这类文章图片。它们不是页面图标也不是启动页素材只是为了 CSDN 文章排版准备的说明图。这时问题已经不是压缩率而是资源归属失控现象真实原因后果HAP 包体变大文章 PNG 被复制进运行资源发布包携带无用素材删除图片怕影响页面没有 owner 记录不敢清理资源目录文章换图后应用也变化共用同一张文件内容发布影响应用运行审核截图和运行资源混在一起发布素材没有独立目录复盘时找不到证据边界已核对的当前目录边界是本系列文章图片位于media/the_book_of_answers/46/应用运行资源应由entry、libraryHAR、libraryHSP各自模块管理。本文不声称已经改过应用源码只给出可落地的检查与隔离方法。三类图片先分清 owner资源治理的第一步不是写脚本而是给每类图片命名。只看后缀和尺寸不够文章封面、商店截图、应用图标都可能是 PNG真正能区分它们的是“谁消费它”。类型推荐目录消费方是否进入 HAPCSDN 文章图media/the_book_of_answers/no/Markdown / CSDN 编辑器否商店截图release/screenshots/或发布清单目录AGC 提交材料否应用运行图标entry/src/main/resources/base/media/ArkUI$r(app.media.xxx)是默认题库 rawfileentry/src/main/resources/rawfile/SeedLoader/$rawfile(...)是HSP 自带组件资源libraryHSP/src/main/resources/HSP 页面或组件是这个表的作用很直接如果一张图只是 Markdown 文章里的流程图引用它就不应该出现在entry/src/main/resources。如果一张图被 ArkUI 页面通过$r(app.media.xxx)引用它就不应该放在文章素材目录里。用资源账本记录新增文件轻量项目不一定需要复杂资产平台但至少要有一份可读的资源账本。账本不参与运行时逻辑只服务发布复查谁加了文件、文件服务什么、是否打包、能否删除。typeAssetOwnerarticle|agcScreenshot|entryRuntime|harRuntime|hspRuntime|rawSeed;interfaceResourceLedgerItem{path:string;owner:AssetOwner;purpose:string;packagedInHap:boolean;referencedBy:string;removableAfterPublish:boolean;}这段模型的重点不是字段多而是owner和packagedInHap。文章图的packagedInHap必须是false运行资源的referencedBy必须能指向具体页面、组件或启动服务。只要这两项说不清就不要把文件留进提交。一条合格记录可以长这样{path:media/the_book_of_answers/46/the_book_of_answers_46_flow.png,owner:article,purpose:第46篇CSDN流程图,packagedInHap:false,referencedBy:HarmonyOS应用实战-启示散页-46.md,removableAfterPublish:false}如果同样的文件被复制进entry/src/main/resources/base/media/账本就应该报错而不是让它混进发布包。HarmonyOS 运行资源只认模块目录HarmonyOS 工程里运行资源有明确归属element放字符串、颜色和尺寸media放图标和图片profile放路由或配置rawfile放保留原始格式的资源。文章图片不属于其中任何一类。entry/src/main/resources/ base/ element/ string.json color.json media/ app_icon.png home_empty_deck.png profile/ main_pages.json router_map.json rawfile/ seed/default_deck.json media/the_book_of_answers/46/ the_book_of_answers_46_cover.png the_book_of_answers_46_flow.png the_book_of_answers_46_structure.png这里的分界线很硬home_empty_deck.png如果被首页Image($r(app.media.home_empty_deck))使用就应该在运行资源目录the_book_of_answers_46_flow.png只被 Markdown 引用就应该留在文章目录。不要因为两者都是 PNG 就放到同一个地方。页面引用运行资源时要能说清用途真正需要进入应用包的图片也不能只靠文件名存在。页面应该通过$r引用模块内资源并且文件名能说明业务用途。Componentstruct EmptyDeckPanel{build(){Column({space:12}){Image($r(app.media.home_empty_deck)).width(120).height(120)Text($r(app.string.home_empty_deck_title))Text($r(app.string.home_empty_deck_desc))}}}这段代码的 owner 很清楚home_empty_deck服务首页空题库状态属于运行资源可以进入 HAP。与它相对CSDN 的文章流程图没有任何 ArkUI 引用不应该为了“方便查看”放进base/media。资源配置也要保持同样边界{ module: { name: entry, type: entry, srcEntry: ./ets/Application/AbilityStage.ets, description: $string:module_desc, mainElement: EntryAbility, pages: $profile:main_pages } }module.json5只描述模块运行入口和资源配置不应该引用文章素材目录。文章和发布说明可以描述应用但不能变成应用的构建输入。提交前先跑两组扫描第一个扫描从文章出发确认 Markdown 引用的都是文章目录下的 PNG而且文件存在。$articleC:\Users\ADcaing\Desktop\csdn\HarmonyOS应用实战-启示散页-46-文章素材别混进应用包把 CSDN 图片和运行资源分开管理.md$rootSplit-Path-Parent$article$refsSelect-String-LiteralPath$article-Pattern!\[[^\]]\]\(([^)]\.png)\)-AllMatchesforeach($matchin$refs.Matches){$relative$match.Groups[1].Value$fullJoin-Path$root$relativeif(-not(Test-Path-LiteralPath$full)){throw文章图片不存在$relative}if($relative-notlikemedia/the_book_of_answers/46/*.png){throw第46篇图片路径越界$relative}}第二个扫描从应用工程出发确认运行资源目录里没有文章素材特征词。这里的目标不是证明源码一定正确而是拦住最常见的误复制。$projectD:\ProgramData\huawei\lesson\The_Book_of_Answers$resourceRoots ($project\entry\src\main\resources,$project\libraryHAR\src\main\resources,$project\libraryHSP\src\main\resources)foreach($rootin$resourceRoots){if(Test-Path-LiteralPath$root){$hitGet-ChildItem-LiteralPath$root-Recurse-File|Where-Object{$_.Name-matchthe_book_of_answers|csdn|article|cover_flow|structure}if($hit){$hit|ForEach-Object{Write-Output$_.FullName}throw文章素材疑似进入应用运行资源}}}这两个扫描方向不同一个保证文章能正常发布一个保证应用包不带文章素材。只做其中一个都不完整。包体复查要看“新增资源来源”如果构建后发现包体变大排查顺序建议从新增资源来源开始而不是直接压缩。压缩只能降低体积不能解决不该打包的问题。$beforeGet-Content.\release\resource-list-before.txt$afterGet-Content.\release\resource-list-after.txt$addedCompare-Object$before$after|Where-Object{$_.SideIndicator-eq}$added|ForEach-Object{$path$_.InputObjectif($path-matchthe_book_of_answers|csdn|article){throw发现文章素材进入包体清单$path}Write-Output新增资源待确认 owner$path}实际项目里可以从构建产物、资源清单或手工导出的文件列表中拿before/after。重点是每个新增资源都要回答两个问题它被哪个运行页面使用如果删除它应用哪条路径会失败反例把文章目录当成备用素材库最危险的写法不是偶尔复制一张图而是团队默认把media当成素材库。比如首页缺一个空态图就从 CSDN 文章里挑一张流程图放进resources/base/media发布截图缺一张说明图又从运行资源里复制出去改尺寸。几轮之后任何图片都说不清来源。反例通常有三个症状症状为什么危险正确处理文件名只有cover.png无法判断属于文章还是页面用home_empty_deck.png、article_46_flow.png区分用途文章图和运行图共用路径内容发布会影响应用包文章目录和资源目录物理隔离删除资源只靠人工记忆发布前不敢清理资源账本记录 owner 和引用点遇到这种情况不要先批量重命名。先按 owner 分类把不该进入 HAP 的文件移出运行资源再补账本和扫描脚本。否则只是把混乱资源换了一批新名字。验证清单第 46 篇文章发布前我建议按这张清单复查Markdown 中 3 张图片都指向media/the_book_of_answers/46/。3 张图片都是本地 PNG且文件真实存在。entry/src/main/resources、libraryHAR/src/main/resources、libraryHSP/src/main/resources中没有the_book_of_answers、csdn、article等文章素材命名。应用运行资源里的新增图片能找到 ArkUI$r(app.media.xxx)或启动服务引用。发布清单记录文章素材目录与应用资源目录相互独立。包体变大时先查新增资源 owner再考虑压缩。这里没有做真机运行验证也没有上传 CSDN。本文给出的验证是本地文件、Markdown 引用和工程资源边界检查如果要证明发布结果还需要在 CSDN 编辑器里完成图片上传和正文预览。常见问题与定位现象先看哪里处理HAP 体积突然变大新增资源清单找出是否有文章 PNG 进入 resources文章图片发布后丢失Markdown 图片路径确认本地 PNG 存在发布前上传到 CSDN 图床删除某张图担心影响应用是否有$r或$rawfile引用没有运行引用且 owner 是 article就不应在 HAP同名图片到处都有文件命名规则按业务用途重命名不按临时来源命名rawfile 里出现说明图rawfile 消费方rawfile 只留 SeedLoader 等真实运行输入排查时先从路径入手。文章素材路径应该能读出文章编号运行资源路径应该能读出页面或组件用途。路径都说不清时代码层面的引用通常也会跟着混乱。小结文章素材和运行资源的边界本质上是发布责任边界。CSDN 图片服务内容表达商店截图服务提交材料resources和rawfile服务应用运行。把这三类资产混在一起包体、审核和排障都会变得模糊。更稳的做法是目录先隔离账本写 owner提交前双向扫描包体复查只接受能解释来源的新增资源。

相关新闻

3个场景教你轻松玩转B站视频批量下载:BilibiliDown完整指南

3个场景教你轻松玩转B站视频批量下载:BilibiliDown完整指南

3个场景教你轻松玩转B站视频批量下载:BilibiliDown完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirr…

2026/10/20 20:23:11 阅读更多 →
TCP/IP协议簇是一个分层的网络通信模型,通常分为四层(或对应OSI七层的简化映射):应用层、传输层、网络层(网际层)、网络接口层(链路层)

TCP/IP协议簇是一个分层的网络通信模型,通常分为四层(或对应OSI七层的简化映射):应用层、传输层、网络层(网际层)、网络接口层(链路层)

TCP/IP协议簇是一个分层的网络通信模型,通常分为四层(或对应OSI七层的简化映射):应用层、传输层、网络层(网际层)、网络接口层(链路层)。各层核心协议及其功能如下:应用层…

2026/10/19 19:57:11 阅读更多 →
通义千问免费功能全图谱(2024Q2官方API+Web+App三端实测报告)

通义千问免费功能全图谱(2024Q2官方API+Web+App三端实测报告)

更多请点击: https://kaifayun.com 第一章:通义千问免费功能全景概览 通义千问(Qwen)作为阿里云推出的超大规模语言模型,面向个人开发者与普通用户长期提供稳定、免登录、无额度限制的基础能力。其免费功能覆盖文本生…

2026/10/19 7:33:30 阅读更多 →

最新新闻

Jenkinsfile核心难点:作用域、凭据、并行与错误处理四大陷阱

Jenkinsfile核心难点:作用域、凭据、并行与错误处理四大陷阱

1. 这不是写脚本,是在给流水线“立规矩”:Jenkinsfile 的真实定位与核心难点本质很多人第一次打开 Jenkinsfile,下意识把它当成“写个 shell 脚本就行”,结果跑起来要么阶段莫名失败、要么环境变量死活不生效、要么并行任务互相污…

2026/10/20 20:22:55 阅读更多 →
从零训练CNN到PyTorch迁移学习:Food-11图像分类实战全记录

从零训练CNN到PyTorch迁移学习:Food-11图像分类实战全记录

最近在折腾食物图片分类,拿 Food-11 数据集练手,从零手写了一个 CNN,又用 PyTorch 迁移学习刷了一轮,两种方案都完整跑通了。这篇东西把整个项目的思路、网络设计、训练细节、踩过的坑都整理出来,想给刚学完 PyTorch 基…

2026/10/20 20:22:55 阅读更多 →
SpringBoot+Vue宿舍管理系统开发实战:需求、设计到部署全攻略

SpringBoot+Vue宿舍管理系统开发实战:需求、设计到部署全攻略

1. 项目概述与核心需求解析每年到了毕业设计季和期末课程设计节点,总有一批同学被同一个问题卡住——宿舍管理系统到底怎么做才能既满足评审要求,又不会把自己卷进无底洞一样的前端调试里。我见过太多人拿着网上那种几十块钱打包的“古董项目”硬改&…

2026/10/20 20:22:55 阅读更多 →
CTF多层编码拆解实战:从千层套路到自动化脚本

CTF多层编码拆解实战:从千层套路到自动化脚本

1. 从一道CTF题看多层编码的拆解思路第一次看到"[MRCTF2020]千层套路1"这个题目名的时候,我脑子里第一反应就是——这肯定是个套娃题。CTF里带"千层"两个字的,十有八九是让你一层一层剥编码,剥到你手酸为止。事实证明我的…

2026/10/20 20:22:55 阅读更多 →
深度学习图像合成技术全解析:从抠图到光照协调的实战指南

深度学习图像合成技术全解析:从抠图到光照协调的实战指南

1. 为什么图像合成值得一篇独立的综述图像合成,英文叫 image composition,也有人叫 image blending、image merging,国内社区里更常见的说法是“融图”或者“溶图”。它干的事情说起来特别朴素:把一张图里的某个前景物体抠出来&am…

2026/10/20 20:22:55 阅读更多 →
钢价上涨竟成仓储自动化推手?一文看懂TCO与单位库位成本逻辑

钢价上涨竟成仓储自动化推手?一文看懂TCO与单位库位成本逻辑

钢铁涨价的消息一出,很多仓储从业者的第一反应是皱眉:货架要贵了,项目预算要超了,利润又要被吃掉一块。但最近跟几个做仓储集成的同行聊下来,发现一个有点反直觉的现象——钢材越涨,仓储自动化项目反而越顺…

2026/10/20 20:21:53 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →