HarmonyOS—HAP唯一性校验逻辑

HAP是应用安装的基本单位,在DevEco Studio工程目录中,一个HAP对应一个Module。应用打包时,每个Module生成一个.hap文件。

应用如果包含多个Module,在应用市场上架时,会将多个.hap文件打包成一个.app文件(称为Bundle),但在云端分发和端侧安装时,仍然是以HAP为基本单位。

为了能够正常分发和安装应用,需要保证一个应用安装到设备时,Module的名称、Ability的名称不重复,并且只有一个Entry类型的Module与目标设备相对应。

DevEco Studio会在编译构建时,对HAP进行上述唯一性校验,如果校验不通过,将会编译失败或给出告警。

说明
当前仅在API 8的工程中,针对distrofilter进行打包校验。

Module校验逻辑

校验目的:同一目标设备上Module唯一。

1.校验Module的Name。如果多个Module的Name不同,则校验通过。如果Name相同,继续校验deviceType。

2.校验设备类型deviceType。如果deviceType不相交,则校验通过。如果deviceType相交,继续校验distroFilter。

deviceType不相交是指两个Module的deviceType中配置了完全不同的设备,例如:

//Module1和Module2配置了完全不同的设备,deviceType不相交。
//Module1
{"deviceType": ["TV", "tablet"]
}
//Module2
{"deviceType": ["car", "router"]
}

deviceType相交是指两个Module的deviceType中包含了相同的设备,例如:

//Module1和Module2因为都包含“tablet”设备,导致deviceType相交。
//Module1
{"deviceType": ["TV", "tablet"]
}
//Module2
{"deviceType": ["car", "tablet"]
}

3.校验分发规则distroFilter。如果distroFilter不相交,则校验通过。如果distroFilter相交,则无法保证Module唯一性,校验失败,打包失败。

distroFilter中包含属性apiVersion、screenShape、screenWindow、screenDensity和countryCode。相交的相关含义如下:

  • distroFilter不相交:如果两个distroFilter中任意一个属性不相交,则两个distroFilter不相交。
  • distroFilter相交:如果两个distroFilter中所有属性都相交,则两个distroFilter相交。

例如,两个Module中的apiVersion、screenShape、screenWindow、screenDensity都相交,但countryCode不相交,则可以区分两个Module,校验通过。

//Module1和Module2的两个distroFilter中,countryCode不相交,则两个distroFilter不相交。
//Module1
{"distroFilter": {"apiVersion" : {"policy": "include","value": [8,9]},"screenShape": {"policy": "include","value": ["rect"]},"screenWindow": {"policy": "include","value": ["454*454", "466*466"]},"screenDensity": {"policy": "include","value": ["ldpi", "xldpi"]},"countryCode": {"policy": "include","value": ["CN", "HK"]}}
}
//Module2
{"distroFilter": {"apiVersion" : {"policy": "include","value": [8,9]},"screenShape": {"policy": "include","value": ["rect"]},"screenWindow": {"policy": "include","value": ["454*454", "466*466"]},"screenDensity": {"policy": "include","value": ["ldpi", "xldpi"]},"countryCode": {"policy": "include","value": ["USA", "UK"]}}
}

Ability校验逻辑

校验目的:同一目标设备上Ability唯一。

1.校验Ability的Name。如果多个Ability的Name不同,则校验通过。如果Name相同,继续校验Ability所属Module的deviceType。

2.校验Ability所属Module的deviceType。如果deviceType不相交,校验通过。如果deviceType相交,继续校验Ability所属Module的distroFilter。

例如,两个Ability的Name相同,但其所属Module的deviceType不相交,校验通过。

//Ability1和Ability2虽然名称相同,但由于其所属Module的deviceType不相交,所以可以区分两个Ability,校验通过。
//Ability1
{"module": {"name": "module_sample1","deviceType": ["TV", "tablet"],"abilities": [{"name": "ability_sample"}]}
}
//Ability2
{"module": {"name": "module_sample2","deviceType": ["car", "router"],"abilities": [{"name": "ability_sample"}]}
}

3.校验Ability所属Module的distroFilter。如果distroFilter不相交,校验通过。如果distroFilter相交,校验失败,抛出告警。

例如,两个Ability的Name相同,其所属Module的deviceType也相交,但其所属Module的distroFilter不相交,校验通过。

