HarmonyOS—HAP唯一性校验逻辑

2024-03-05 01:28

本文主要是介绍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"]}}
}

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

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

领取以下高清学习路线原图请点击→《鸿蒙 (Harmony OS)开发学习手册》纯血鸿蒙HarmonyOS基础技能学习路线图

在这里插入图片描述
 

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

在这里插入图片描述

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

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

在这里插入图片描述

最后

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

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

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

想要获取更多完整鸿蒙最新VIP学习资料,请点击→《鸿蒙全套学习指南》

这篇关于HarmonyOS—HAP唯一性校验逻辑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/774886

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

【HarmonyOS】-TaskPool和Worker的对比实践

ArkTS提供了TaskPool与Worker两种多线程并发方案,下面我们将从其工作原理、使用效果对比两种方案的差异,进而选择适用于ArkTS图片编辑场景的并发方案。 TaskPool与Worker工作原理 TaskPool与Worker两种多线程并发能力均是基于 Actor并发模型实现的。Worker主、子线程通过收发消息进行通信;TaskPool基于Worker做了更多场景化的功能封装,例

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数 一、环境说明二、页面之间相互传参 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、页面之间相互传参 说明: 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页面url找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url访问不同的页面,包括跳转到U

web登录校验

基础登录功能 LoginController @PostMapping("/login")Result login(@RequestBody Emp emp) {log.info("前端,发送了一个登录请求");Emp e = empService.login(emp);return e!=null?Result.success():Result.error("用户" +"名或密码错误");

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候,发现很多博客在onTimer(event: (utc: number, elapsedTime: number) => void) 这里提到elapsedTime:计时器经过的时间,单位为毫秒。我不清楚是否为版本问题。 在我查看version11和version10的api时候,说的都是设置格式的最小单位。 经过个人检验的