• 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中配置了完全不同的设备,例如:

    1. //Module1和Module2配置了完全不同的设备,deviceType不相交。
    2. //Module1
    3. {
    4. "deviceType": ["TV", "tablet"]
    5. }
    6. //Module2
    7. {
    8. "deviceType": ["car", "router"]
    9. }

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

    1. //Module1和Module2因为都包含“tablet”设备,导致deviceType相交。
    2. //Module1
    3. {
    4. "deviceType": ["TV", "tablet"]
    5. }
    6. //Module2
    7. {
    8. "deviceType": ["car", "tablet"]
    9. }

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

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

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

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

    1. //Module1和Module2的两个distroFilter中,countryCode不相交,则两个distroFilter不相交。
    2. //Module1
    3. {
    4. "distroFilter": {
    5. "apiVersion" : {
    6. "policy": "include",
    7. "value": [8,9]
    8. },
    9. "screenShape": {
    10. "policy": "include",
    11. "value": ["rect"]
    12. },
    13. "screenWindow": {
    14. "policy": "include",
    15. "value": ["454*454", "466*466"]
    16. },
    17. "screenDensity": {
    18. "policy": "include",
    19. "value": ["ldpi", "xldpi"]
    20. },
    21. "countryCode": {
    22. "policy": "include",
    23. "value": ["CN", "HK"]
    24. }
    25. }
    26. }
    27. //Module2
    28. {
    29. "distroFilter": {
    30. "apiVersion" : {
    31. "policy": "include",
    32. "value": [8,9]
    33. },
    34. "screenShape": {
    35. "policy": "include",
    36. "value": ["rect"]
    37. },
    38. "screenWindow": {
    39. "policy": "include",
    40. "value": ["454*454", "466*466"]
    41. },
    42. "screenDensity": {
    43. "policy": "include",
    44. "value": ["ldpi", "xldpi"]
    45. },
    46. "countryCode": {
    47. "policy": "include",
    48. "value": ["USA", "UK"]
    49. }
    50. }
    51. }

    Ability校验逻辑

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

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

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

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

    1. //Ability1和Ability2虽然名称相同,但由于其所属Module的deviceType不相交,所以可以区分两个Ability,校验通过。
    2. //Ability1
    3. {
    4. "module": {
    5. "name": "module_sample1",
    6. "deviceType": ["TV", "tablet"],
    7. "abilities": [
    8. {
    9. "name": "ability_sample"
    10. }
    11. ]
    12. }
    13. }
    14. //Ability2
    15. {
    16. "module": {
    17. "name": "module_sample2",
    18. "deviceType": ["car", "router"],
    19. "abilities": [
    20. {
    21. "name": "ability_sample"
    22. }
    23. ]
    24. }
    25. }

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

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

    1. //Ability1和Ability2的Name相同,而且其所属Module的deviceType相交,但其所属Module的DistroFilter不相交,所以可以区分两个Ability,校验通过。
    2. //Ability1
    3. {
    4. "module": {
    5. "name": "module_sample",
    6. "deviceType": ["TV", "tablet"],
    7. "metadata": [
    8. {
    9. "name": "distroFilter_config"
    10. "resource": "$profile:distroFilter_config_sample1"
    11. }
    12. ],
    13. "abilities": [
    14. {
    15. "name": "ability_sample"
    16. }
    17. ]
    18. }
    19. }
    20. //Ability1所属Module的distroFilter
    21. {
    22. "distroFilter": {
    23. "apiVersion" : {
    24. "policy": "include",
    25. "value": [8,9]
    26. },
    27. "screenShape": {
    28. "policy": "include",
    29. "value": ["rect"]
    30. },
    31. "screenWindow": {
    32. "policy": "include",
    33. "value": ["454*454", "466*466"]
    34. },
    35. "screenDensity": {
    36. "policy": "include",
    37. "value": ["ldpi", "xldpi"]
    38. },
    39. "countryCode": {
    40. "policy": "include",
    41. "value": ["CN", "HK"]
    42. }
    43. }
    44. }
    45. //Ability2
    46. {
    47. "module": {
    48. "name": "module_sample2",
    49. "deviceType": ["TV", "tablet"],
    50. "metadata": [
    51. {
    52. "name": "distroFilter_config"
    53. "resource": "$profile:distroFilter_config_sample2"
    54. }
    55. ],
    56. "abilities": [
    57. {
    58. "name": "ability_sample"
    59. }
    60. ]
    61. }
    62. }
    63. //Ability2所属Module的distroFilter
    64. {
    65. "distroFilter": {
    66. "apiVersion" : {
    67. "policy": "include",
    68. "value": [8,9]
    69. },
    70. "screenShape": {
    71. "policy": "include",
    72. "value": ["rect"]
    73. },
    74. "screenWindow": {
    75. "policy": "include",
    76. "value": ["454*454", "466*466"]
    77. },
    78. "screenDensity": {
    79. "policy": "include",
    80. "value": ["ldpi", "xldpi"]
    81. },
    82. "countryCode": {
    83. "policy": "include",
    84. "value": ["USA", "UK"]
    85. }
    86. }
    87. }

    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,校验通过。

    1. //Entry类型Module1
    2. {
    3. "module": {
    4. "name": "module_sample1",
    5. "type": "entry",
    6. "deviceType": ["tablet", "wearable"],
    7. "metadata": [
    8. {
    9. "name": "distroFilter_config",
    10. "resource": "$profile:distroFilter_config1"
    11. }
    12. ]
    13. }
    14. }
    15. //Module1的distroFilter,distroFilter_config1.json
    16. {
    17. "screenShape":{
    18. "policy": "include",
    19. "value": ["circle", "rect"]
    20. }
    21. }
    22. //Feature类型Module2
    23. {
    24. "module": {
    25. "name": "module_sample2",
    26. "type": "feature",
    27. "deviceType": ["tablet", "wearable"],
    28. "metadata": [
    29. {
    30. "name": "distroFilter_config",
    31. "resource": "$profile:distroFilter_config2"
    32. }
    33. ]
    34. }
    35. }
    36. //Module2的distroFilter,distroFilter_config2.json
    37. {
    38. "screenShape":{
    39. "policy": "include",
    40. "value": ["rect"]
    41. }
    42. }

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

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

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

    1. //Entry类型Module1
    2. {
    3. "module": {
    4. "name": "module_sample1",
    5. "type": "entry",
    6. "deviceType": ["tablet"]
    7. }
    8. }
    9. //Entry类型Module2
    10. {
    11. "module": {
    12. name: "module_sample2",
    13. "type": "entry",
    14. "deviceType": ["wearable"]
    15. }
    16. }

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

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

    1. //Entry类型Module1
    2. {
    3. "module": {
    4. "name": "module_sample1",
    5. "type": "entry",
    6. "deviceType": ["wearable"],
    7. "metadata": [
    8. {
    9. "name":"distroFilter_config"
    10. "resource": "$profile:distroFilter_sample1"
    11. }
    12. ]
    13. }
    14. }
    15. //Module1的distroFilter,distroFilter_sample1.json
    16. {
    17. "distroFilter": {
    18. "screenShape":{
    19. "policy": "include",
    20. "value": ["rect"]
    21. }
    22. }
    23. }
    24. //Entry类型Module1
    25. {
    26. "module": {
    27. "name": "module_sample2",
    28. "type": "entry",
    29. "deviceType": ["wearable"],
    30. "metadata": [
    31. {
    32. "name":"distroFilter_config"
    33. "resource": "$profile:distroFilter_sample2"
    34. }
    35. ]
    36. }
    37. }
    38. //Module2的distroFilter,distroFilter_sample2.json
    39. {
    40. "distroFilter": {
    41. "screenShape":{
    42. "policy": "include",
    43. "value": ["circle"]
    44. }
    45. }
    46. }

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

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

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

    在这里插入图片描述
     

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

    在这里插入图片描述

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

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

    在这里插入图片描述

    最后

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

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

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

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

  • 相关阅读:
    JavaEE初阶:多线程(初阶)
    Anaconda中利用conda创建、激活、删除、添加新环境
    Python自学教程1-安装pycharm和执行环境
    博客摘录「 Python面试宝典」2024年2月20日
    【计算机毕业设计】331基于微信小程序的家庭财务管理系统
    Ubuntu22.04 FTP 搭建以及挂载
    从零开始学习 Java:简单易懂的入门指南之HashMap及TreeMap源码解读(二十四)
    【vue】在vue项目中按顺序动态24个英文字母选项:A B C D E F......
    spirngboot项目 使用AOP限流用户单位时间请求接口次数
    shiro-登录验证
  • 原文地址:https://blog.csdn.net/2401_82546228/article/details/136462676