//Ability1和Ability2的Name相同,而且其所属Module的deviceType相交,但其所属Module的DistroFilter不相交,所以可以区分两个Ability,校验通过。
//Ability1
{"module": {"name": "module_sample","deviceType": ["TV", "tablet"],"metadata": [{"name": "distroFilter_config""resource": "$profile:distroFilter_config_sample1"}],"abilities": [{"name": "ability_sample"}]}
}
//Ability1所属Module的distroFilter
{"distroFilter": {"apiVersion" : {"policy": "include","value": [8,9]},"screenShape": {"policy": "include","value": ["rect"]},"screenWindow": {"policy": "include","value": ["454*454", "466*466"]},"screenDensity": {"policy": "include","value": ["ldpi", "xldpi"]},"countryCode": {"policy": "include","value": ["CN", "HK"]}}
}//Ability2
{"module": {"name": "module_sample2","deviceType":  ["TV", "tablet"],"metadata": [{"name": "distroFilter_config""resource": "$profile:distroFilter_config_sample2"}],"abilities": [{"name": "ability_sample"}]}
}
//Ability2所属Module的distroFilter
{"distroFilter": {"apiVersion" : {"policy": "include","value": [8,9]},"screenShape": {"policy": "include","value": ["rect"]},"screenWindow": {"policy": "include","value": ["454*454", "466*466"]},"screenDensity": {"policy": "include","value": ["ldpi", "xldpi"]},"countryCode": {"policy": "include","value": ["USA", "UK"]}}
}

Entry校验逻辑

校验目的:目标设备只有一个Entry类型的Module与之对应,Feature类型的Module经过deviceType及distroFilter指明的目标设备都需要存在Entry类型的Module。

1.校验Feature类型的Module经过deviceType及distroFilter指明的目标设备都存在Entry类型的Module。

例如,Bundle中存在一个Entry类型Module1,其支持设备为tablet和wearable,其分发规则为circle和rect形状的屏幕,同时存在一个Feature类型的Module2,通过分发规则可知,其可以分发到rect形状的tablet和wearable设备上,而rect形状的tablet和wearable设备上存在Entry类型的Module1,校验通过。

//Entry类型Module1
{"module": {"name": "module_sample1","type": "entry","deviceType": ["tablet", "wearable"],"metadata": [{"name": "distroFilter_config","resource": "$profile:distroFilter_config1"}]}
}
//Module1的distroFilter,distroFilter_config1.json
{"screenShape":{"policy": "include","value": ["circle", "rect"]}
}
//Feature类型Module2
{"module": {"name": "module_sample2","type": "feature","deviceType": ["tablet", "wearable"],"metadata": [{"name": "distroFilter_config","resource": "$profile:distroFilter_config2"}]}
}
//Module2的distroFilter,distroFilter_config2.json
{"screenShape":{"policy": "include","value": ["rect"]}
}

2.校验目标设备只有一个Entry类型的Module与之对应。

a.校验Entry类型Module的deviceType。如果deviceType不相交,校验通过。如果deviceType相交,继续校验Entry类型Module的distroFilter。

例如,同一个Bundle中存在两个Entry类型的Module,分别为Module1和Module2,两者的deviceType不相交,可以有效区分两个Module,校验通过。

//Entry类型Module1
{"module": {"name": "module_sample1","type": "entry","deviceType": ["tablet"]}
}
//Entry类型Module2
{"module": {name: "module_sample2","type": "entry","deviceType": ["wearable"]}
}

b.校验Entry类型Module的distroFilter。如果distroFilter不相交,校验通过。如果distroFilter相交,校验失败,打包失败。

例如,同一个Bundle中存在两个Entry类型的Module,分别为Module1和Module2,两者的deviceType相交,但两者的distroFilter不相交,可以有效区分两个Module,校验通过。

//Entry类型Module1
{"module": {"name": "module_sample1","type": "entry","deviceType": ["wearable"],"metadata": [{"name":"distroFilter_config""resource": "$profile:distroFilter_sample1"}]}
}
//Module1的distroFilter,distroFilter_sample1.json
{"distroFilter": {"screenShape":{"policy": "include","value": ["rect"]}}
}
//Entry类型Module1
{"module": {"name": "module_sample2","type": "entry","deviceType": ["wearable"],"metadata": [{"name":"distroFilter_config""resource": "$profile:distroFilter_sample2"}]}
}
//Module2的distroFilter,distroFilter_sample2.json
{"distroFilter": {"screenShape":{"policy": "include","value": ["circle"]}}
}

