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

打印 上一主题 下一主题

主题 535|帖子 535|积分 1605

先容

应用厂商会根据差别的部署环境,差别的目标人群,差别的运行环境等,将同一个应用定制为差别的版本,如国内版、国际版、平凡版、等。针对以上场景,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版,示比方下:
  1. {
  2.   ...
  3.   "targets": [
  4.     {
  5.       // 默认版target名称。
  6.       "name": "default",
  7.       "runtimeOS": "HarmonyOS",
  8.     },
  9.     {
  10.       // tablet版target名称。
  11.       "name": "tablet_target",
  12.       "runtimeOS": "HarmonyOS",
  13.     }
  14.   ]
  15. }
复制代码


  • 注意:本工程使用的是多Har静态共享包,Har模块只有默认设置的default Target,不支持定制其它Target。
2.定义产物的deviceType

每一个target均可以指定支持的装备类型deviceType,也可以不定义。如果不定义,则该target默认支持config.json或module.json5中定义的装备类型。
比方,在上述定义的2个target中,分别定义default默认支持所有装备类型,tablet版本只支持tablet装备。
  1. {
  2.   ...
  3.   "targets": [
  4.     {
  5.       // 未定义deviceType,默认支持config.json或module.json5中定义的设备类型。
  6.       "name": "default",
  7.       "runtimeOS": "HarmonyOS"
  8.     },
  9.     {
  10.       "name": "tablet_target",
  11.       "runtimeOS": "HarmonyOS",
  12.       "config": {
  13.         "deviceType": [
  14.           // 定义支持的设备类型为tablet,支持的设备类型必须在config.json或module.json5中已经定义。
  15.           "tablet"
  16.         ]
  17.       }
  18.     }
  19.   ]
  20. }
复制代码
在 module.json5 中定义装备类型的示比方下:
  1. {
  2.   "module": {
  3.     ...
  4.     "deviceTypes": [
  5.       "default",
  6.       "tablet"
  7.     ],
  8.   }
  9. }
复制代码
3.定义产物的source源码集

对于source源码集的定制,Stage模型支持对pages源码目次的page页面进行定制。示比方下:
  1. {
  2.   "targets": [
  3.     {
  4.       // 会员版target名称
  5.       "name": "tablet_target",
  6.       "runtimeOS": "HarmonyOS",
  7.       "source": {
  8.         // 定义stage模型中tablet版本target的pages源码文件,可根据需求选择区别于默认版本的源码文件。
  9.         "pages": [
  10.           "pages/TabletEntryView"
  11.         ]
  12.       }
  13.     }
  14.   ]
  15. }
复制代码
4.定义产物的resource资源

每个target使用的资源文件大概存在差异,在开辟过程中,开辟者可以将每个target所使用的资源存放在差别的资源目次下。
本工程为ArkTS工程,仅支持对main目次下的资源文件目次(resource)进行定制。示比方下:
  1. {
  2.   "targets": [
  3.     {
  4.       "name": "default",
  5.       "runtimeOS": "HarmonyOS",
  6.     },
  7.     {
  8.       // 会员版target名称
  9.       "name": "tablet_target",
  10.       "runtimeOS": "HarmonyOS",
  11.       "resource": {
  12.         // 定义tablet版本使用的资源文件目录,该功能在API 9及以上版本的工程中生效,可根据需求选择区别于默认版本的资源文件。
  13.         "directories": [
  14.           "./src/main/resources"
  15.         ]
  16.       }
  17.     }
  18.   ]
  19. }
复制代码
5.定义目标产物product

APP用于应用/服务上架发布,针对差别的应用场景,可以定制差别的product,每个product中支持对bundleName、署名信息以及包含的target进行定制。
每一个product对应一个定制的APP包,因此,在定制APP多目标构建产物前,应提前规划好需要定制的product名称。比方定义tablet product包。
  1. {
  2.   "app": {
  3.     "products": [
  4.       {
  5.         "name": "default",
  6.         "signingConfig": "default",
  7.         "compileSdkVersion": '4.1.0(11)',
  8.         "compatibleSdkVersion": '4.1.0(11)',
  9.         "runtimeOS": "HarmonyOS"
  10.       },
  11.       {
  12.         "name": "tablet_product",
  13.         // 定义tablet版本的包名
  14.         "bundleName": "com.north.commonappdevelopmenttablet",
  15.         // 定义tablet版本的签名文件信息
  16.         "signingConfig": "tablet",
  17.         "compileSdkVersion": '4.1.0(11)',
  18.         "compatibleSdkVersion": '4.1.0(11)',
  19.         "runtimeOS": "HarmonyOS"
  20.       }
  21.     ],
  22.   },
  23. }
复制代码


  • 上述示例同时定义了tablet版本的bundleName为com.north.commonappdevelopmenttablet,针对每个定义的product,均可以定制差别的bundleName。如果product未定义bundleName,则接纳工程默认的bundleName。
  • 注意:本案例已实现根据product自动更换bundleName,若需要手动修改bundleName,需要同时修改 entry/hvigorfile.ts 文件。也可选择手动修改 app.json5 示比方下:
  1. {
  2.   "app": {
  3.     "bundleName": "com.north.commonappdevelopmenttablet",
  4.     ...
  5.   }
  6. }
复制代码
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中,示比方下:
  1. {
  2.   "modules": [
  3.     {
  4.       "name": "entry",
  5.       "srcPath": "./product/entry",
  6.       "targets": [
  7.         {
  8.           // 将default target 打包到default版本的APP中
  9.           "name": "default",
  10.           "applyToProducts": [
  11.             "default"
  12.           ]
  13.         },
  14.         {
  15.           // 将tablet target 打包到tablet_product版本的APP中
  16.           "name": "tablet_target",
  17.           // 设置该target适用于tablet_product版本的APP
  18.           "applyToProducts": [
  19.             "tablet_product"
  20.           ]
  21.         }
  22.       ]
  23.     }
  24.   ]
  25. }
复制代码
8.构建定义的目标产物

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

写在最后

如果你觉得这篇内容对你还蛮有资助,我想邀请你帮我三个小忙


  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表