学过 Android的伙伴们学习鸿蒙时会有一些优势,基本结构都差不多,后面在学习的过程中我会用Android的结构和鸿蒙两者相对比,加深印象。
HarmonyOS由APP Pack、Ability、库文件、资源文件、配置文件、pack.info几个组成。
对比于Android应用组成:
src文件:项目源文件存放
R.java文件:eclipse自动生成,无需修改
Android Library:为应用运行的Android库
assets目录:主要放置多媒体文件
res目录:放置应用会用到的资源文件
drawable目录:放置应用程序会用到的图片 layout目录:放置用到的布局文件(XML格式)
value目录:主要放置字符串,颜色,数组(strings.xml; colors.xml; arrays.xml)
Androidmanifest.xml:相当于应用的配置文件
它是由一 个或多个 HAP(HarmonyOS Ability Package)以及描述每个 HAP 属性的 pack.info 组 成。HAP 是 Ability 的部署包,一个 HAP 是由代码、资源、第三方库及应用配置文件组成的模块包,可分为 entry 和 feature 两种模块类型。
其中entry为应用的主模块,一个 APP 中,对于同一设备类型必须有且只有一个 entry 类型的 HAP,可独立安装运行。
而feature是应用的动态特性模块。一个 APP 可以包含一个或多个 feature 类型的 HAP,也
可以不含。只有包含 Ability 的 HAP 才能够独立运行。
对比于Android,相当于activity和service。分为FA(Feature Ability)和 PA(Particle Ability)。FA/PA 是应用的基本组成 单元,能够实现特定的业务功能。FA 有 UI 界面,而 PA 无 UI 界面。
与Android定义基本一致,都是应用依赖的第三方代码形式,是.so 文件,Android还有jar格式,都存放在 libs 目录。
Android的配置文件是Androidmanifest.xml,而鸿蒙的配置文件是config.json,Android是配置四大组件信息以及权限,鸿蒙相对应是配置应用的 Ability 信息以及应用所需 权限等信息。
Android没有与之对应,它用于描述应用中 HAP 的属性,由 IDE 编译生成,应用市场根据该文件进行拆包和 HAP 的分类存储。HAP 的具体属性包括:
• delivery-with-install: 用于标识该 HAP 是否需要在主动安装时进行安装。
• name:HAP 文件名。
• module-type:模块类型,entry 或 feature。
• device-type:用于标识支持该 HAP 运行的设备类型。
鸿蒙应用基本组成大概就是这些,后面就深入了解一下组成部分。
这个配置存放与HAP 的根目录,“config.json”由“app”、“deviceConfig”和“module”三个部分组成,缺一不可。
app:表示应用的全局配置信息。同一个应用的不同HAP包的“app”配置必须保持一致。
"app": {
"bundleName": "com.aos.learning", //应用包名PackageName,必需
"vendor": "aos", //对应用开发厂商的描述,可不填
"version": { //版本。必填
"code": 1, //版本号
"name": "1.0" //版本名,API 5及更早版本:推荐使用三段式,格式为A.B.C(也兼容A.B),其中A、B、C取值为0~999范围内的整数,API 6版本起:推荐采用四段式数字版本号,如A.B.C.D,其中A、B、C取值为0~99范围内的整数,D取值为0~999范围内的整数。
},
"apiVersion": { //表示应用依赖的HarmonyOS的API版本。必填
"compatible": 3, //最小版本,必填
"target": 3 //API目标版本,可缺省,缺省值为应用所在设备的当前API版本。
"releaseType": "Beta1" //表示应用运行需要的API目标版本的类型。取值为“CanaryN”、“BetaN”或者“Release”,其中,N代表大于零的整数。Canary:受限发布的版本。Beta:公开发布的Beta版本。Release:公开发布的正式版本。可缺省,缺省值为“Release”。
}
}
deviceConfig:表示应用在具体设备上的配置信息,可以包含default、phone、tablet、tv、car、wearable、liteWearable和smartVision等属性。default标签内的配置是适用于所有设备通用
"deviceConfig": { //应用在不同设备上面的配置。
"default": { //目前看是有default、phone、tablet、tv、car、wearable、liteWearable和smartVision,default标签内的配置是适用于所有设备通用
"process": "com.huawei.hiworld.example", //应用或者Ability的进程名。如果在“deviceConfig”标签下配置了“process”标签,则该应用的所有Ability都运行在这个进程中。 如果在“abilities”标签下也为某个Ability配置了“process”标签,则该Ability就运行在这个进程中。
"jointUserId":"dsdfa" //表示应用的共享userid。多个应用之间需要共享资源,则可以通过相同的jointUserId值实现,适用于手机、平板、智慧屏、车机、智能穿戴。
"supportBackup": false, //表示应用是否支持备份和恢复。如果配置为“false”,则不支持为该应用执行备份或恢复操作。
"compressNativeLibs":true, //表示libs库是否以压缩存储的方式打包到HAP包。“false”,则libs库以不压缩的方式存储,HAP包在安装时无需解压libs,运行时会直接从HAP内加载libs库。
"network": { //表示网络安全性配置。该标签允许应用通过配置文件的安全声明来自定义其网络安全,无需修改应用代码。
"cleartextTraffic": true, //表示是否允许应用使用明文网络流量
"securityConfig": { //表示应用的网络安全配置信息。
"domainSettings": { //表示自定义的网域范围的安全配置,支持多层嵌套,即一个domainSettings对象中允许嵌套更小网域范围的domainSettings对象。
"cleartextPermitted": true, //表示自定义的网域范围内是否允许明文流量传输。当cleartextTraffic和securityConfig同时存在时,自定义网域是否允许明文流量传输以cleartextPermitted的取值为准。
"domains": [ //表示域名配置信息
{
"subdomains": true, //表示是否包含子域名
"name": "example.ohos.com" //表示域名名称
}
]
}
}
}
}
}
module:表示HAP包的配置信息。该标签下的配置只对当前HAP包生效。
"module": {
"mainAbility": "MainAbility", //表示HAP包的入口ability名称
"package": "com.example.myapplication.entry", //表示HAP的包结构名称,在应用内应保证唯一性
"name": ".MyOHOSAbilityPackage", //表示HAP的类名。
"description": "$string:description_application", //表示HAP的描述信息。
"supportedModes": [ //表示应用支持的运行模式。当前只定义了驾驶模式(drive)。
"drive"
],
"metaData": { //表示HAP的元信息。
"parameters" : [{ //表示调用Ability时所有调用参数的元信息。每个调用参数的元信息由以下三个标签组成:description、name、type。
"name" : "string", //表示调用参数的名称。
"type" : "Float", //表示调用参数的类型,如Integer。
"description" : "$string:parameters_description" //表示对调用参数的描述,
}],
"results" : [{ //表示Ability返回值的元信息。每个返回值的元信息由以下三个标签组成:description、name、type。
"name" : "string", //表示返回值的名字。
"type" : "Float", //表示返回值的类型,如Integer。
"description" : "$string:results_description" //表示对返回值的描述
}],
"customizeData" : [{ //表示父级组件的自定义元信息,parameters和results在module中不可配。
"name" : "string", //表示数据项的键名称
"value" : "string", //表示数据项的值
"extra" : "$string:customizeData_description" //表示用户自定义数据格式
}]
}
"deviceType": [ //表示允许Ability运行的设备类型。目前有phone(手机)、tablet(平板)、tv(智慧屏)、car(车机)、wearable(智能穿戴)、liteWearable(轻量级智能穿戴)
"car"
],
"distro": { //表示HAP发布的具体描述。
"deliveryWithInstall": true, //表示当前HAP是否支持随应用安装。建议为true,设置false可能导致最终应用上架应用市场异常。
"moduleName": "ohos_entry", //表示当前HAP的名称。
"moduleType": "entry", //表示当前HAP的类型,包括两种类型:entry和feature。
"installationFree":true //表示当前该FA是否支持免安装特性。entry.hap可缺省,feature.hap不可缺省。
},
"abilities": [ //表示当前模块内的所有Ability。采用对象数组格式,其中每个元素表示一个Ability对象。
...
],
"shortcuts": [ //表示应用的快捷方式信息。
...
],
"js": [ //表示基于JS UI框架开发的JS模块集合,其中的每个元素代表一个JS模块的信息。
...
],
"reqPermissions": [ //表示应用运行时向系统申请的权限。
...
],
"defPermissions": [ //表示应用定义的权限。应用调用者必须申请这些权限,才能正常调用该应用。
...
],
"colorMode": "light", //表示应用自身的颜色模式。dark:表示按照深色模式选取资源。light:表示按照浅色模式选取资源。auto:表示跟随系统的颜色模式值选取资源。
"resizeable":"true" //表示应用是否支持多窗口特性。
}
abilities内部结构说明:
"abilities": [
{
"name": ".MainAbility", //表示Ability名称。取值可采用反向域名方式表示,由包名和类名组成
"description": "himusic main ability", //表示对Ability的描述
"icon": "$media:ic_launcher", //表示Ability图标资源文件的索引
"label": "HiMusic", //表示Ability对用户显示的名称。
"uri":"...", //表示Ability的统一资源标识符。格式为[scheme:][//authority][path][?query][#fragment]。
"launchType": "standard", //表示Ability的启动模式,支持“standard”、“singleMission”和“singleton”三种模式:standard:表示该Ability可以有多实例。“standard”模式适用于大多数应用场景。singleMission:表示此Ability在每个任务栈中只能有一个实例。singleton:表示该Ability在所有任务栈中仅可以有一个实例。例如,具有全局唯一性的呼叫来电界面即采用“singleton”模式。
"orientation": "unspecified", //表示该Ability的显示模式。该标签仅适用于page类型的Ability。取值范围如下:unspecified:由系统自动判断显示方向。landscape:横屏模式。portrait:竖屏模式。followRecent:跟随栈中最近的应用。
"permissions": [ //表示其他应用的Ability调用此Ability时需要申请的权限
],
"visible": true, //表示Ability是否可以被其他应用调用。
"skills": [ //表示Ability能够接收的Intent的特征。
{
"actions": [
"action.system.home"
],
"entities": [
"entity.system.home"
]
}
],
"configChanges": [ //表示Ability关注的系统配置集合。当已关注的配置发生变更后,Ability会收到onConfigurationUpdated回调。取值范围:locale:表示语言区域发生变更。layout:表示屏幕布局发生变更。fontSize:表示字号发生变更。orientation:表示屏幕方向发生变更。density:表示显示密度发生变更。
"locale",
"layout",
"fontSize",
"orientation"
],
"type": "page" //表示Ability的类型。取值范围如下:page:表示基于Page模板开发的FA,用于提供与用户交互的能力。service:表示基于Service模板开发的PA,用于提供后台运行任务的能力。data:表示基于Data模板开发的PA,用于对外部提供统一的数据访问抽象。CA:表示支持其他应用以窗口方式调起该Ability。
},
]
skills 对象的内部结构说明:
"skills": [
{
"actions": [ //表示能够接收的 Intent 的 action 值,可以包含一个或多个 action。
"action.system.home"
],
"entities": [ //表示能够接收的 Intent 的 Ability 的类别(如视频、桌面 应用等),可以包含一个或多个 entity。 取值通常为系统预定义的类别
"entity.system.home"
],
"uris": [ //表示能够接收的 Intent 的 uri,可以包含一个或者多个 uri。
{
"scheme": "http",
"host": "www.xxx.com",
"port": "8080",
"path": "query/student/name",
"type": "text/*"
}
]
}
]
form 对象的内部结构说明
"form": {
"formEntity": [ //表示 AbilityForm 支持的显示方式。
"homeScreen", //以桌面图标显示
"searchbox" //在全局搜索显示
],
"minHeight": 100, //表示 AbilityForm 缩放时能达到的最小高度
"maxHeight": 200,
"minWidth": 100, //表示 AbilityForm 缩放时能达到的最小宽度
"maxWidth": 200
}
js 对象的内部结构说明
"js": [
{
"name": "default", //表示 JS Module 的名字。该标签不可缺省,默认 值为 default。
"pages": [ //表示 JS Module 的页面用于列举 JS Module 中 每个页面的路由信息[页面路径+页面名称]。该标 签不可缺省,取值为数组,数组第一个元素代表 JS FA 首页。
"pages/index/index",
"pages/detail/detail"
],
"window": { //用于定义与显示窗口相关的配置。该标签仅适用于智慧屏、智能穿戴、车机
"designWidth": 750, //表示页面设计基准宽度。
"autoDesignWidth": false //表示页面设计基准宽度是否自动计算。当配置为 true 时,designWidth 将会被忽略,设计基准宽 度由设备宽度与屏幕密度计算得出。
},
"type": "form" //表示JS应用的类型。取值范围如下:
normal:标识该JS Component为应用实例。
form:标识该JS Component为卡片实例。
}
]
shortcuts 对象的内部结构说明
"shortcuts": [
{
"shortcutId": "id", //表示快捷方式的ID。字符串的最大长度为63字节。
"label": "$string:shortcut", //表示快捷方式的标签信息,即快捷方式对外显示的文字描述信息。取值可以是描述性内容,也可以是标识label的资源索引。字符串最大长度为63字节。
"intents": [ //表示快捷方式内定义的目标intent信息集合,每个intent可配置两个子标签,targetClass, targetBundle。
{
"targetBundle": "com.huawei.hiworld.himusic", //表示快捷方式目标Ability所在应用的包名。
"targetClass": "com.huawei.hiworld.himusic.entry.MainAbility" //表示快捷方式目标类名。
}
]
}
]
如果应用模块中调用了HAR,在编译构建HAP时,需要将HAP的“config.json”文件与一个或多个HAR的“config.json”文件,合并为一个“config.json”文件。在合并过程中,不同文件的同一个标签的取值可能发生冲突,此时,需要通过配置mergeRule来解决冲突。
HAP与HAR的“config.json”文件合并时,需要将HAR的配置信息全部合并到HAP的配置文件。合并规则参见表15。
HAP的优先级总是高于HAR。当HAP依赖于多个HAR时,先加载的HAR的优先级高于后加载的HAR,按照HAR的加载顺序依次合并到HAP文件。
mergeRule通常在HAP的“config.json”文件中使用,可以在“abilities”、“defPermissions”、 “reqPermissions”、“js”等属性中添加。不同属性的合并策略,详见表16。
注意
HAR配置文件中不能包含“action.system.home”“entity.system.home”配置项,否则会导致编译报错。
abilities对象中“name”字段的取值,必须为完整的类名,否则会导致合并出错。
HAP与HAR中的Ability的“name”取值相同,需要对两者“config.json”文件中的Ability进行合并。由于两个文件中的部分字段(例如“launchType”)存在冲突,需要在HAP的“abilities”标签下添加“mergeRule”。
合并前HAP的“config.json”文件,如下所示:
其中,remove表示合并后需要移除的子标签,replace表示合并后需要替换的子标签(HAP替换HAR)。
合并前HAP的“config.json”文件,如下所示:
其中,remove表示合并后需要移除的子标签,replace表示合并后需要替换的子标签(HAP替换HAR)。
"abilities": [
{
"mergeRule": {
"remove": ["orientation"],
"replace": ["launchType"]
}
"name": "com.harmony.myapplication.entry.MainAbility",
"type": "page",
"launchType": "standard",
"visible": false
}
],
合并前HAR的“config.json”文件,如下所示:
"abilities": [
{
"name": "com.harmony.myapplication.entry.MainAbility",
"type": "page",
"launchType": "singleton",
"orientation": "portrait",
"visible": false
}
],
将上述两个“config.json”文件按照mergeRule进行合并,处理完成后mergeRule字段也会被移除。合并后的结果文件,如下所示:
"abilities": [
{
"name": "com.harmony.myapplication.entry.MainAbility",
"type": "page",
"launchType": "standard",
"visible": false
}
],
HAR的“config.json”文件中多处需要使用包名,例如自定义权限、自定义action等场景,但是包名只有当HAR编译到HAP时才能确定下来。在编译之前,HAR中的包名可以采用占位符来表示,采用{bundleName}形式。
支持bundleName占位符的标签有actions、entities、permissions、readPermission、writePermission、defPermissions.name、uri。
HAR中自定义action时,使用{bundleName}来代替包名。如下所示:
"skills": [
{
"actions": [
"{bundleName}.ACTION_PLAY"
],
"entities": [
"{bundleName}.ENTITY_PLAY"
],
}
],
将HAR编译到bundleName为“com.huawei.hiworld”的HAP包后,原来的{bundleName}将被替换为HAP的实际包名。替换后的结果如下所示:
"app": {
"bundleName": "com.huawei.hiworld",
……
},
"module": {
"abilities": [
{
"skills": [
{
"actions": [
"com.huawei.hiworld.ACTION_PLAY"
],
"entities": [
"com.huawei.hiworld.ENTITY_PLAY"
],
}
],
以上部分转载于鸿蒙官方文档,如有侵权,请联系我哈