那么要想成为一名鸿蒙高级开发,以上知识点是必须要掌握的,除此之外,还需要掌握一些鸿蒙应用开发相关的一些技术,需要我们共同去探索。

为了能够让大家跟上互联网时代的技术迭代,在这里我特邀了几位行业大佬整理出一份最新版的鸿蒙学习提升资料,有需要的小伙伴自行领取,限时开源,先到先得~~~~

领取以下高清学习路线原图请点击→《鸿蒙全套学习指南》纯血鸿蒙HarmonyOS基础技能学习路线图

在这里插入图片描述
 

领取以上完整高清学习路线图,请点击→《鸿蒙基础入门学习指南》小编自己整理的部分学习资料(包含有高清视频、开发文档、电子书籍等)

在这里插入图片描述

以上分享的学习路线都适合哪些人跟着学习?

-应届生/计算机专业
通过学习鸿蒙新兴技术,入行互联网,未来高起点就业。
-0基础转行
提前布局新方向,抓住风口,自我提升,获得更多就业机会。
-技术提升/进阶跳槽
发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术,享受蓝海红利。

在这里插入图片描述

最后

鸿蒙开发学习是一个系统化的过程,从基础知识的学习到实战技能的锤炼,再到对前沿技术的探索,每一环节都至关重要。希望这份教程资料能帮助您快速入门并在鸿蒙开发之路上步步攀升,成就一番事业。让我们一起乘风破浪,拥抱鸿蒙生态的广阔未来!

如果你觉得这篇内容对你有帮助,我想麻烦大家动动小手给我:点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

关注我,同时可以期待后续文章ing,不定期分享原创知识。

想要获取更多完整鸿蒙最新VIP学习资料,请点击→《鸿蒙 (Harmony OS)开发学习手册》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 提取分割位于多边形区域边缘内部或边缘上的点

