App就是应用,指运行在设备的操作系统之上,为用户提供特定服务的程序,简称“应用”。
在HarmonyOS上运行的应用,有两种形态:
- 传统方式的需要安装的应用。
- 提供特定功能,免安装的应用(即原子化服务)。
原子化服务是HarmonyOS提供的一种面向未来的服务提供方式,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统程序框架后台安装后即可使用)、可为用户提供一个或多个便捷服务的用户应用程序形态。
例如:某传统方式的需要安装的购物应用A,在按照原子化服务理念调整设计后,成为由“商品浏览”“购物车”“支付”等多个便捷服务组成的、可以免安装的购物原子化服务A*。
1.应用基础知识
1.1鸿蒙应用程序包结构
Android应用以APK(Android Application package)形式发布,当我们需要在Android手机上安装一个App时,首先需要找到这个App对应的APK安装包,执行该APK安装包就能安装App了。
HarmonyOS应用/服务发布形态为APP Pack(Application Package,简称APP),它是由一个或多个HAP(HarmonyOS Ability Package)包以及描述APP Pack属性的pack.info文件组成。
一个HAP在工程目录中对应一个Module,它是由代码、资源、第三方库及应用/服务配置文件组成,可以分为Entry和Feature两种类型,具体如下:
- entry:应用/服务的主模块,可独立安装运行。一个APP中,对于同一类型的设备,可以包含一个或多个entry类型的HAP,如果同一设备类型包含多个entry模块,需要配置distroFilter分发规则。
- feature:应用/服务的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。
可以认为entry是主模块,而feature是配置模块
HAP是Ability的部署包,HarmonyOS应用/服务代码围绕Ability组件展开,它是由一个或多个Ability组成。Ability分为两种类型:FA(Feature Ability,中文名称:元程序)和PA(Particle Ability,中文名称:元服务)。FA/PA是应用/服务的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。
我们在应用的build目录下可以找到名为entry-debug-rich-unsigned.hap或entry-debug-rich-signed.hap的文件,如下图所示,这些.hap文件就是HarmonyOS的应用软件包。
1.2HarmonyOS工程介绍
工程目录结构
DevEco Studio工程目录结构提供工程视图和HarmonyOS视图。工程创建或打开,默认显示工程视图,如果要切换到HarmonyOS视图,在左上角点击Project > Ohos进行切换。
左边是工程视图,右边是HarmonyOS视图
- .gradle:Gradle配置文件,由系统自动生成,一般情况下不需要进行修改。
- entry:默认启动模块(主模块),开发者用于编写源码文件以及开发资源文件的目录。
- entry>libs:用于存放entry模块的依赖文件。
- entry>src>main>Java:用于存放Java源码。
- entry>src>main>resources:用于存放应用/服务所用到的资源文件,如图形、多媒体、字符串、布局文件等。
代码层次的应用
在代码层次,我们可以看到下图所示的MyApplication,这是整个应用的入口。
从代码可以看到,MyApplication继承自AbilityPackage
,而AbilityPackage
是用来初始化每个HAP的基类。
1.3库文件
库文件是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件),存放在libs目录,如下图所示
1.4pack.info
描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。HAP的具体属性包括:
- delivery-with-install: 表示该HAP是否支持随应用安装。“true”表示支持随应用安装;“false”表示不支持随应用安装。
- name:HAP文件名。
- module-type:模块类型,entry或feature。
- device-type:表示支持该HAP运行的设备类型。
2.应用配置文件
HarmonyOS应用的每个HAP的根目录下都存在一个“config.json”配置文件,如下图所示:
config.json文件内容主要涵盖以下三个方面:
- 应用的全局配置信息,包含应用的包名、生产厂商、版本号等基本信息。
- 应用在具体设备上的配置信息,包含应用的备份恢复、网络安全等能力。
- HAP包的配置信息,包含每个Ability必须定义的基本属性(如包名、类名、类型以及Ability提供的能力),以及应用访问系统或其他应用受保护部分所需的权限等。
2.1配置文件组成
JSON
1.JSON是什么?
- JSON(JavaScript Object Notation, JS对象表示)是一种轻量级的数据交换格式。
- JSON类似于XML,但比XML更小、更快、更易解析。
- JSON使用Javascript语法来描述数据对象,但是JSON仍然独立于语言和平台:JSON解析器和JSON库支持许多不同的编程语言,目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
- JSON具有自我描述性,更易理解。
2.JSON语法
JSON语法是JavaScript对象表示语法的子集:数据在名称/值对、数据由逗号分隔、大括号 {} 保存对象、中括号[]保存数组,数组可以包含多个对象。具体来说就是:
- JSON数据的书写格式是:
key : value
,比如:"name" : "starry陆离"
。 - JSON名都是字符串,用
""
包围;而JSON值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在中括号中)、对象(在大括号中)、null。 - JSON数字可以是整型或者浮点型,比如:
"age":20
。 - JSON对象在大括号{}中书写,比如:
{"name":"starry陆离", "gender":"男", age:20 }
。 - JSON数组在中括号[]中书写,数组可包含多个对象,比如:
"students":[ {"name":"zhangsan"}, {"name":"lisi"}]
- JSON 布尔值可以是true或者false,比如:
"married":true
- JSON 可以设置null值,比如:
{ "runoob":null }
2.2配置文件元素
DevEco Studio提供了两种编辑“config.json”文件的方式。在“config.json”的编辑窗口中,可在右上角切换代码编辑视图或可视化编辑视图。
配置文件的内部结构
config.json由app、deviceConfig和module三个部分组成,缺一不可。具体如下所示:
- app:表示应用的全局配置信息。同一个应用的不同HAP包的app配置必须保持一致。数据类型为对象,不可缺省。
- deviceConfig:表示应用在具体设备上的配置信息。数据类型为对象,不可缺省。
- module:表示HAP包的配置信息。该标签下的配置只对当前HAP包生效。数据类型对象,不可缺省。
2.2.1app对象的内部结构
app对象包含应用的全局配置信息,内部结构说明如下:
- bundleName:表示应用的包名,用于标识应用的唯一性。包名是由字母、数字、下划线(_)和点号(.)组成的字符串,必须以字母开头。支持的字符串长度为7~127字节。包名通常采用反域名形式表示(例如,“com.example.myapplication”)。建议第一级为域名后缀“com”,第二级为厂商/个人名,第三级为应用名,也可以采用多级。
- vendor:表示对应用开发厂商的描述。字符串长度不超过255字节。该值可缺省,缺省值为空。
- version:表示应用的版本信息。
- name:表示应用的版本号,用于向应用的终端用户呈现。
- code:表示应用的版本号,仅用于HarmonyOS管理该应用,不对应用的终端用户呈现。
- minCompatibleVersionCode:表示应用可兼容的最低版本号,用于在跨设备场景下,判断其他设备上该应用的版本是否兼容。格式与version.code字段的格式要求相同。
- smartWindowSize:该标签用于在悬浮窗场景下表示应用的模拟窗口的尺寸。配置格式为“正整数*正整数”,单位为vp。正整数取值范围为[200,2000]。
- smartWindowDeviceType:表示应用可在哪些设备上使用模拟窗口打开。取值为:智能手机phone、平板tablet、智慧屏tv。
- targetBundleList:表示允许以免安装方式拉起的其他HarmonyOS应用,列表取值为每个HarmonyOS应用的bundleName,多个 bundleName之间用英文“,”区分,最多配置5个bundleName。如果被拉起的应用不支持免安装方式,则拉起失败。
2.2.2deviceConfig对象的内部结构
deviceConfig包含在具体设备上的应用配置信息,可以包含default、phone、tablet、tv、car、wearable、liteWearable和smartVision等属性。default标签内的配置是适用于所有设备通用,其他设备类型如果有特殊的需求,则需要在该设备类型的标签下进行配置。
- default:表示所有设备通用的应用配置信息,不可缺省。
- phone:表示手机类设备的应用信息配置。
- tablet:表示平板的应用配置信息。
- tv:表示智慧屏特有的应用配置信息。
- car:表示车机特有的应用配置信息。
- wearable:表示智能穿戴特有的应用配置信息。
- liteWearable:表示轻量级智能穿戴特有的应用配置信息。
- smartVision:表示智能摄像头特有的应用配置信息。
2.2.3module对象的内部结构
module对象包含HAP包的配置信息,内部结构说明如下:
- mainAbility:表示HAP包的入口ability名称。该标签的值应配置为“module > abilities”中存在的Page类型ability的名称。该标签仅适用于手机、平板、智慧屏、车机、智能穿戴。
- package:表示HAP的包结构名称,在应用内应保证唯一性。采用反向域名格式(建议与HAP的工程目录保持一致)。字符串长度不超过127字节。该标签仅适用于手机、平板、智慧屏、车机、智能穿戴。
- name:表示HAP的类名。采用反向域名方式表示,前缀需要与同级的package标签指定的包名一致,也可采用“.”开头的命名方式。字符串长度不超过255字节。该标签仅适用于手机、平板、智慧屏、车机、智能穿戴。
- ...
- distroFilter:表示应用的分发规则。该标签用于定义HAP包对应的细分设备规格的分发策略,以便在应用市场进行云端分发应用包时做精准匹配。该标签可配置的分发策略维度包括API Version、屏幕形状、屏幕分辨率。在进行分发时,通过deviceType与这三个属性的匹配关系,唯一确定一个用于分发到对应设备的HAP。
3.资源文件
resources目录包括两大类目录,一类为base目录与限定词目录,另一类为rawfile目录。
base目录与限定词目录
- 组织形式
- 按照两级目录形式来组织,目录命名必须符合规范,以便根据设备状态去匹配相应目录下的资源文件。
- 一级子目录为base目录和限定词目录:
- base目录(resources.base)是默认存在的,当应用的resources资源目录中没有与设备状态匹配的限定词目录时,会自动引用该目录中的资源文件。
- 限定词目录需要开发者自行创建。目录名称由一个或多个表征应用场景或设备特征的限定词组合而成。上图中的resources.en、resources.zh、resources.en_GB-vertical-car-mdpi都是限定词目录。
- 二级子目录为资源目录,用于存放字符串、颜色、布尔值等基础元素以及媒体、动画、布局等资源文件。
- base>element:包括字符串、整型数、颜色、样式等资源的json文件。每个资源均由json格式进行定义。
- base>graphic:xml类型的可绘制资源,如SVG(Scalable Vector Graphics)可缩放矢量图形文件、Shape基本的几何图形(如矩形、圆形、线等)等。
- base>layout:xml格式的界面布局文件。
- base>media:多媒体文件,如图形、视频、音频等文件,支持的文件格式包括:.png、.gif、.mp3、.mp4等。
- base>profile:用于存储任意格式的原始资源文件。区别在于rawfile不会根据设备的状态去匹配不同的资源,需要指定文件路径和文件名进行引用。
- 编译方式
- 目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。
- 引用方式
通过指定资源类型(type)和资源名称(name)来引用,
rawfile目录
- 组织形式
- 支持创建多层子目录,目录名称可以自定义,文件夹内可以自由放置各类资源文件。rawfile目录的文件不会根据设备状态去匹配不同的资源。
- 编译方式
- 目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。
- 引用方式
通过指定文件路径和文件名来引用。