作为一名鸿蒙程序猿,当你换了一家公司,或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档,然后把一个鸿蒙工程交接给你了,说以后就是你负责了。之后几天你的状态大概就是下边这样的,一堆的需求和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,用到的资源有哪些,签名编译情况,依赖了哪些三方库。剩下的就是看代码,赶紧入坑了