应用程序包结构
HarmonyOS的用户应用程序包以APP Pack(Application Package)形式发布,它是由一个或多个HAP(HarmonyOS Ability Package)以及描述每个HAP属性的pack.info组成。HAP是 Ability 的部署包,HarmonyOS应用代码围绕Ability组件展开。
一个HAP是由代码、资源、第三方库及应用配置文件组成的模块包,可分为entry和feature两种模块类型,如 图1 所示。
- entry:应用的主模块。一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。
- feature:应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。只有包含Ability的HAP才能够独立运行。
- 图1
-
Ability
Ability是应用所具备的能力的抽象,一个应用可以包含一个或多个Ability。Ability分为两种类型:FA(Feature Ability)和PA(Particle Ability)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。
库文件
库文件是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件),存放在libs目录。
资源文件
应用的资源文件(字符串、图片、音频等)存放于resources目录下,便于开发者使用和维护,详见资源文件的分类。
配置文件
配置文件 (config.json) 是应用的Ability信息,用于声明应用的Ability,以及应用所需权限等信息,详见应用配置文件。
pack.info
描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。HAP的具体属性包括:
- delivery-with-install: 表示该HAP是否支持随应用安装。“true”表示支持随应用安装;“false”表示不支持随应用安装。
- name:HAP文件名。
- module-type:模块类型,entry或feature。
- device-type:表示支持该HAP运行的设备类型。
Create HarmonyOS Project
1. 创建一个 JAVA 工程 类似 Android 的空工程 JAVA 语言
2. Configure your project
1. 创建一个 Application
2. 工程目录结构
目录讲解:
1. entry :应用主模块 入口
2. resources:资源包 包含:图片资源以及 应用配置
1. base 基础资源
element : string.json 字符串引用 key:Value 形式
graphic:background_ability_main.xml shape 资源
layout : 布局文件
media : 图片资源 例如:icon.png
rawfile:raw 也是资源相关
<Text
ohos:id="$+id:text_helloworld"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="$string:mainability_HelloWorld"
ohos:text_size="40vp"
/>
创建资源文件
在resources目录下,可按照限定词目录和资源组目录的说明创建子目录和目录内的文件。
同时,DevEco Studio也提供了创建资源目录和资源文件的界面。
- 创建资源目录及资源文件
在resources目录右键菜单选择“New > Harmony Resource File”,此时可同时创建目录和文件。
文件默认创建在base目录的对应资源组下。如果选择了限定词,则会按照命名规范自动生成限定词+资源组目录,并将文件创建在目录中。
目录名自动生成,格式固定为“限定词.资源组”,例如创建一个限定词为横竖屏类别下的竖屏,资源组为绘制资源的目录,自动生成的目录名称为“vertical.graphic”。
- 创建资源目录
在resources目录右键菜单选择“New > Harmony Resource Directory”,此时可创建资源目录。
选择资源组类型,设置限定词,创建后自动生成目录名称。目录名称格式固定为“限定词.资源组”,例如创建一个限定词为横竖屏类别下的竖屏,资源组为绘制资源的目录,自动生成的目录名称为“vertical.graphic”。
- 创建资源文件
在资源目录的右键菜单选择“New > XXX Resource File”,即可创建对应资源组目录的资源文件。
例如,在element目录下可新建Element Resource File。
资源文件的使用
资源文件的引用方法
base目录与限定词目录中的资源文件:通过指定资源类型(type)和资源名称(name)来引用。
- Java文件引用资源文件的格式:ResourceTable.type_name。特别地,如果引用的是系统资源,则采用:ohos.global.systemres.ResourceTable.type_name。
- 示例一:在Java文件中,引用string.json文件中类型为“String”、名称为“app_name”的资源。
-
ohos.global.resource.ResourceManager resManager = this.getResourceManager(); String result = resManager.getElement(ResourceTable.String_app_name).getString();
- 示例二:在Java文件中,引用color.json文件中类型为“Color”、名称为“red”的资源。
-
ohos.global.resource.ResourceManager resManager = this.getResourceManager(); int color = resManager.getElement(ResourceTable.Color_red).getColor();
- 示例一:在Java文件中,引用string.json文件中类型为“String”、名称为“app_name”的资源。
- XML文件引用资源文件的格式:$type:name。特别地,如果引用的是系统资源,则采用:$ohos:type:name。在XML文件中,引用string.json文件中类型为“String”、名称为“app_name”的资源,示例如下:
<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:width="match_parent" ohos:height="match_parent" ohos:orientation="vertical"> <Text ohos:text="$string:app_name"/> </DirectionalLayout>
rawfile目录中的资源文件:通过指定文件路径和文件名称来引用。
在Java文件中,引用一个路径为“resources/rawfile/”、名称为“example.js”的资源文件,示例如下:
ohos.global.resource.ResourceManager resManager = this.getResourceManager();
ohos.global.resource.RawFileEntry rawFileEntry = resManager.getRawFileEntry("resources/rawfile/example.js");
系统资源文件
目前支持的部分系统资源文件详见表1。
系统资源名称 | 含义 | 类型 |
---|---|---|
ic_app | 表示HarmonyOS应用的默认图标。 | 媒体 |
request_location_reminder_title | 表示“请求使用设备定位功能”的提示标题。 | 字符串 |
request_location_reminder_content | 表示“请求使用设备定位功能”的提示内容,即:请在下拉快捷栏打开"位置信息"开关。 | 字符串 |
颜色模式的定义
应用可以在config.json的module字段下定义“colorMode”字段,“colorMode”字段用来定义应用自身的颜色模式,值可以是“dark”,“light”,“auto”(默认值)。示例:
-
"colorMode": "light"
当应用的颜色模式值是“dark”时,无论系统当前颜色模式是什么,应用始终会按照深色模式选取资源;同理,当应用的颜色模式值是“light”时,无论系统当前颜色模式是什么,应用始终会按照浅色模式选取资源;当应用的颜色模式值是“auto”时,应用会跟随系统的颜色模式值选取资源。应用可以在代码中通过如下方式获取应用当前的颜色模式:
int colorMode = Configuration.colorMode;
为Element资源文件添加注释或特殊标识
Element目录下的不同种类元素的资源均采用JSON文件表示,资源的名称“name”和取值“value”是每一条资源的必备字段。
- 如果需要为某一条资源备注信息,以便于资源的理解和使用,可以通过comment字段添加注释。
- 如果value字段中的部分文本不需要被翻译人员处理,也不会被显示在应用界面上,可以通过特殊结构来标识无需翻译的内容。
通过comment字段添加注释
通过comment字段,可以为JSON文件的资源添加注释。示例如下:
{
"string":[
{
"name":"message_arrive",
"value":"We will arrive at %s",
"comment":"Transfer Arrival Time. %s is time,like 5:00 am"
}
]
}
通过特殊结构来标识无需翻译的内容
在string、strarray、plural这三类资源中,可以通过特殊标识来处理无需被翻译的内容。例如,一个字符串资源的Value取值为“We will arrive at %s”,其中的变量“%s”在翻译过程中希望保持不变。有以下两种方式处理:
- 方式一:在value字段中添加{}。示例如下:
{ "string":[ { "name":"message_arrive", "value":["We will arrive at",{ "id":"time", "example":"5:00 am", "value":"%s" } ] } ] }
- 方式二:添加标记对。示例如下:
{ "string":[ { "name":"message_arrive", "value":"We will arrive at <xliff:g id='time' example='5:00 am'>%s</xliff:g>" } ] }
boolean.json示例
{
"boolean":[
{
"name":"boolean_1",
"value":true
},
{
"name":"boolean_ref",
"value":"$boolean:boolean_1"
}
]
}
color.json示例
{
"color":[
{
"name":"red",
"value":"#ff0000"
},
{
"name":"red_ref",
"value":"$color:red"
}
]
}
float.json示例
{
"float":[
{
"name":"float_1",
"value":"30.6"
},
{
"name":"float_ref",
"value":"$float:float_1"
},
{
"name":"float_px",
"value":"100px"
}
]
}
intarray.json示例
{
"intarray":[
{
"name":"intarray_1",
"value":[
100,
200,
"$integer:integer_1"
]
}
]
}
integer.json示例
{
"integer":[
{
"name":"integer_1",
"value":100
},
{
"name":"integer_ref",
"value":"$integer:integer_1"
}
]
}
pattern.json示例
{
"pattern":[
{
"name":"base",
"value":[
{
"name":"width",
"value":"100vp"
},
{
"name":"height",
"value":"100vp"
},
{
"name":"size",
"value":"25px"
}
]
},
{
"name":"child",
"parent":"base",
"value":[
{
"name":"noTitile",
"value":"Yes"
}
]
}
]
}
plural.json示例
{
"plural":[
{
"name":"eat_apple",
"value":[
{
"quantity":"one",
"value":"%d apple"
},
{
"quantity":"other",
"value":"%d apples"
}
]
}
]
}
strarray.json示例
{
"strarray":[
{
"name":"size",
"value":[
{
"value":"small"
},
{
"value":"$string:hello"
},
{
"value":"large"
},
{
"value":"extra large"
}
]
}
]
}
string.json示例
{
"string":[
{
"name":"hello",
"value":"hello base"
},
{
"name":"app_name",
"value":"my application"
},
{
"name":"app_name_ref",
"value":"$string:app_name"
},
{
"name":"app_sys_ref",
"value":"$ohos:string:request_location_reminder_title"
}
]
}
3. config.json 清单文件 使用 json
{
"app": {
"bundleName": "com.example.myapplication", // 包名
"vendor": "example", // 开发厂商
"version": { // 版本信息相关
"code": 1000000, // 版本号
"name": "1.0.0" // 版本名称
}
"apiVersion": {
"compatible": 4, // 应用运行需要的API最小版本,跟安卓的 minSdkVersion 一样
"target": 4 // 应用运行需要的API目标版本,跟安卓的 targetSdkVersion 一样
}
},
"deviceConfig": {}, // 设备配置信息
"module": {
"package": "com.example.myapplication",
"name": ".MyApplication",
"mainAbility": "com.example.myapplication.MainAbility",
"deviceType": [
"phone"
],
"distro": {
"deliveryWithInstall": true,
"moduleName": "entry",
"moduleType": "entry",
"installationFree": false
},
"abilities": [
{
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"orientation": "unspecified",
"name": "com.example.myapplication.MainAbility",
"icon": "$media:icon",
"description": "$string:mainability_description",
"label": "$string:entry_MainAbility",
"type": "page",
"launchType": "standard"
}
]
}
}