HarmonyOS APP 工程结构

HarmonyOS应用发布形态为APP Pack(Application Package,简称APP),它是由一个或多个HAP(HarmonyOS Ability Package)包以及描述APP Pack属性的pack.info文件组成。
一个HAP在工程目录中对应一个Module,它是由代码、资源、第三方库及应用清单文件组成,可以分为Entry和Feature两种类型。
Entry:应用的主模块。一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。
Feature:应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。
HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开,它是由一个或多个Ability组成。Ability分为两种类型:FA(Feature Ability)和PA(Particle Ability)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。
工程目录结构对比
[$]
HarmonyOS 采用Java语言的工程目录结构如下图所示:

Android 工程目录如下图所示:

HarmonyOS 采用Java语言的工程目录结构 和 Android 工程目录结构对比如下:
目录结构 | Android | HarmonyOS |
源码目录 | project\entry\src\main\java | project\app\src\main\java |
资源文件目录 | project\app\src\main\res | project\entry\src\main\resources |
清单文件 | project\app\src\main\AndroidManifest.xml | project\entry\src\main\config.json |
依赖文件目录 | project\app\libs | project\entry\libs |
模块编译配置文件 | project\app\build.gradle | project\entry\build.gradle |
gradle目录 | project\gradle | project\gradle |
另外,HarmonyOS 还可以采用 Javascript 语言进行编写,工程目录结构如下图所示:

pages 目录:
pages 文件夹下可以包含1个或多个页面,每个页面都需要创建一个文件夹(如图中的index)。页面文件夹下主要包含3中文件类型:css、js和htm文件
pages/index/index.html 文件 :该html文件定义了页面的布局结构,使用到的组件,以及这些组件的层级关系。
pages/index/index.css 文件:该css文件定义了页面的样式与布局,包含样式选择器和各种样式属性 。
pages/index/index.js 文件: 该js文件描述了页面的行为逻辑,此文件里定义了页面里所用到的所有逻辑关系,比如数据、事件等。
app.js 目录:
该文件是全局的 Javascript 逻辑文件和应用的生命周期管理。
安装包内部对比
Android开发的小伙伴都知道,Android应用最终会被打包成 .apk文件,.apk也是Android 应用的安装包后缀。那么对于 HarmonyOS 应用,它的安装包到底是什么呢?
采用 HarmonyOS 开发的应用会被构建成 .hap文件,.hap是由代码、资源、第三方库及应用配置文件组成的模块包。
不同的 hap 可被部署到不同类型的设备上,那 hap 的内部结构 又是怎么样子的呢?
hap 和 apk 类似都是应用的归档文件,都是 基于的 ZIP 文件格式,你可以将后缀名改为.zip文件,然后对其进行解压,得到最终文件
.apk文件解压以后的文件如下图所示:

.hap 文件解压以后的文件如下图所示:

清单文件对比
清单文件是开发一款应用必不可少的构成部分,接下来我们来对比下鸿蒙OS的清单文件和Android清单文件的异同。
在Android中的清单文件为 AndroidManifest.xml文件,而 鸿蒙OS的清单文件为 config.json
接下来我们来通过对比同一款应用的config.json与AndroidManifest.xml文件,来看下两者之间的异同:
config.json文件
{ "app": { "bundleName": "com.example.helloword", "vendor": "example", "version": { "code": 1, "name": "1.0" }, "apiVersion": { "compatible": 3, "target": 3 } }, "deviceConfig": {}, "module": { "package": "com.example.helloword", "name": ".HelloWord", "reqCapabilities": [ "video_support" ], "deviceType": [ "tv" ], "distro": { "deliveryWithInstall": true, "moduleName": "entry", "moduleType": "entry" }, "abilities": [ { "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] } ], "orientation": "landscape", "formEnabled": false, "name": "com.example.helloword.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "HelloWord", "type": "page", "launchType": "standard" }, { "orientation": "landscape", "name": "com.example.helloword.MeAbility", "icon": "$media:icon", "description": "$string:meability_description", "label": "entry", "type": "page", "launchType": "standard" } ] } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hbkykj.helloword"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
鸿蒙OS应用的配置文件“config.json”中由“app”、“deviceConfig”和“module”三个部分组成,缺一不可。
- app :表示应用的全局配置信息。同一个应用的不同HAP包的“app”配置必须保持一致
- deviceConfig:表示应用在具体设备上的配置信息。
- module:表示HAP包的配置信息。该标签下的配置只对当前HAP包生效
[/$]