鸿蒙开发的IDE叫做DevEcoStudio,它是基于IntelliJIDEACommunity的开源版本打造,和AndroidStudio血脉相通,因此做过Android开发或者使用过IDEA的工程师们切换到鸿蒙开发时,会发现查看项目目录、文件结构、调试/运行、设备选择、日志、命令行等都是相同的位置,像回家一样自然,非常顺滑。
新建项目页面也类似:
上两图是开发鸿蒙和Android应用时新建项目的页面,可以看到两者很相似。在鸿蒙中,Ability类似Android的Activity,IDE提供了一些典型业务的Ability实例工程;另外鸿也提供了类似JNI的NApi工程,用于开发需要调用C++的项目。
当我们使用DevEcoStudio新建一个鸿蒙项目后,创建的项目长这样:
按照上图中从上往下的顺序(忽略前两个文件夹.hvigor.idea,不重要),第一个比较重要的文件夹是AppScope:
AppScope的作用是配置app的核心信息,包括唯一标识(bundleName)、版本号、icon和名称等等。新建项目后我们一般都会修改这些内容,这时候就需要修改上图中的app.json5文件。
.json5是鸿蒙项目中配置文件的格式,这个格式结尾的文件就是配置文件(好像是句废话哈哈).
第二个重要的文件夹是entry,它是鸿蒙项目的默认入口代码目录,内容比较多我们稍后介绍。
第三个文件夹是hvigor。
hvigor是鸿蒙项目的构建工具(可以类比Gradle),支持使用JavaScript/TypeScript开发配置脚本。
根目录下的hvigor文件夹用来配置构建工具的版本号、用到的插件、执行配置、日志配置、调试配置等信息:
当我们需要升级hvigor本身或者官方构建插件(@ohos/hvigor-ohos-plugin)的版本号时,需要去hvigor/hvigor-config.json5文件中修改(文件内容见上图右侧)。
hvigor依赖node,因此在开发鸿蒙项目时我们需要安装并配置node环境。
了解hvigor是什么后,接下来看下项目根目录下的hvigorfile.ts文件。
hvigorfile.ts是用来配置项目的构建校本,我们可以在其中创建自定义的task和plugin(两者差不多,不同在于plugin方便项目之间复用),然后添加到项目的构建流程中。
由于配置文件是ts文件格式,因此自定义hvigor构建task很简单,只需要定义一个pluginId、实现run方法即可。
在上图中,我们的myTask函数就是一个自定义的task,它的id是myTask,然后在任务的执行方法里打印了一条日志。
自定义plugin也是类似的,区别在于需要继承HvigorPlugin:
自定义task/plugin函数以后,我们把它添加到导出的plugins数组即可。
了解hvigor及hvigorfile.ts文件后,接下来我们看看根目录下另外比较重要的两个文件。
build-profile.json5用来配置app的签名信息、使用的SDK版本号、构建模式和多module信息。
签名信息配置在signingConfigs中:
{"app":{//工程的签名信息,可包含多个签名信息"signingConfigs":[{"name":"default",//标识签名方案的名称,用户可自定义"type":"HarmonyOS",//标识HarmonyOS应用//该方案的签名材料"material":{"certpath":"D:\\SigningConfig\\debug_hos.cer",//调试或发布证书文件,格式为.cer"storePassword":"******",//密钥库密码,以密文形式呈现"keyAlias":"debugKey",//密钥别名信息"keyPassword":"******",//密钥密码,以密文形式呈现"profile":"D:\\SigningConfig\\debug_hos.p7b",//调试或发布证书Profile文件,格式为.p7b"signAlg":"SHA256withECDSA",//密钥库signAlg参数"storeFile":"D:\\SigningConfig\\debug_hos.p12"//密钥库文件,格式为.p12}}],}}如上图所示,签名信息可以有多个,每个配置信息主要包括它的名称、使用的证书和密钥信息、密码等文件。
构建模式配置在buildModeSet中:
build-profile.json5中最后一个关键的配置信息是modules,即模块配置信息。
在大点的项目里一般会有多个模块,当我们新建一个模块后,就需要在build-profile.json5文件的modules属性中加一个配置:
"modules":[{"name":"entry",//模块名称,须与模块中module.json5文件中的module.name保持一致"srcPath":"./entry",//标明模块根目录相对工程根目录的相对路径"targets":[//定义构建的APP产物,由product和各模块定义的targets共同定义{"name":"default",//target名称,由各个模块的build-profile.json5中的targets字段定义"applyToProducts":["default"//表示将该模块下的“default”Target打包到“default”Product中]}]}]配置信息包括模块名称、路径、产物信息等。
比较可惜的是,目前build-profile.json5文件还不支持条件语句,这在大型项目编译时可是刚需啊。毕竟很多时候业务只想编译自己用到的那几个模块,如果能像Gradle一样根据properties文件里的值修改配置信息就好了,希望华为可以早点支持这个功能。
一个项目里会有多个oh-package.json5文件,除了根目录下,每个模块都有自己的oh-package.json5文件。
当模块有导出文件时,就需要在oh-package.json5的main属性填写要导出的文件名称,比如index.ets。
ohpm是鸿蒙的包管理工具,类似npm。
当我们在不同项目里用到同一个三方库时,为了避免版本冲突,可以在项目根目录下的oh-package.json5里强制指定版本号:
上图中在overrides中配置的三方库版本号将作为最终使用的版本。
介绍完上面的文件和文件夹作用后,终于到了最重要的entry目录:
entry的名字不一样,重点是它的内容,每个新建的模块一样。
从上图可以看到,entry目录下也有build-profile.json5、hvigorfile.ts和oh-package.json5文件,这是因为在鸿蒙项目里,每个模块可以单独配置自己的构建流程和依赖信息。
模块中最重要的配置文件却不在这三者之间,而是src/main/module.json5。
module.json5文件用来配置一个模块的名称、类型、进程信息和入口等,其中比较关键的配置有这些:
UIAbility的配置信息有这些:
UIAbility的启动模式有三种:
skills标签表示UIAbility被启动时能够接收的Want特征,那什么是Want呢?
Want是在组件启动时传递的对象,比如在UIAbilityA中要启动UIAbilityB时,可以通过定义一个Want对象传递数据给UIAbilityB。
根据是否指定要打开的Ability信息,Want分为两种:
可以看到,鸿蒙的Want类似Android的Intent。
"skills":[{"entities":["entity.system.home"],"actions":["action.system.home"]}]actions表示能够接收的行为,包括系统预定义的和自定义的。entities和它类似,暂时没搞清楚两者区别。
一个app可以配置多个具有入口能力的skills标签(即配置了ohos.want.action.home和entity.system.home)。
OK,这就是一个模块的module.json5文件核心属性。
介绍完上面的内容,entry文件夹中剩下的就是cpp、ets和resources文件夹。