纯血鸿蒙APP实战开发——定制HAP多目标构建产物

144 篇文章 3 订阅
110 篇文章 0 订阅

介绍

应用厂商会根据不同的部署环境,不同的目标人群,不同的运行环境等,将同一个应用定制为不同的版本,如国内版、国际版、普通版、VIP版、免费版、付费版等。针对以上场景,DevEco Studio支持通过少量的代码差异化配置处理,在编译构建过程中实现一个应用构建出不同的目标产物版本,从而实现源代码、资源文件等的高效复用。

本案例展示如何将工程打包成不同版本,并单独配置资源文件,实现定制多目标构建产物功能。

实现思路

在了解HarmonyOS应用的多目标构建产物如何定制前,先了解product和target的概念:

  • 一个HarmonyOS工程由一个或多个模块组成,工程的构建产物为APP包,APP包用于应用/服务发布上架应用市场。由于不同的业务场景,需要定制不同的应用包,因此引入product概念。一个工程可以定义多个product,每个product对应一个定制化应用包,通过配置可以实现一个工程构建出多个不同的应用包。
  • 工程内的每一个Entry/Feature模块,对应的构建产物为HAP,HAP是应用/服务可以独立运行在设备中的形态。由于在不同的业务场景中,同一个模块可能需要定制不同的功能或资源,因此引入target的概念。一个模块可以定义多个target,每个target对应一个定制的HAP,通过配置可以实现一个模块构建出不同的HAP。
1.定义目标产物target

每一个Entry/Feature模块均支持定制不同的target,通过在模块中的build-profile.json5文件中实现差异化定制,当前支持设备类型(deviceType)、源码集(source)、资源(resource)、C++依赖的.so(buildOption)的定制。

每一个target对应一个定制的HAP,因此,在定制HAP多目标构建产物前,应提前规划好需要定制的target名称。例如,以本工程为例,定义一个默认版和适配tablet版,源码参考:build_profile.json5。示例如下:

{
  ...
  "targets": [
    {
      // 默认版target名称。
      "name": "default",
      "runtimeOS": "HarmonyOS",
    },
    {
      // tablet版target名称。
      "name": "tablet_target",
      "runtimeOS": "HarmonyOS",
    }
  ]
}
  • 注意:本工程使用的是多Har静态共享包,Har模块只有默认配置的default Target,不支持定制其它Target。
2.定义产物的deviceType

每一个target均可以指定支持的设备类型deviceType,也可以不定义。如果不定义,则该target默认支持config.json或module.json5中定义的设备类型。

例如,在上述定义的2个target中,分别定义default默认支持所有设备类型,tablet版本只支持tablet设备。

{
  ...
  "targets": [
    {
      // 未定义deviceType,默认支持config.json或module.json5中定义的设备类型。
      "name": "default",
      "runtimeOS": "HarmonyOS"
    },
    {
      "name": "tablet_target",
      "runtimeOS": "HarmonyOS",
      "config": {
        "deviceType": [
          // 定义支持的设备类型为tablet,支持的设备类型必须在config.json或module.json5中已经定义。
          "tablet"
        ]
      }
    }
  ]
}

module.json5中定义设备类型的示例如下:

{
  "module": {
    ...
    "deviceTypes": [
      "default",
      "tablet"
    ],
  }
}
3.定义产物的source源码集

对于source源码集的定制,Stage模型支持对pages源码目录的page页面进行定制。示例如下:

{
  "targets": [
    {
      // 会员版target名称
      "name": "tablet_target",
      "runtimeOS": "HarmonyOS",
      "source": {
        // 定义stage模型中tablet版本target的pages源码文件,可根据需求选择区别于默认版本的源码文件。
        "pages": [
          "pages/TabletEntryView"
        ]
      }
    }
  ]
}
4.定义产物的resource资源

每个target使用的资源文件可能存在差异,在开发过程中,开发者可以将每个target所使用的资源存放在不同的资源目录下。

本工程为ArkTS工程,仅支持对main目录下的资源文件目录(resource)进行定制。示例如下:

{
  "targets": [
    {
      "name": "default",
      "runtimeOS": "HarmonyOS",
    },
    {
      // 会员版target名称
      "name": "tablet_target",
      "runtimeOS": "HarmonyOS",
      "resource": {
        // 定义tablet版本使用的资源文件目录,该功能在API 9及以上版本的工程中生效,可根据需求选择区别于默认版本的资源文件。
        "directories": [
          "./src/main/resources"
        ]
      }
    }
  ]
}
5.定义目标产物product

APP用于应用/服务上架发布,针对不同的应用场景,可以定制不同的product,每个product中支持对bundleName、签名信息以及包含的target进行定制。

每一个product对应一个定制的APP包,因此,在定制APP多目标构建产物前,应提前规划好需要定制的product名称。例如定义tablet product包。 源码参考:build-profile.json5。示例如下:

{
  "app": {
    "products": [
      {
        "name": "default",
        "signingConfig": "default",
        "compileSdkVersion": '4.1.0(11)',
        "compatibleSdkVersion": '4.1.0(11)',
        "runtimeOS": "HarmonyOS"
      },
      {
        "name": "tablet_product",
        // 定义tablet版本的包名
        "bundleName": "com.north.commonappdevelopmenttablet",
        // 定义tablet版本的签名文件信息
        "signingConfig": "tablet",
        "compileSdkVersion": '4.1.0(11)',
        "compatibleSdkVersion": '4.1.0(11)',
        "runtimeOS": "HarmonyOS"
      }
    ],
  },
}
  • 上述示例同时定义了tablet版本的bundleName为com.north.commonappdevelopmenttablet,针对每个定义的product,均可以定制不同的bundleName。如果product未定义bundleName,则采用工程默认的bundleName。
  • 注意:本案例已实现根据product自动更换bundleName,若需要手动修改bundleName,需要同时修改entry/hvigorfile.ts文件。也可选择手动修改app.json5示例如下:
{
  "app": {
    "bundleName": "com.north.commonappdevelopmenttablet",
    ...
  }
}
6.定义product的签名配置信息

针对每个定义的product,均可以定制不同的signingConfig签名文件,如果product未定义signingConfig,则构建生成未签名的APP包。

首先需要在签名配置界面或工程的build-profile.json5文件中配置签名信息:

7.定义product中包含的target

开发者可以选择需要将定义的target分别打包到哪一个product中,每个product可以指定一个或多个target,同时每个target也可以打包到不同的product中, 但是同一个module的不同target不能打包到同一个product中。

本工程前面定义了default和tablet两个版本的target,此时需要将不同的target打包到不同的product中,源码参考:build-profile.json5。示例如下:

{
  "modules": [
    {
      "name": "entry",
      "srcPath": "./product/entry",
      "targets": [
        {
          // 将default target 打包到default版本的APP中
          "name": "default",
          "applyToProducts": [
            "default"
          ]
        },
        {
          // 将tablet target 打包到tablet_product版本的APP中
          "name": "tablet_target",
          // 设置该target适用于tablet_product版本的APP
          "applyToProducts": [
            "tablet_product"
          ]
        }
      ]
    }
  ]
}
8.构建定义的目标产物

每个target对应一个HAP,每个product对应一个APP包,在编译构建时,如果存在多product或多target时,可以指定编译具体的包。方法如下:

参考资料

定制多目标构建产物

鸿蒙全栈开发全新学习指南

也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】

本路线共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值