当前位置: 首页 > news >正文

如何快速上手一个鸿蒙工程

    作为一名鸿蒙程序猿,当你换了一家公司,或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档,然后把一个鸿蒙工程交接给你了,说以后就是你负责了。之后几天你的状态大概就是下边这样的,一堆的需求和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使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …...

GRE技术的详细解释

GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装&#xff09;是一种隧道协议&#xff0c;主要用于在不同网络之间封装和传输其他网络层协议的数据包。它最常用于在IP网络上建立虚拟点到点的隧道连接&#xff0c;是实现VPN的一项关键技术。 下面从原理、…...

Mysql--基础篇--多表查询(JOIN,笛卡尔积)

在MySQL中&#xff0c;多表查询&#xff08;也称为联表查询或JOIN操作&#xff09;是数据库操作中非常常见的需求。通过多表查询&#xff0c;你可以从多个表中获取相关数据&#xff0c;并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作&#xff0c;每种JOIN都有…...

Java 泛型的用法

1. 泛型类 泛型类是指在类定义时使用类型参数来指定类的类型。这样可以在类的内部使用这些类型参数来定义字段、方法的返回类型和参数类型。 public class Box<T> {private T t;public void set(T t) {this.t t;}public T get() {return t;} }在这个例子中&#xff0c…...

人工智能与物联网:智慧城市的未来

引言 清晨6点&#xff0c;智能闹钟根据你的睡眠状态和天气情况&#xff0c;自动调整叫醒时间&#xff1b;窗帘缓缓打开&#xff0c;阳光洒满房间&#xff1b;厨房里的咖啡机已经为你准备好热饮&#xff0c;而无人驾驶公交车正按时抵达楼下站点。这不是科幻电影的场景&#xff…...

Python标准库之SQLite3

包含了连接数据库、处理数据、控制数据、自定义输出格式及处理异常的各种方法。 官方文档&#xff1a;sqlite3 --- SQLite 数据库的 DB-API 2.0 接口 — Python 3.13.1 文档 官方文档SQLite对应版本&#xff1a;3.13.1 SQLite主页&#xff1a;SQLite Home Page SQL语法教程&a…...

力扣 二叉树的最大深度

树的遍历&#xff0c;dfs与bfs基础。 题目 注意这种题要看根节点的深度是0还是1。 深度优先遍历dfs&#xff0c;通过递归分别计算左子树和右子树的深度&#xff0c;然后返回左右子树深度的最大值再加上 1。递归会一直向下遍历树&#xff0c;直到达到叶子节点或空节点。在回溯…...

Linux_进程间通信_共享内存

什么是共享内存&#xff1f; 对于两个进程&#xff0c;通过在内存开辟一块空间&#xff08;操作系统开辟的&#xff09;&#xff0c;进程的虚拟地址通过页表映射到对应的共享内存空间中&#xff0c;进而实现通信&#xff1b;物理内存中的这块空间&#xff0c;就叫做共享内存。…...

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 实时流&#xff08;也称为HLS&#xff08;.m3u8&#xff09;&#xff09;是一种基于HTTP的自适应比特率流通信协议。HLS.js依靠HTML5视频和MediaSource Extensions进行播放&#xff0c;其特点&#xff1a;视频点播和直播播放列表、碎片化的 MP4 容器、加密媒体扩展 …...

2025年华为OD上机考试真题(Java)——判断输入考勤信息能否获得出勤奖

题目&#xff1a; 公司用一个字符串来表示员工的出勤信息&#xff1a; absent&#xff1a;缺勤late&#xff1a;迟到leaveearly&#xff1a;早退present&#xff1a;正常上班 现需根据员工出勤信息&#xff0c;判断本次是否能获得出勤奖&#xff0c;能获得出勤奖的条件如下&am…...

空对象模式

在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中&#xff0c;我…...

开启Excel导航仪,跨表跳转不迷路-Excel易用宝

都2025年了&#xff0c;汽车都有导航了&#xff0c;你的表格还没有导航仪吗&#xff1f;那也太OUT了。 面对着一个工作簿中有N多个工作表&#xff0c;工作表中又有超级表&#xff0c;数据透视表&#xff0c;图表等元素&#xff0c;如何快速的切换跳转到需要查看的数据呢&#…...

年度技术突破奖|中兴微电子引领汽车芯片新变革

随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流&#xff0c;车企在电动化与智能化之后&#xff0c;正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC&#xff0c;作为支撑智驾和智舱高算力需求的核心组件&#xff0c;已成为汽车电子市场的重要新增量。…...

Ubuntu 如何查看盘是机械盘还是固态盘

在 Ubuntu 系统中&#xff0c;您可以通过以下方法来确定硬盘是机械硬盘&#xff08;HDD&#xff09;还是固态硬盘&#xff08;SSD&#xff09;&#xff1a; 使用 lsblk 命令&#xff1a; 打开终端&#xff0c;输入以下命令&#xff1a; lsblk -d -o name,rota该命令将列出所…...

计算机网络(三)——局域网和广域网

一、局域网 特点&#xff1a;覆盖较小的地理范围&#xff1b;具有较低的时延和误码率&#xff1b;使用双绞线、同轴电缆、光纤传输&#xff0c;传输效率高&#xff1b;局域网内各节点之间采用以帧为单位的数据传输&#xff1b;支持单播、广播和多播&#xff08;单播指点对点通信…...

STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信

目录 一、CAN、SN65HVD230DR二、TJA10501、TJA1050 特性2、TJA1050 引脚说明 三、硬件设计1、接线说明2、TJA1050 模块3、SN65HVD230 模块 四、程序设计1、CAN_Init&#xff1a;CAN 外设初始化函数2、CAN_Send_Msg、CAN_Receive_Msg 五、功能展示1、接线图2、CAN 数据收发测试 …...

将光源视角的深度贴图应用于摄像机视角的渲染

将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射&#xff08;Shadow Mapping&#xff09;技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下&#xff0c;并使用深度贴图来判断这些片段是否处于阴影中。 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…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...