关于harmonyos:HarmonyOSHAP唯一性校验逻辑

9次阅读

共计 6597 个字符,预计需要花费 17 分钟才能阅读完成。

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)开发学习手册》

正文完
 0