如何快速上手一个鸿蒙工程
作为一名鸿蒙程序猿,当你换了一家公司,或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档,然后把一个鸿蒙工程交接给你了,说以后就是你负责了。之后几天你的状态大概就是下边这样的,一堆的需求和Bug朝你蜂拥而至。
为了尽可能缩短这个阶段,新手鸿蒙开发的兄弟可以看看这篇文章,如何快速上手熟悉一个鸿蒙工程。主要是配置相关的内容,看完之后帮你快速找到程序的入口,便于分析后续的逻辑。
本文的工程目录结构是目前最新的ArkTS Stage模型的工程目录结构,使用DevEco Studio 5.0.0 Release(2024年10月份发布)版本,不排除以后鸿蒙工程架构会升级,但是大的结构是不会变的 。
官网的文档在这,大家也可以直接去官网看,讲得也挺清楚的 文档中心
1、主工程配置

AppScope目录是影响整个工程的,app.json目录相当于Android工程中的build.gradle文件,其中定义了工程的包名、版本号等一系列信息,具体的含义我都列出来了。
没有列出来的都是非必填项
{"app": {// 必填,应用的包名,用于唯一标识一个应用,类似于Android的packagename"bundleName": "com.example.arklearn",// 非必填,开发商描述"vendor": "example",// 必填,版本号,一个整数,同Android的versioncode"versionCode": 1000000,// 必填,版本名称,同Android的versionname"versionName": "1.0.0",// 必填,应用图标"icon": "$media:app_icon",// 必填,应用名称"label": "$string:app_name"}
}
更多关于app.json5的详细介绍可参见官方文档 文档中心

除了app.json5文件外,还有一个resource文件夹。没错,见名知意,这里边放的是整个工程都可以访问的资源文件,比如string值和图片等
2、程序入口
看完主工程的配置了,我需要进一步研究代码了,程序入口在哪呢

因为鸿蒙采用的应用/元服务这种逻辑结构,一个工程下边可以包含多个应用/元服务。每个应用/元服务可以打包成一个hap包独立运行。不讲太复杂了,记着一件事,Entry就是应用的主模块,作为应用的入口,提供了应用的基础功能。所以,程序入口就看这个entry-->src-->main目录下的module.json5文件
配置的具体含义我列一下
{"module": {// 非必填,这个元服务需要申请的权限列表,就是Android的Manifest文件中列的权限"requestPermissions": [{"name": "ohos.permission.INTERNET"}],// 必填,当前module的名称"name": "entry",// 必填,标识当前Module的类型。支持的取值如下:// entry:应用的主模块// feature:应用的动态特性模块// har:静态共享包模块,android的aar// shared:动态共享包模块,android的so"type": "entry",// 非必填,当前module的描述信息"description": "$string:module_desc",// 非必填,但是一般都会填。标识当前Module的入口UIAbility名称,是在下边的abilities中定义的// 这个Ability相当于Android的Activity,"mainElement": "EntryAbility",// 必填,标识当前module可以运行在哪类设备上"deviceTypes": ["phone","tablet",// 融合了屏幕触控和键鼠操作的二合一设备"2in1"],// 必填,应用安装的时候这个module是不是默认安装,如果是入口的module,那就必须安装"deliveryWithInstall": true,// 必填,当前module是不是支持免安装特性,意思就是用的时候再安装。// 如果是一个元服务,这个地方可以为true,如果是应用,必须为false"installationFree": false,// 在有UIAbility的场景下必填,意思就是你声明的page都在哪放着呢// 当前这个配置标识,page声明是在当前module的// src/main/resources/base/profile/main_pages.json文件中存的"pages": "$profile:main_pages",// 一个数组,声明当前module有哪些ability,类似于android的acitvity"abilities": []}
}
看这个文件,你可以找到entry这个modue的入口Ability是EntryAbility

找到这个对应的EntryAbility类,进入看代码,具体每个回调函数的意思先不讲,跟Android Activity的回调比较像。

你就看onWindowStageCreate回调函数中,windowStage.loadContent的传参是什么。pages/Index,就表示,入口的page是Index

Index对应的文件目录是src/main/ets/pages/Index.ets
这样你就找到程序的入口了,进入看代码逻辑吧
3、常见目录和文件都放的什么
先看工程级别的全局配置

| 文件名称 | 说明 |
| oh-package | 这是一个文件夹,用于存放工程编译时依赖的三方库。具体依赖哪些库呢,是在oh-package.json5文件中定义的 |
| build-profile.json5 | 工程级别的配置信息,包括签名、产品配置 |
| hvigorfile.ts | 工程级的编译构建任务脚本 具体想看如何配置签名文件,编译鸿蒙工程的,可以看我的这篇文章 鸿蒙工程签名编译和上架_鸿蒙对包进行签名-CSDN博客 |
| oh-package.json5 | 描述全局配置,如:依赖覆盖(overrides)、依赖关系重写(overrideDependencyMap)和参数化配置 |
module级别的一些配置,以entry模块为例

| 文件名称 | 说明 |
| src/main/ets | 码的代码就在这放着呢 |
| src/main/ets/entryability | 应用/元服务的入口Ability,类似android的activity |
| src/main/ets/pages | 应用/元服务包含的页面,就是你能看到的UI交互,类似android的fragment |
| src/main/resource | 资源文件存放的目录,类似于android的res |
| resource/profile/main_pages.json5 | 所有的page都得在这个文件中注册 |
| module.json5 | 上边有详细讲,应用/元服务的详细配置 |
| build-profile.json5 | module级别的配置信息,包括签名、产品配置 |
| hvigorfile.ts | module级的编译构建任务脚本 |
| oh-package.json5 | 描述module配置,如:依赖覆盖(overrides)、依赖关系重写(overrideDependencyMap)和参数化配置 |
基本上看到这,你就知道你接手的这个工程的入口在哪,有哪些page,用到的资源有哪些,签名编译情况,依赖了哪些三方库。剩下的就是看代码,赶紧入坑了
相关文章:
如何快速上手一个鸿蒙工程
作为一名鸿蒙程序猿,当你换了一家公司,或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档,然后把一个鸿蒙工程交接给你了,说以后就是你负责了。之后几天你的状态大概就是下边这样的,一堆…...
c++入门之 命名空间与输入输出
1、命名空间 1.1使用命名空间的原因 先看一个例子: #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问,这个程序能跑起来吗? 答案是否定的 原因是,当我们想创建一个全局变量 …...
GRE技术的详细解释
GRE(Generic Routing Encapsulation,通用路由封装)是一种隧道协议,主要用于在不同网络之间封装和传输其他网络层协议的数据包。它最常用于在IP网络上建立虚拟点到点的隧道连接,是实现VPN的一项关键技术。 下面从原理、…...
Mysql--基础篇--多表查询(JOIN,笛卡尔积)
在MySQL中,多表查询(也称为联表查询或JOIN操作)是数据库操作中非常常见的需求。通过多表查询,你可以从多个表中获取相关数据,并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作,每种JOIN都有…...
Java 泛型的用法
1. 泛型类 泛型类是指在类定义时使用类型参数来指定类的类型。这样可以在类的内部使用这些类型参数来定义字段、方法的返回类型和参数类型。 public class Box<T> {private T t;public void set(T t) {this.t t;}public T get() {return t;} }在这个例子中,…...
人工智能与物联网:智慧城市的未来
引言 清晨6点,智能闹钟根据你的睡眠状态和天气情况,自动调整叫醒时间;窗帘缓缓打开,阳光洒满房间;厨房里的咖啡机已经为你准备好热饮,而无人驾驶公交车正按时抵达楼下站点。这不是科幻电影的场景ÿ…...
Python标准库之SQLite3
包含了连接数据库、处理数据、控制数据、自定义输出格式及处理异常的各种方法。 官方文档:sqlite3 --- SQLite 数据库的 DB-API 2.0 接口 — Python 3.13.1 文档 官方文档SQLite对应版本:3.13.1 SQLite主页:SQLite Home Page SQL语法教程&a…...
力扣 二叉树的最大深度
树的遍历,dfs与bfs基础。 题目 注意这种题要看根节点的深度是0还是1。 深度优先遍历dfs,通过递归分别计算左子树和右子树的深度,然后返回左右子树深度的最大值再加上 1。递归会一直向下遍历树,直到达到叶子节点或空节点。在回溯…...
Linux_进程间通信_共享内存
什么是共享内存? 对于两个进程,通过在内存开辟一块空间(操作系统开辟的),进程的虚拟地址通过页表映射到对应的共享内存空间中,进而实现通信;物理内存中的这块空间,就叫做共享内存。…...
ubuntu 下生成 core dump
在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited后仍然无效。 1.ulimit -c unlimited 输出的的含义是核心转储文件的大小限制,单位是blocks,默认是0,表示不生成core dump文件。 2. 重设core_pattern ulimit -c unlimited后,核心转储文件…...
学习HLS.js
前言 HTTP 实时流(也称为HLS(.m3u8))是一种基于HTTP的自适应比特率流通信协议。HLS.js依靠HTML5视频和MediaSource Extensions进行播放,其特点:视频点播和直播播放列表、碎片化的 MP4 容器、加密媒体扩展 …...
2025年华为OD上机考试真题(Java)——判断输入考勤信息能否获得出勤奖
题目: 公司用一个字符串来表示员工的出勤信息: absent:缺勤late:迟到leaveearly:早退present:正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下&am…...
空对象模式
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中,我…...
开启Excel导航仪,跨表跳转不迷路-Excel易用宝
都2025年了,汽车都有导航了,你的表格还没有导航仪吗?那也太OUT了。 面对着一个工作簿中有N多个工作表,工作表中又有超级表,数据透视表,图表等元素,如何快速的切换跳转到需要查看的数据呢&#…...
年度技术突破奖|中兴微电子引领汽车芯片新变革
随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流,车企在电动化与智能化之后,正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC,作为支撑智驾和智舱高算力需求的核心组件,已成为汽车电子市场的重要新增量。…...
Ubuntu 如何查看盘是机械盘还是固态盘
在 Ubuntu 系统中,您可以通过以下方法来确定硬盘是机械硬盘(HDD)还是固态硬盘(SSD): 使用 lsblk 命令: 打开终端,输入以下命令: lsblk -d -o name,rota该命令将列出所…...
计算机网络(三)——局域网和广域网
一、局域网 特点:覆盖较小的地理范围;具有较低的时延和误码率;使用双绞线、同轴电缆、光纤传输,传输效率高;局域网内各节点之间采用以帧为单位的数据传输;支持单播、广播和多播(单播指点对点通信…...
STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信
目录 一、CAN、SN65HVD230DR二、TJA10501、TJA1050 特性2、TJA1050 引脚说明 三、硬件设计1、接线说明2、TJA1050 模块3、SN65HVD230 模块 四、程序设计1、CAN_Init:CAN 外设初始化函数2、CAN_Send_Msg、CAN_Receive_Msg 五、功能展示1、接线图2、CAN 数据收发测试 …...
将光源视角的深度贴图应用于摄像机视角的渲染
将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射(Shadow Mapping)技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下,并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…...
docker一键安装脚本(docker安装)
第一种方法一键安装命令 curl -O --url http://luyuanbo79.south.takin.cc/wenjian/docker_install.sh && chmod x docker_install.sh && ./docker_install.sh 备用方法 curl -O --url https://file.gitcode.com/4555247/releases/untagger_0896d4789937405…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
