1.4 HarmonyOS App结构
用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,简称应用。在HarmonyOS上运行的应用,有两种形态:传统方式需要安装应用和提供特定功能;免安装的应用(原子化服务)。在HarmonyOS中,如无特殊说明,应用所指代的对象包括上述两种形态,类似安卓系统的App。
1.App逻辑结构
HarmonyOS的用户应用程序包以App Pack(Application Package)形式发布,它由一个或多个HAP(HarmonyOS Ability Package)及描述每个HAP属性的pack.info组成。HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开。
一个HAP是由代码、资源、第三方库及应用配置文件组成的模块包,可分为Entry和Feature两种模块类型,如图1-8所示。Entry是应用的主模块,一个App中,对于同一设备类型,可以有一个或多个Entry类型的HAP支持该设备类型中不同规格(API版本、屏幕规格等)的具体设备。如果同一设备类型存在多个Entry模块,则必须配置distroFilter分发规则,使应用市场在做云端分发时,对该类型下不同规格的设备进行精确分发。Feature是应用的动态特性模块,一个App可以包含一个或多个Feature类型的HAP,也可以不包含,只有包含Ability的HAP才能够独立运行。
图1-8 App逻辑视图
Ability:Ability是应用所具备的能力抽象,一个应用可以包含一个或多个Ability,分为FA和PA两种类型。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI,而PA无UI。
库文件:库文件是应用依赖的第三方代码(so、jar、bin、har等二进制文件),存放在libs目录下。
资源文件:应用的资源文件(字符串、图片、音频等)存放于resources目录下,便于开发者使用和维护。
配置文件:配置文件(config.json)是应用的Ability信息,用于声明应用的Ability及应用所需权限等信息。
pack.info:描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储,HAP的具体属性包括如下内容。
(1)delivery-with-install:表示该HAP是否支持随应用安装,True表示支持随应用安装,False表示不支持随应用安装。
(2)name:HAP文件名。
(3)module-type:模块类型,entry或feature。
(4)device-type:表示支持该HAP运行的设备类型。
HAR(HarmonyOS Ability Resources):可以提供构建应用所需的所有内容,包括源代码、资源文件和config.json文件。HAR不同于HAP,它不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
2.应用配置文件
应用的每个HAP根目录下都存在一个config.json配置文件,文件内容主要由App、deviceConfig和module三部分组成,缺一不可。
App包括应用的全局配置信息,包含应用的包名、生产厂商、版本号等基本信息。
deviceConfig包括应用在具体设备的配置信息,包含应用的备份恢复、网络安全等能力。deviceConfig包含在具体设备上的应用配置信息,可以包含default、phone、tablet、tv、car、wearable、liteWearable和smartVision等属性。default标签内的配置适用于所有设备通用,其他设备类型如果有特殊需求,则需要在该设备类型的标签下进行配置。
module包括HAP包的配置信息,包含每个Ability必须定义的基本属性(包名、类名、类型和Ability提供的能力),以及应用访问系统或其他应用受保护部分所需的权限等。
配置文件config.json采用Json文件格式,其中包含了一系列配置项,每个配置项由属性和值两部分构成。属性出现顺序不分先后,且每个属性最多只允许出现一次。每个属性的值为Json的基本数据类型(数值、字符串、布尔值、数组、对象或者null类型)。
3.资源文件
应用的资源文件(字符串、图片、音频等)统一存放于resources目录下,便于开发者使用和维护。resources目录包括两大类:一类为base目录与限定词目录,另一类为rawfile目录。
base目录与限定词目录按照两级目录形式组织,目录命名必须符合要求,以便根据设备状态匹配相应目录下的资源文件。
一级子目录为base目录与限定词目录。base目录是默认存在的目录。当应用的resources资源目录中没有与设备状态匹配的限定词目录时,会自动引用该目录中的资源文件。base目录与限定词目录下面可以创建资源组目录(element、media、animation、layout、graphic、profile),用于存放特定类型的资源文件。
限定词目录需要开发者自行创建。目录名称由一个或多个表征应用场景或设备特征的限定词组合而成。二级子目录为资源目录,用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括移动国家码和移动网络码、语言、文字、国家或地区、横竖屏、设备类型、颜色模式和屏幕密度等维度,限定词之间通过下画线(_)或者中画线(-)连接。开发者在创建限定词目录时,需要掌握命名要求、限定词目录与设备状态的匹配规则。
限定词目录为设备状态匹配对应的资源规则,优先级从高到低依次为:移动国家码和移动网络码→区域(可选组合:语言、语言_文字、语言_国家或地区、语言_文字_国家或地区)→横竖屏→设备类型→颜色模式→屏幕密度。如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配,例如限定词目录zh_CN-car-ldpi不能参与en_US设备的资源匹配。
rawfile目录支持创建多层子目录,目录名称可以自定义,文件夹内可以自由放置各类资源文件。rawfile目录的文件不会根据设备状态匹配不同的资源,如表1-1所示。
表1-1 资源文件