鸿蒙系统学习二-应用组成结构

学过 Android的伙伴们学习鸿蒙时会有一些优势,基本结构都差不多,后面在学习的过程中我会用Android的结构和鸿蒙两者相对比,加深印象。

APP基本组成

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:相当于应用的配置文件

APP Pack

它是由一 个或多个 HAP(HarmonyOS Ability Package)以及描述每个 HAP 属性的 pack.info 组 成。HAP 是 Ability 的部署包,一个 HAP 是由代码、资源、第三方库及应用配置文件组成的模块包,可分为 entry 和 feature 两种模块类型。
其中entry为应用的主模块,一个 APP 中,对于同一设备类型必须有且只有一个 entry 类型的 HAP,可独立安装运行。
而feature是应用的动态特性模块。一个 APP 可以包含一个或多个 feature 类型的 HAP,也
可以不含。只有包含 Ability 的 HAP 才能够独立运行。
鸿蒙系统学习二-应用组成结构_第1张图片

Ability

对比于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 信息以及应用所需 权限等信息。

pack.info

Android没有与之对应,它用于描述应用中 HAP 的属性,由 IDE 编译生成,应用市场根据该文件进行拆包和 HAP 的分类存储。HAP 的具体属性包括:
• delivery-with-install: 用于标识该 HAP 是否需要在主动安装时进行安装。
• name:HAP 文件名。
• module-type:模块类型,entry 或 feature。
• device-type:用于标识支持该 HAP 运行的设备类型。

鸿蒙应用基本组成大概就是这些,后面就深入了解一下组成部分。

应用配置文件(config.json)

这个配置存放与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"			//表示快捷方式目标类名。		
            }
        ]
    }
]

HAP与HAR的配置文件的合并

如果应用模块中调用了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文件。
鸿蒙系统学习二-应用组成结构_第2张图片

mergeRule对象的使用

mergeRule通常在HAP的“config.json”文件中使用,可以在“abilities”、“defPermissions”、 “reqPermissions”、“js”等属性中添加。不同属性的合并策略,详见表16。

注意
HAR配置文件中不能包含“action.system.home”“entity.system.home”配置项,否则会导致编译报错。
abilities对象中“name”字段的取值,必须为完整的类名,否则会导致合并出错。



鸿蒙系统学习二-应用组成结构_第3张图片

鸿蒙系统学习二-应用组成结构_第4张图片

mergeRule的使用示例:

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
    }
],

bundleName占位符的使用

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"
                    ],
                }
            ],

以上部分转载于鸿蒙官方文档,如有侵权,请联系我哈

你可能感兴趣的:(鸿蒙系统,ohos,Android,开发语言,华为,harmonyos)