一个能跑起来的鸿蒙 App,到底最少需要哪些文件
新建一个工程,文件管理器里哗啦啦冒出几十个文件,`.json5`、`.toml`、`.cj`、`.ts` 混在一起,很多人当场就懵了:这么多文件,到底哪些是真正必须的?删了哪个 App 就跑不起来?
其实抓住一条主线就清楚了:一个最小可运行的华为鸿蒙系统应用,文件再多,本质上只做五件事——让系统认出它、让工具能构建它、让系统知道启动谁、提供启动代码和页面、再加上一点资源。今天我们就用华为仓颉编程语言的工程,把这五类文件一次数清楚,每一类都告诉你「少了它会怎样」。
别被文件数量吓到:先建立分类思维
打开工程别一个一个点,那样只会越看越乱。正确的做法是先分类:把几十个文件归成几个「功能组」,每组解决一个问题。
一个 App 要跑起来,无非要回答五个问题:我是谁?怎么把我编译出来?系统该启动我哪部分?启动后执行什么代码、显示什么页面?界面上的文字和图标从哪来?这五个问题,对应五类文件。理解了这个框架,再多的文件也只是往这五个抽屉里分类摆放而已。

第一类:应用身份,AppScope/app.json5
第一类回答「我是谁」。`AppScope/app.json5` 是整个应用的全局身份信息。
{ "app": { "bundleName": "com.example.myapplication", "versionCode": 1000000, "versionName": "1.0.0", "icon": "$media:layered_image", "label": "$string:app_name" } }
`bundleName` 是应用在系统里独一无二的标识,`versionName` 是版本号,`icon` 和 `label` 决定桌面上的图标和名字。少了这个文件,系统根本不知道你这是个什么应用,自然无从安装和启动。它是整个工程的身份证。

第二类:构建配置,让工具知道怎么编译
第二类回答「怎么把我编译出来」。这里有几个搭配使用的文件:项目级的 `build-profile.json5` 声明工程里有哪些模块,模块级的同名文件指向仓颉的构建配置,而真正管仓颉编译的是 `cjpm.toml`。
[package] cjc-version = "1.1.0" name = "ohos_app_cangjie_entry" output-type = "dynamic" src-dir = "./src/main/cangjie"
`cjpm.toml` 里写明了编译器版本、包名、输出类型、源码目录这些关键信息。构建工具就是靠这些文件,才知道去哪找代码、用什么参数编译。少了它们,代码写得再好也变不成能装的应用。
第三类:模块声明,告诉系统启动谁
第三类回答「系统该启动我哪部分」。`entry/src/main/module.json5` 描述了这个模块由哪些能力组成,以及哪个是入口。
{ "module": { "name": "entry", "mainElement": "EntryAbility", "abilities": [ { "name": "EntryAbility", "srcEntry": "ohos_app_cangjie_entry.MainAbility" } ] } }
`srcEntry` 指向了承载启动逻辑的仓颉类,`mainElement` 标明主入口。这个文件是配置和代码之间的桥,系统读它才知道点开图标后该把哪段代码跑起来。少了它,应用就是一堆系统无法启动的文件。
第四类:仓颉源码,启动逻辑和首页
第四类回答「启动后执行什么、显示什么」。最小情况下,你需要两段仓颉代码:一个继承自 `UIAbility` 的入口类,和一个用 `@Entry` 修饰的页面。
class MainAbility <: UIAbility { public override func onWindowStageCreate(windowStage: WindowStage): Unit { windowStage.loadContent("EntryView") } }
`MainAbility` 在窗口准备好时,用 `loadContent` 加载名为 `EntryView` 的页面;而 `EntryView` 就是用 `@Entry` 修饰的那个页面组件,定义了用户看到的第一屏。这两段代码,一个管「怎么启动」,一个管「显示什么」,是 App 真正的肉。

第五类:资源文件,文字和图标的来源
第五类回答「界面上的文字和图标从哪来」。还记得 `app.json5` 里的 `label` 写的是 `$string:app_name` 吗?那个 `$string:` 就是去资源文件里取值。
{ "string": [ { "name": "app_name", "value": "我的应用" } ] }
应用名、颜色、图标这些,都不直接写在代码里,而是放进 `string.json`、`color.json` 和 media 图标目录,再用 `$string:`、`$color:`、`$media:` 去引用。少了资源文件,那些引用就会指向空,应用名和图标都显示不出来。
五类文件,一个最小闭环
把这五类串起来,就是一个最小可运行 App 的完整骨架:`app.json5` 声明身份,构建配置让它能被编译,`module.json5` 告诉系统启动谁,仓颉源码提供启动逻辑和页面,资源文件补上文字和图标。五类各司其职,缺一类都跑不起来。

看懂这个分类,你再面对任何工程都不会慌了:先把文件归到这五个抽屉里,哪一类出问题就查哪一类。把复杂的东西拆成清晰的几块,本来就是高效开发的第一步。

夜雨聆风