[in,on] = inpolygon(xq,yq,xv,yv) xv 和 yv 为定义的多边形区域的,如xv = [1 4 4 1 1 ];yv = [1 1 4 4 1 ];注意最后一个数字与第一个重复,保证多边形闭合; xq 和 yq 为待查询的点in:在多边形内部和边缘的点序号on:仅在多边形边缘的点序号 提取分割方法: matrix=[xq yq…

ios端接口代码语言-身份证号实名认证ios端接口

身份证核验,其背后必须要有权威,真实的身份证信息数据库作为基础,如中安未来翔云OCR云平台(www.netocr.com)近期上线的身份证核验功能,就是与权威机构合作,拥有权威,真实的身份证信息…

大数据技术学习笔记(五)—— MapReduce(1)

目录 1 MapReduce 概述1.1 MapReduce 定义1.2 MapReduce 优缺点1.3 MapReduce 核心思想1.4 MapReduce 进程1.5 Hadoop 序列化类型1.6 MapReduce 编程规范1.7 WordCount 案例实操1.7.1 案例需求1.7.2 环境准备1.7.3 编写程序1.7.4 测试 2 MapReduce 序列化2.1 序列化概述2.2 自定…

JavaScript中数组相关

JavaScript中有很多用于操作数组的内置函数。以下是一些常用的数组函数: 1. Array.prototype.push(): 向数组末尾添加一个或多个元素,并返回新数组的长度。 2. Array.prototype.pop(): 删除并返回数组的最后一个元素。 3. Array.prototype.unshift(): 向…

浅析volatile关键字

浅析volatile关键字 文章目录 浅析volatile关键字1. volatile关键字的意义2.volatile应用3. volatile常见问题总结 1. volatile关键字的意义 ​ 被 volatile 修饰的变量,在对其进行读写操作时,会引发一些可观测的副作用。而这些可观测的副作用&#xff…

sql单表运用11.3

一、进入数据库操作界面 1、mysql -u root -p 敲回车 ,输入密码 ,进入数据库操作界面 2、show databases 查看所有的数据(如果没有数据库:创建数据库 create database 库名称) 3、use 数据库名 使…

探索Terraform实践:优化基础设施管理

Terraform 是管理基础设施及代码(IaC)最常用的工具之一,它能使我们安全且可预测地对基础设施应用更改。 Terraform作为一个强大的基础设施即代码工具,为开发人员和运维团队提供了一种简单而强大的方式来定义、部署和管理基础设施。…

软件工程顶会——ICSE '24 论文清单、摘要

1、A Comprehensive Study of Learning-based Android Malware Detectors under Challenging Environments 近年来,学习型Android恶意软件检测器不断增多。这些检测器可以分为三种类型:基于字符串、基于图像和基于图形。它们大多在理想情况下取得了良好的…

Go-gin-example 第四部分 重启服务

文章目录 知识点本节目标何谓优雅 ctrlc信号 修改流程实现优雅重启endless安装 编写验证编译执行唤醒问题 续接 上一节 知识点 信号量的了解应用热更新 本节目标 在前文中,我们在配置玩之后直接使用 ctrlc 来进行进程的结束,我们将了解 ctrlc 的过程…

HarmonyOS | 状态管理(九) | Environment (设备环境查询)

系列文章目录 1.HarmonyOS | 状态管理(一) | State装饰器 2.HarmonyOS | 状态管理(二) | Prop装饰器 3.HarmonyOS | 状态管理(三) | Link装饰器 4.HarmonyOS | 状态管理(四) | Provide和Consume装饰器 5.HarmonyOS | 状态管理(五) | Observed装饰器和ObjectLink装饰器 6.Harmo…

为啥要用C艹不用C?

在很多时候,有人会有这样的疑问 ——为什么要用C?C相对于C优势是什么? 最近两年一直在做Linux应用,能明显的感受到C带来到帮助以及快感 之前,我在文章里面提到环形队列 C语言,环形队列 环形队列到底是怎么回…

NLP_文本数据分析_3(代码示例)

目标 了解文本数据分析的作用.掌握常用的几种文本数据分析方法. 1 文件数据分析介绍 文本数据分析的作用: 文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择. 常用的几种文本数据分析方法: 标签数量分布句…

阿里云的ssh的22端口,修改为2422端口,作为默认的ssh端口

要将阿里云(或任何Linux服务器)的SSH端口从默认的22端口更改为2422端口,你可以按照以下步骤操作: 编辑SSH配置文件: 打开SSH服务的配置文件/etc/ssh/sshd_config。你可以使用nano、vi或任何文本编辑器来编辑这个文件。…

Vue3_2024_4天【computer、watch、method在Vue2~3中的说明】未完待补

第一:从概念上介绍~~vue中计算属性、方法、监听器(以Vue2描述) 1.计算属性 (Computed Properties): 1.概念: 计算属性是基于响应式依赖进行缓存的属性,只有在相关依赖发生改变时才会重新求值。它们类似于具有缓存的函…

场景问题: VisualVM工具Profiler JDBC不是真实执行的SQL

1. 问题 诡异的问题表象: 前端反馈分页接口的Total字段一直为0 使用Visualvm中的 Profiler 注入到应用后,查看JDBC监控得到了分页接口执行的SQL,复制出来执行是55. 此时还没有注意到 IN 的范围中有一个特别的值 NULL 🤨 2. 排查…

视觉Transformers中的位置嵌入 - 研究与应用指南

视觉 Transformer 中位置嵌入背后的数学和代码简介。 自从 2017 年推出《Attention is All You Need》以来,Transformer 已成为自然语言处理 (NLP) 领域最先进的技术。 2021 年,An Image is Worth 16x16 Words 成功地将 Transformer 应用于计算机视觉任务…

Windows C++:控制新进程的创建方式

目录 介绍 标志位介绍 代码示例 这些宏定义(dwCreationFlag值)是用于Windows操作系统中CreateProcess函数的标志,它们控制新进程的创建方式。下面是这些标志的中文介绍: 介绍 Winbase.h中的部分代码: // // Proc…

idea中引入新JDK环境

在不同的项目中往往会需要不同的运行环境,那么如何下载一个新的环境并运用到idea中呢? 下面给出的就是oracle官网,以JDK17为例教大家如何下载 Java Archive Downloads - GraalVM for JDK 17https://www.oracle.com/java/technologies/javase…

Python数据可视化库之bashplotlib使用详解

概要 在数据可视化领域,Python拥有许多优秀的库,如Matplotlib、Seaborn等,它们可以创建漂亮而复杂的图形。但是,有时候我们可能需要在终端中绘制简单的图形,这时候Bashplotlib就派上了用场。Bashplotlib是一个Python库,可以在终端中绘制基本的图形,如条形图、散点图等。…

YOLOV9训练集制作+Train+Val记录

一、YOLO数据集格式分布 在YOLO中,数据集的分布如图,在dataset文件夹下有imags(图片)和labels(标签)。在images和labels文件夹下又分别存放三个文件夹,分别对应测试集、训练集、验证集&#xff…