1.鸿蒙系统
1.1 什么是鸿蒙
鸿蒙是一款面向万物互联时代的、全新的分布式操作系统。
在传统的单设备系统能力基础上,鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、AR/VR眼镜等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体娱乐等)业务能力。
1.2 鸿蒙特点
1.2.1 硬件互助,资源共享
实现不同终端设备之间的快速连接、能力互助、资源共享。依赖的关键技术包括分布式软总线、分布式设备虚拟化、分布式数据管理、分布式任务调度等。
分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互联互通提供了统一的分布式通信能力,为设备之间的无感发现和零等待传输创造了条件。
应用场景:
-
智能家居场景:在烹饪时,手机可以通过碰一碰和烤箱连接,并将自动按照菜谱设置烹调参数,控制烤箱来制作菜肴。设备之间即连即用,无需繁琐的配置。
-
视频通话场景:在做家务时接听视频电话,可以将手机与智慧屏连接,并将智慧屏的屏幕、摄像头与音箱虚拟化为本地资源,替代手机自身的屏幕、摄像头、听筒与扬声器,实现一边做家务、一边通过智慧屏和音箱来视频通话。
-
协同办公场景:将手机上的文档投屏到智慧屏,在智慧屏上对文档执行翻页、缩放、涂鸦等操作,文档的最新状态可以在手机上同步显示。
1.2.2 一次开发,多端部署
鸿蒙提供了用户程序框架、Ability框架以及UI框架,支持应用开发过程中多终端的业务逻辑和界面逻辑进行复用,能够实现应用的一次开发、多端部署,提升了跨设备应用的开发效率。
1.2.3 统一OS,弹性部署
支持多种终端设备按需弹性部署,能够适配不同类别的硬件资源和功能需求。
2. 鸿蒙应用程序
2.1 应用程序的不同形态
2.2 app文件的结构
app是应用分发的基本单元,其内部包含hap、hsp。
-
hap:应用安装和运行的基本单元
-
entry:应用的主模块,作为应用的入口,提供了应用的基础功能。
-
feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装【弹性部署】。
-
-
hsp:是动态共享包,可以包含代码、C++库、资源和配置文件,通过HSP可以实现应用内的代码和资源的共享。
一个应用程序(app)包含:一个entry包,0-N个feature包,0-N个hsp包。
鸿蒙app与安卓app对比:
|-----------------|---------------------|-----------|
| 鸿蒙 | 安卓 | 说明 |
| etc | dex | 代码编译后的字节码 |
| resources | res | 资源文件 |
| libs | lib | 动态库so |
| resources.index | resources.arsc | 资源索引 |
| module.json | AndroidManifest.xml | 应用的配置文件 |
2.3 工程结构
2.3.1 代码结构
-
AppScope > app.json5:应用的全局配置信息。
-
entry:HarmonyOS工程模块,编译构建生成一个HAP包。
-
src > main > ets:用于存放ArkTS源码。
-
src > main > ets > entryability:应用的入口。
-
src > main > ets > pages:应用包含的页面。
-
src > main > resources:用于存放应用所用到的资源文件,如图形、多媒体、字符串、布局文件等。关于资源文件。
-
src > main > module.json5:模块配置文件。主要包含HAP包的配置信息、应用在具体设备上的配置信息以及应用/服务的全局配置信息。具体的配置文件说明。
-
build-profile.json5:当前的模块信息 、编译信息配置项,包括buildOption、targets配置等。
-
hvigorfile.ts:模块级编译构建任务脚本,开发者可以自定义相关任务和代码实现。
-
obfuscation-rules.txt:混淆规则文件。混淆开启后,在使用Release模式进行编译时,会对代码进行编译、混淆及压缩处理,保护代码资产。
-
-
oh_modules:用于存放三方库依赖信息。
-
build-profile.json5:应用级配置信息,包括签名signingConfigs、产品配置products等。其中products中可配置当前运行环境,默认为HarmonyOS。
-
hvigorfile.ts:应用级编译构建任务脚本。
2.3.2 鸿蒙、安卓工程代码结构对比
模块类型及编译产物
在模块的module.json5文件中定义了模块的类型
{
"module": {
"name": "device_har",
"type": "har", //取值 hap:entry、feature;hsp;har;
"deviceTypes": [
"default",
"tablet",
"2in1"
]
}
}
2.3.3.1 模块产物类型
-
hap(Harmony Ability Package)是应用安装和运行的基本单元。编译后生成.hap文件。
hap包是由代码、资源、第三方库、配置文件等打包生成的模块包,其主要分为两种类型:entry和feature。
-
entry:应用的主模块,作为应用的入口,提供了应用的基础功能。
-
feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装。
-
-
hsp(Harmony Shared Package)是动态共享包。编译后生成.hsp文件。
包含代码、C++库、资源和配置文件,通过HSP可以实现应用内的代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应用同进程,具有相同的包名和生命周期。
- har(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。
在应用内HAR将打包到HAP、HSP中,不会单独存在。
2.3.3.2 模块产物的引用关系
2.4 APP启动过程
-
AbilityStage:是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。
-
UIAbility:是一种包含UI的应用组件,主要用于和用户交互。一个HAP中可以包含多个UIAbility,但一个UIAbility对应一个任务栈。
-
Page:代表一个页面。一个UIAbility中包含多个页面。
普通应用结构
只有一个Entry类型的hap,hap内只会有一个AbilityStage,普通应用只有一个任务栈,所以只会有一个UIAbility。
启动过程
- 声明module的AbilityStage,入口UIAbility,启动时自动创建相应的类
- UIAbility中当WindowStage创建完成后加载第一个Page
- 声明页面地址,页面跳转router
main_pages.json声明页面路径,通过系统提供的router组件打开对应的页面。
2.5 Page页面布局
2.5.1 声明式UI
-
装饰器: 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器,
-
@Entry表示该自定义组件为入口组件
-
@Component表示自定义组件,
-
@State表示组件中的状态变量,状态变量变化会触发UI刷新。
-
-
UI描述:以声明式的方式来描述UI的结构,例如build()方法中的代码块。
-
自定义组件:可复用的UI单元,可组合其他组件,如上述被@Component装饰的struct Hello。
-
系统组件:ArkUI框架中默认内置的基础和容器组件,可直接被开发者调用,比如示例中的Column、Text、Divider、Button。
-
属性方法:组件可以通过链式调用配置多项属性,如fontSize()、width()、height()、backgroundColor()等。
-
事件方法:组件可以通过链式调用设置多个事件的响应逻辑,如跟随在Button后面的onClick()。
-
系统组件、属性方法、事件方法具体使用可参考基于ArkTS的声明式开发范式。
2.5.2 常见的页面布局
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 布局 | 应用场景 |
| 线性布局(Row、Column) | 如果布局内子元素超过1个时,且能够以某种方式线性排列时优先考虑此布局。 |
| 层叠布局(Stack) | 组件需要有堆叠效果时优先考虑此布局。层叠布局的堆叠效果不会占用或影响其他同容器内子组件的布局空间。例如Panel作为子组件弹出时将其他组件覆盖更为合理,则优先考虑在外层使用堆叠布局。 |
| 弹性布局(Flex) | 弹性布局是与线性布局类似的布局方式。区别在于弹性布局默认能够使子组件压缩或拉伸。在子组件需要计算拉伸或压缩比例时优先使用此布局,可使得多个容器内子组件能有更好的视觉上的填充效果。 |
| 相对布局(RelativeContainer) | 相对布局是在二维空间中的布局方式,不需要遵循线性布局的规则,布局方式更为自由。通过在子组件上设置锚点规则(AlignRules)使子组件能够将自己在横轴、纵轴中的位置与容器或容器内其他子组件的位置对齐。设置的锚点规则可以天然支持子元素压缩、拉伸、堆叠或形成多行效果。在页面元素分布复杂或通过线性布局会使容器嵌套层数过深时推荐使用。 |
| 栅格布局(GridRow、GridCol) | 栅格是多设备场景下通用的辅助定位工具,可将空间分割为有规律的栅格。栅格不同于网格布局固定的空间划分,可以实现不同设备下不同的布局,空间划分更随心所欲,从而显著降低适配不同屏幕尺寸的设计及开发成本,使得整体设计和开发流程更有秩序和节奏感,同时也保证多设备上应用显示的协调性和一致性,提升用户体验。推荐内容相同但布局不同时使用。 |
| 媒体查询(@ohos.mediaquery) | 媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。例如根据设备和应用的不同属性信息设计不同的布局,以及屏幕发生动态改变时更新应用的页面布局。 |
| 列表(List) | 使用列表可以高效地显示结构化、可滚动的信息。在ArkUI中,列表具有垂直和水平布局能力和自适应交叉轴方向上排列个数的布局能力,超出屏幕时可以滚动。列表适合用于呈现同类数据类型或数据类型集,例如图片和文本。 |
| 网格(Grid) | 网格布局具有较强的页面均分能力、子元素占比控制能力。网格布局可以控制元素所占的网格数量、设置子元素横跨几行或者几列,当网格容器尺寸发生变化时,所有子元素以及间距等比例调整。推荐在需要按照固定比例或者均匀分配空间的布局场景下使用,例如计算器、相册、日历等。 |
| 轮播(Swiper) | 轮播组件通常用于实现广告轮播、图片预览等。 |
2.5.3 线性布局
Column 列
List 布局
3. 团队介绍
「三翼鸟数字化技术平台-智家APP平台」通过持续迭代演进移动端一站式接入平台为三翼鸟APP、智家APP等多个APP提供基础运行框架、系统通用能力API、日志、网络访问、页面路由、动态化框架、UI组件库等移动端开发通用基础设施;通过Z·ONE平台为三翼鸟子领域提供项目管理和技术实践支撑能力,完成从代码托管、CI/CD系统、业务发布、线上实时监控等Devops与工程效能基础设施搭建。