参考:华为开发官方指南文档中心
目录
简介
1.应用程序
2.应用结构
3.配置文件详细解析
3.1 配置文件结构
3.2 APP对象内部结构详解
3.3 deviceConfig对象的内部结构详解
3.4 module对象的内部结构详解
4.应用数据管理
5.资源分类与访问
5.1 resources目录结构
5.2 限定词目录命名
5.3 大类目录下的子类目录
5.4 创建资源
5.5 资源访问
5.5.1 访问应用资源
5.5.2 访问系统资源
本系列是windows系统下、采用ArkTS语言、ArkUI框架、deveco studio编译器学习纯鸿蒙软件研发,采用API version 9进行。本小节主要介绍鸿蒙应用程序的类型、结构、配置文件、数据管理,资源文件的目录结构、创建与访问等基础知识。纯小白,一步步学习,记录一下过程便于查询。
鸿蒙的应用程序目前有两种:一种是传统的类似于App需要安装的应用,一种是提供特定服务的免安装应用,本人需求为第一种,加之能力有限,先只记录和实践第一种。
鸿蒙应用以程序包的形式进行发布,一般包括一个或多个HAP以及描述HAP属性的pack.info组成。应用结构如下图。
(1)HAP是由代码、资源、第三方库及应用配置文件组成的模块包,可分为entry和feature两种模块模型。
(2)entry是应用的主模块,对于某个应用程序App,可以包含一个或多个entry类型的HAP,但是主要是为了兼容设备,例如兼容不同屏幕分辨率的设备,兼容不同版本鸿蒙系统对应不同的API Version等等。也可能同一个设备类型中存在多个entry模块,则必须配置distroFilter分发规则,使得应用市场在做应用的云端分发时,对该设备类型下不同规格的设备进行精确分发。(这一部分暂时无需求,暂时搁置,之后再进行扩充学习)。
(3)feature是指应用的动态性模块,一个APP中可以包含零个、一个或多个feature类型的HAP。
(4)Ability是引用所具备能力的抽象,一个应用可以包含一个或多个Ability,只有包含Ability的HAP才能独立运行。Ability分为两种类型,FA(Feature Ability)和PA(Particle Ability),FA/PA是应用的基本组成单元,能够实现特定的业务能力,FA有UI界面,而PA无UI界面(FA类似于Android中带有XML布局文件的Activity,PA类似于android中编写功能的类文件)。
(5)库文件:显而易见,库文件是应用依赖的第三方代码,例如so、jar、bin、har等二进制文件。和android相同,存放在libs目录。
(6)资源文件:应用资源文件,类似于android的res下的图片、布局、字符串、颜色等文件,存放于resources目录下。
(7)配置文件(config.json):在API 9中对应目录下的configuration目录结构写的哦欸之文件,用于声明应用的Ability,以及应用所需权限等信息。
(8)pack.info:描述述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。HAP的具体属性包括:
delivery-with-install: 表示该HAP是否支持随应用安装。“true”表示支持随应用安装;“false”表示不支持随应用安装。
name:HAP文件名。
module-type:模块类型,entry或feature。
device-type:表示支持该HAP运行的设备类型。
API 9中这些主要是IDE自动配置生成到了configutration下的config.json中。
(9)HAR:HAR(HarmonyOS Ability Resources)可以提供构建应用所需的所有内容,包括源代码、资源文件和config.json文件。HAR不同于HAP,HAR不能独立安装运行在设备上,只能作为应用模块的依赖项被引用,类似于JAVA的jar包。
鸿蒙应用数据管理支持单个设备的各种结构化数据的持久化,以及跨设备之间的数据的同步、共享以及搜索功能。应用数据管理可以我们方柏霓的实现在不通终端设备间无缝衔接应用程序数据,满足用户跨设备使用数据的一致性体验。
(1)本地应用数据管理:单设备上结构化数据的存储和访问能力
SQLite持久化存储引擎
多种类型本地化数据库:关系型数据库Relational Database、对象关系映射数据库Object Relational Mapping Database、轻量级偏好数据库Light Weight Preference Database。
(2)分布式数据服务:支持用户跨设备相互同步,为用户提供在多种终端设备上一致的数据访问体验。
通过调用分布式数据接口,应用可以将数据保存到分布式数据库中。通过结合帐号、应用唯一标识和数据库三元组,分布式数据库对属于不同应用的数据进行隔离。
(3)分布式文件服务:在多个终端设备间为单个设备上应用程序创建的文件提供多终端的分布式共享能力。
每台设备上都存储一份全量的文件元数据,应用程序通过文件元数据中的路径,可以实现同一应用文件的跨设备访问。
(4)数据搜索服务:在单个设备上,为应用程序提供搜索引擎级的全文索引管理、建立索引和搜索功能。
(5)数据存储管理:为应用开发者提供系统存储路径、存储设备列表,存储设备属性的查询和管理功能。
应用开发过程中,经常需要用到颜色、字体、间距、图片等资源(类似于android的res目录),在不同的设备或配置中,这些资源的值可能不同。
应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同设备或配置中的表现。
系统资源:开发者直接使用系统预置的资源定义。
应用开发中使用的各类资源中,需要按照特定的目录结构存储到resources目录中,resources包括三大类:①base目录,②限定词目录,③rawfile目录。resources目录及三大类目录结构如下:
(1)base目录默认存在,当应用的resources目录中没有与设备状态匹配的限定词目录时,会自动引用该目录中的资源文件。base目录的二级子目录为资源组目录,用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。通过指定资源类型(type)和资源名称(name)来引用。
(2)限定词目录需要创建,目录名称由一个或多个表征应用场景或设备特征的限定词组合而成。应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找资源,只有当没有相匹配的限定词目录时,或者限定词目录中无该资源,才会去base中寻找。限定词目录的二级子目录为资源组目录,用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。通过指定资源类型(type)和资源名称(name)来引用。
(3)rawfile是原始文件目录,支持创建多层子目录,目录名称可以自定义,文件夹内可以自由放置各类资源文件,但是不会根据设备状态匹配不同的资源。通过指定文件路径和文件名来引用。
限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括移动国家码和移动网络码、语言、文字、国家或地区、横竖屏、设备类型、颜色模式和屏幕密度等维度,限定词之间通过下划线(_)或者中划线(-)连接。也就是说可以通过限定词目录来将限定词资源和不同国家、不同语言、横竖屏、不同屏幕分辨率等等进行关联。
(1)限定词目录命名组合顺序:_移动国家码_移动网络码-语言_文字_国家或地区-横竖屏-设备类型-颜色模式-屏幕密度_。
(2)限定词目录命名连接方式:语言、文字、国家或地区之间采用下划线(_)连接,移动国家码和移动网络码之间也采用下划线(_)连接,除此之外的其他限定词之间均采用中划线(-)连接。
(3)限定词取值范围:
移动国家码和移动网络码:取自设备注册的网络,MCC后面可以跟随MNC,使用下划线(_)连接,也可以单独使用。参考ITU-T E.212(国际电联相关标准)。
语言:设备使用的语言类型,2-3个小写字母组成。参考ISO 639(ISO制定的语言编码标准)。
文字:设备使用的文字类型,1个大写字母和3个小写字母组成,参考ISO 15924(ISO制定的文字编码标准)。
国家或地区:用户所在的国家或地区,由2~3个大写字母或者3个数字组成。参考ISO 3166-1(ISO制定的国家和地区编码标准)。
横竖屏:设备的屏幕方向,vertical竖屏,horizontal横屏。
设备类型:设备的类型,car车机,tv智慧屏,wearable智能穿戴。
颜色模式:设备的颜色模式,dark深色模式,light浅色模式。
屏幕密度:
sdpi-小规模的屏幕密度,适用于dpi取值为(0, 120]的设备。
mdpi-中规模的屏幕密度,适用于dpi取值为(120, 160]的设备。
ldpi-表示大规模的屏幕密度,适用于dpi取值为(160, 240]的设备。
xldpi-表示特大规模的屏幕密度,适用于dpi取值为(240, 320]的设备。
xxldpi-表示超大规模的屏幕密度,适用于dpi取值为(320, 480]的设备。
xxxldpi-表示超特大规模的屏幕密度,适用于dpi取值为(480, 640]的设备。
base目录与限定词目录下面可以创建资源组目录(包括element、media、profile),用于存放特定类型的资源文件。
(1)
element目录:表示元素资源,包含boolean、color、float、intarray(整型数组)、integer、pattern(样式)、plural(复数形式)、strarray(字符串数组)、string,均以相应的JSON文件来表征。JSON文件格式如下:
color.json:
"color": [
{
"name": "color_hello",
"value": "#ffff0000"
},
{
"name": "color_world",
"value": "#ff0000ff"
}
]
}
float.json:
"float": [
{
"name": "float_hello",
"value": "28.0fp"
}
]
}
string.json:
{
"string":[
{
"name":"string_hello",
"value":"Hello"
}
]
}
plural.json:
{
"plural":[
{
"name":"eat_apple",
"value":[
{
"quantity":"one",
"value":"%d apple"
},
{
"quantity":"other",
"value":"%d apples"
}
]
}
]
}
(2)media目录:表示媒体资源,包括图片(.jpg/.png/.gif/.svg/.webp/.bmp)、音视频(.3gp/.mp4/.webm/.mkv)等非文本格式的文件。
rawfile目录:表示其他类型的文件,在应用构建为hap包后,以原始文件形式保存,不会被集成到resources.index文件中。
(1)创建资源目录:在resources目录右键菜单选择“New > Resource Directory”,此时可创建资源目录。
资源目录创建的是base目录。
也可根据需求创建其它限定词目录。确定限定词后,选择资源组类型,当前资源组类型支持Element、Media、Profile三种,创建后自动生成目录名称。
创建完成后如下:
(2)创建资源文件:资源目录的右键菜单选择“New > XXX Resource File”,即可创建对应资源组目录的资源文件。
(1)在工程中,通过"$r('app.type.name')"的形式引用应用资源(base目录和限定词目录下的资源)。app代表是应用内resources目录中定义的资源;type代表资源类型(或资源的存放位置),可以取“color”、“float”、“string”、“plural”、“media”,name代表资源命名。
(2)引用rawfile下资源时使用"$rawfile('filename')"的形式,filename需要表示为rawfile目录下的文件相对路径,文件名需要包含后缀,路径开头不可以以"/"开头。
系统资源包含色彩、圆角、字体、间距、字符串及图片等。可以通过“$r('sys.type.resource_id')”的形式引用系统资源。sys代表是系统资源;type代表资源类型,可以取“color”、“float”、“string”、“media”;resource_id代表资源id。