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.rhkb.cn/news/269124.html

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

相关文章

P-States/C-States/S-States/G-States/D-States

P-States是指处理器的性能状态,可以根据需要调整处理器的工作频率和电压来平衡性能和能效。 S-States是指系统的睡眠状态,可以让系统在空闲时进入低功耗状态以节省能量。 G-States是系统的全局状态,通常用于描述整个系统的运行状态。 C-St…

文件上传之图片马

图片马介绍 图片马&#xff1a;就是在正常图片中插入木马。 图片马的制作 1.我们先创建php木马文件1.php&#xff0c;内容有以下两种方式&#xff1a; <?php eval($_POST[a]); ?> /* 常规一句话木马 */ <?php $aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8; $myfile…

使用Pytorch导出自定义ONNX算子

在实际部署模型时有时可能会遇到想用的算子无法导出onnx&#xff0c;但实际部署的框架是支持该算子的。此时可以通过自定义onnx算子的方式导出onnx模型&#xff08;注&#xff1a;自定义onnx算子导出onnx模型后是无法使用onnxruntime推理的&#xff09;。下面给出个具体应用中的…

重构笔记系统:Docker Compose在微服务架构中的应用与优化

虽然我的笔记系统的开发是基于微服务的思想&#xff0c;但是在服务的配置和编排上感觉还是不太合理&#xff0c;具体来说&#xff0c;在开发上的配置和在生产上的配置差别太大。现在规模小&#xff0c;后面规模变大&#xff0c;估计这一块会成为系统生长的瓶颈。 因此&#xff…

推特API(Twitter API)对接说明,用户code To Token换取

前期准备 提前准备、说明&#xff1a;目前对接推特api开发门户分为3个版本&#xff0c;分别是免费的&#xff0c;100美金一个月的基础版以及5000美金一个月的企业版&#xff0c;免费的目前就两个接口可以调用&#xff0c;所以想要对接和使用推特最基本的也需要付100美元一个月…

ETAS工具链ISOLAR-AB重要概念,RTE配置,ECU抽取

RTE配置界面&#xff0c;包含ECU抽取关联 首次配置RTE&#xff0c;出现需要勾选的抽取EXTRACT 创建System System制作SWC到ECU的Mapping System制作System Data 的Mapping

LabVIEW眼结膜微血管采集管理系统

LabVIEW眼结膜微血管采集管理系统 开发一套基于LabVIEW的全自动眼结膜微血管采集管理系统&#xff0c;以提高眼结膜微血管临床研究的效率。系统集成了自动化图像采集、图像质量优化和规范化数据管理等功能&#xff0c;有效缩短了图像采集时间&#xff0c;提高了图像质量&#…

9.WEB渗透测试-Linux基础知识-Linux用户权限管理(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;8.WEB渗透测试-Linux基础知识-Linux基础操作&#xff08;二&#xff09;-CSDN博客 用户管…

Laravel框架: Call to a member function connect() on null 异常报错处理

Laravel框架&#xff1a; Call to a member function connect() on null 异常报错处理 Date: 2024.03.01 21:03:11 author: lijianzhan 原文链接: https://learnku.com/laravel/t/63721 问题&#xff1a; local.ERROR: Call to a member function connect() on null {"…

【办公类-21-08】三级育婴师 多个二级文件夹的docx合并成PDF

背景需求: 前期制作了单题文件夹 【办公类-21-07】新建文件夹 三级育婴师操作参考题目-CSDN博客文章浏览阅读439次&#xff0c;点赞7次&#xff0c;收藏10次。【办公类-21-07】新建文件夹 三级育婴师操作参考题目https://blog.csdn.net/reasonsummer/article/details/1363360…

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中&#xff0c;对于接口API发布URL访问路径&#xff0c;一般都是在类上标识RestController或者Controller注解&#xff0c;然后在方法上标识RequestMapping相关注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一&#xff1a;增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二&#xff1a;镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

鸿蒙实战应用开发:【拨打电话】功能

概述 本示例通过输入电话&#xff0c;进行电话拨打&#xff0c;及电话相关信息的显示。 样例展示 涉及OpenHarmony技术特性 网络通信 基础信息 拨打电话 介绍 本示例使用call相关接口实现了拨打电话并显示电话相关信息的功能 效果预览 使用说明 1.输入电话号码后&#…

「滚雪球学Java」:多线程(章节汇总)

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

STM32F1 - SPI读写Flash

Serial peripheral interface 1> 实验概述2> SPI硬件框图初始化程序 3> STM32的SPI通信时序3.1> 时序图3.2> 文字描述3.3> 注意事项3.4> 流程图表示3.5> 程序表示接收程序&#xff1a;发送程序&#xff1a; 4> SPI的4种模式5> W25Q128存储结构块…

【学习心得】网站运行时间轴(爬虫逆向)

一、网站运行时间轴 掌握网站运行时间轴&#xff0c;有助于我们对“请求参数加密”和“响应数据加密”这两种反爬手段的深入理解。 二、从网站运行的时间轴角度来理解两种反爬手段 1、加载HTML&#xff1a; 这是浏览器访问网站时的第一步&#xff0c;服务器会返回基础…

docker基线安全修复和容器逃逸修复

一、docker安全基线存在的问题和修复建议 1、将容器的根文件系统挂载为只读 修复建议&#xff1a; 添加“ --read-only”标志&#xff0c;以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用&#xff0c;以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…

基于Springboot的助农管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的助农管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

台式电脑电源各线的电压和电流输出和输出电流

台式电脑电源是电脑硬件的重要组成部分。 它为计算机的各个部件提供所需的电压和电流。 不同的硬件设备和组件有不同的电压和电流输出。 下面详细介绍台式电脑电源各线的电压&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它们的输出电流和用途。 3.3V&#…

Java递归生成本地文件目录树形结构

Java递归生成本地文件目录(树行结构) 1.读取txt文件保存的文件目录结构 2.递归生成本地文件目录树形结构&#xff0c;并修改目录文件前缀进行递增 3.结果截图 4.代码 package com.zfi.server.device;import io.swagger.annotations.Api; import org.springframework.web.bind…