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

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

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

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

Module校验逻辑

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

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

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

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"]
}
  1. 校验分发规则distributionFilter。如果distributionFilter不相交,则校验通过。如果distributionFilter相交,则无法保证Module唯一性,校验失败,打包失败。

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

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

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

//Module1和Module2的两个distributionFilter中,countryCode不相交,则两个distributionFilter不相交。
//Module1
{
  "distributionFilter": {
    "apiVersion" : {
      "policy": "include",
      "value": [10,11]
    },
    "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
{
  "distributionFilter": {
    "apiVersion" : {
      "policy": "include",
      "value": [10,11]
    },
    "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的distributionFilter。

例如,两个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"
    }
        ]
    }
}
  1. 校验Ability所属Module的distributionFilter。如果distributionFilter不相交,校验通过。如果distributionFilter相交,校验失败,抛出告警。

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

//Ability1和Ability2的Name相同,而且其所属Module的deviceType相交,但其所属Module的distributionFilter不相交,所以可以区分两个Ability,校验通过。
//Ability1
{
    "module": {
        "name": "module_sample",
        "deviceType": ["tv", "tablet"],
        "metadata": [
            {
                "name": "distributionFilter_config"
                "resource": "$profile:distributionFilter_config_sample1"
            }
        ],
        "abilities": [
            {
                "name": "ability_sample"
            }
        ]
    }
}
//Ability1所属Module的distributionFilter
{
  "distributionFilter": {
    "apiVersion" : {
      "policy": "include",
      "value": [10,11]
    },
    "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": "distributionFilter_config"
                "resource": "$profile:distributionFilter_config_sample2"
            }
        ],
        "abilities": [
            {
                "name": "ability_sample"
            }
        ]
    }
}
//Ability2所属Module的distributionFilter
{
  "distributionFilter": {
    "apiVersion" : {
      "policy": "include",
      "value": [10,11]
    },
    "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及distributionFilter指明的目标设备都需要存在Entry类型的Module。

  1. 校验Feature类型的Module经过deviceType及distributionFilter指明的目标设备都存在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": "distributionFilter_config",
                "resource": "$profile:distributionFilter_config1"
            }
        ]
    }
}
//Module1的distributionFilter,distributionFilter_config1.json
{
    "screenShape":{
        "policy": "include",
        "value": ["circle", "rect"]
    }
}
//Feature类型Module2
{
     "module": {
        "name": "module_sample2",
        "type": "feature",
        "deviceType": ["tablet", "wearable"],
         "metadata": [
            {
                "name": "distributionFilter_config",
                "resource": "$profile:distributionFilter_config2"
            }
        ]
    }
}
//Module2的distributionFilter,distributionFilter_config2.json
{
    "screenShape":{
        "policy": "include",
        "value": ["rect"]
    }
}
  1. 校验目标设备只有一个Entry类型的Module与之对应。

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

      例如,同一个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"]
    }
}
  1. 校验Entry类型Module的distributionFilter。如果distributionFilter不相交,校验通过。如果distributionFilter相交,校验失败,打包失败。

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

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

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