HarmonyOS多目标产物构建最佳实践

news2024/9/24 17:13:45

背景

在Android或iOS开发时经常会有打“马甲”包的场景,就是一套代码打出不同主题的包,一个公司的产品可能针对不同用户提供不同的应用,比如抖音有国内版也有国外版,滴滴有个人版还有企业版,同样的在鸿蒙平台也有类似的诉求,本文我们讨论鸿蒙平台的多产物构建。

HarmonyOS 工程配置文件说明

下面是一个最简单的鸿蒙工程截图:

在这里插入图片描述

工程 build-profile.json5

在一个标准的Android工程中,工程下的模块使用setting.gradle来声明,对应的鸿蒙应用的模块配置在build-profile.json5中:

{  
  "app": {  
    "signingConfigs": [],  
    "products": [  
      {  
        "name": "default",  
        "signingConfig": "default",  
        "compatibleSdkVersion": "5.0.0(12)",  
        "runtimeOS": "HarmonyOS",  
      }  
    ],  
    "buildModeSet": [  
      {  
        "name": "debug",  
      },  
      {  
        "name": "release"  
      }  
    ]  
  },  
  "modules": [  
    {  
      "name": "entry",  
      "srcPath": "./entry",  
      "targets": [  
        {  
          "name": "default",  
          "applyToProducts": [  
            "default"  
          ]  
        }  
      ]  
    }  
  ]  
}

modules列表中声明模块,其中:

  • name:模块名
  • srcPath:模块对应路径
  • targets:构建目标

注意: 这里跟Android有两个不同:

  • 一个工程中只允许有一个entry模块,比如一个SDK工程中想创建两个demo应用模块是不允许的;
  • srcPath路径只能指向工程根目录和子目录,而不能指向不在工程目录下的模块,比如工程A想源码依赖另一个工程B中的模块是不允许的;

模块 build-profile.json5

{  
  "apiType": "stageMode",  
  "buildOption": {  
  },  
  "buildOptionSet": [  
    {  
      "name": "release",  
      "arkOptions": {  
        "obfuscation": {  
          "ruleOptions": {  
            "enable": true,  
            "files": [  
              "./obfuscation-rules.txt"  
            ]  
          }  
        }  
      }  
    },  
  ],  
  "targets": [  
    {  
      "name": "default"  
    },  
    {  
      "name": "ohosTest",  
    }  
  ]  
}
  • apiType:API模型类型
    • stageMode:长期演进的模型,官方推荐使用该模型
    • faMode:FA模型
  • buildOptionSet:编译配置集合,主要包含混淆配置规则等。
  • targets:构建目标

module.json5

模块/main/下的module.json5示例:

{  
  "module": {  
    "name": "entry",  
    "type": "entry",  
    "description": "$string:module_desc",  
    "mainElement": "EntryAbility",  
    "deviceTypes": [  
      "phone",  
      "tablet",  
      "2in1"  
    ],  
    "deliveryWithInstall": true,  
    "installationFree": false,  
    "pages": "$profile:main_pages",  
    "abilities": [  
      {  
        "name": "EntryAbility",  
        "srcEntry": "./ets/entryability/EntryAbility.ets",  
        "description": "$string:EntryAbility_desc",  
        "icon": "$media:layered_image",  
        "label": "$string:EntryAbility_label",  
        "startWindowIcon": "$media:startIcon",  
        "startWindowBackground": "$color:start_window_background",  
        "exported": true,  
        "skills": [  
          {  
            "entities": [  
              "entity.system.home"  
            ],  
            "actions": [  
              "action.system.home"  
            ]  
          }  
        ]  
      }  
    ],  
    "extensionAbilities": [  
      {  
        "name": "EntryBackupAbility",  
        "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",  
        "type": "backup",  
        "exported": false,  
        "metadata": [  
          {  
            "name": "ohos.extension.backup",  
            "resource": "$profile:backup_config"  
          }  
        ],  
      }  
    ]  
  }  
}

主要作用类似于Android中的AndroidManifest,声明模块信息、deviceTypes等。

  • name:标识当前Module的名称,确保该名称在整个应用中唯一。取值为长度不超过31字节的字符串,不支持中文。应用升级时允许修改该名称,但需要应用适配Module相关数据目录的迁移
  • type:标识当前Module的类型。支持的取值如下:
    • entry:应用的主模块。
    • feature:应用的动态特性模块。
    • har:静态共享包模块。
    • shared:动态共享包模块。
  • srcEntry:标识当前Module所对应的代码路径,取值为长度不超过127字节的字符串。
  • description:标识当前Module的描述信息,取值为长度不超过255字节的字符串,可以采用字符串资源索引格式。
  • deviceTypes:标识当前Module可以运行在哪类设备上。
  • deliveryWithInstall:标识当前Module是否在用户主动安装的时候安装,即该Module对应的HAP是否跟随应用一起安装。
    • true:主动安装时安装。
    • false:主动安装时不安装。
  • requestPermissions:标识当前应用运行时需向系统申请的权限集合。
  • dependencies:标识当前模块运行时依赖的共享库列表。
  • targetModuleName:标识当前包所指定的目标module,确保该名称在整个应用中唯一。取值为长度不超过31字节的字符串,不支持中文。配置该字段的Module具有overlay特性。仅在动态共享包(HSP)中适用。
    更多具体说明参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/module-configuration-file-V5

官方推荐模块结构

由于平级目录进行模块管理有两个缺陷不利于开发及后期维护:

  • 工程逻辑结构混乱
  • 模块间的依赖关系不够清晰

官方推荐common、features、product三层工程结构:

/application
 ├── common                  # 公共特性目录
 │
 ├── features                # 功能模块目录
 │   ├── feature1            # 子功能
 │   ├── feature2            # 子功能2
 │   └── ...                 # 子功能n
 │
 └── product                 # 产品层目录
     ├── wearable            # 智能穿戴泛类目录
     ├── default             # 默认设备泛类目录
     └── ...

product与target介绍

在介绍多目标产物构建前先介绍下target和product的概念:

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

最佳实践

目标

要开发一个SDK,这个SDK上面又封装了两个SDK,这两个SDK分别额外实现了ToB和ToC业务的功能,这三个SDK在一个工程中,开发调试时最方便的方式就是可以有三个Demo分别调试这三个不同的SDK。
在这里插入图片描述

方案

由于HarmonyOS工程中只能有一个可运行的entry模块,所以创建三个demo分别运行的方式无法跑通。

"modules": [  
  {  
    "name": "app",  
    "srcPath": "./app",  
    "targets": [  
      {  
        "name": "default",  
        "applyToProducts": [  
          "default"  
        ]  
      }
    ]  
  },  
 {  
    "name": "app_c",  
    "srcPath": "./app_c",  
    "targets": [  
      {  
        "name": "default",  
        "applyToProducts": [  
          "default"  
        ]  
      }  
    ]  
  },  
  {  
    "name": "app_b",  
    "srcPath": "./app_b",  
    "targets": [  
      {  
        "name": "default",  
        "applyToProducts": [  
          "default"  
        ]  
      }  
    ]  
  }
]

虽然在build_profile中声明了三个带targets模块,但是只有第一个可以运行。

方案一

可以通过把其他两个配置注释掉,使用运行哪个打开哪个的方式调试,这样的缺点就是每次调试不同模块都需要修改代码。

方案二

Biz2B和Biz2C模块合成一个模块,定义连个target,用不同代码路径区分2B或者2C,但是Biz2B和Biz2C是两个对外独立的SDK,合成一个模块无法对外差异化提供。

方案三

Biz2B和Biz2C模块各自创建两个target,分别是2B和2C,配置源码模块分别制定不同路径,Biz2B模块的2Ctarget指向空路径,这样demo工程虽然依赖了2B模块,但是调试2C的target不会有任何Biz2B的代码。可是使用模块级build_profile.json5中的sourceRoots属性,制定源码路径。

参考文档

  1. https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-customized-multi-targets-and-products-guides-0000001731595144-V5#section2554174114463
  2. https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-using-V5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百元内性价比最高的随身WiFi!格行随身WiFiVS京东云VS先机随身WiFi真实测评!哪个随身WiFi网速最快?口碑最好的随身WiFi!

随身WiFi是大家都熟知的便携式上网设备不管是出差旅行✈还是学生党租房都非常合适。但是现在市面上的随身WiFi产品良莠不齐‼价格也千差万别!今天给大家挑选三款百元内性价比最高的随身WiFi出期测评看下哪款最好用——先机、格行和京东云的详细测评,帮助…

深度学习6--深度神经网络

1.VGG网络 在图像分 类这个领域中,深度卷积网络一般由卷积模块和全连接模块组成。 (1)卷积模块包含卷积层、池化层、Dropout 层、激活函数等。普遍认为,卷积模块是对 图像特征的提取,并不是对图像进行分类。 (2)全连接模块跟在卷积模块之后&…

Selenium安装WebDriver:ChromeDriver谷歌浏览器驱动下载安装与使用最新版116/117/118/119/120/121/122/123

Selenium安装WebDriver:ChromeDriver谷歌浏览器驱动下载安装与使用最新版116/117/118/119/120/121/122/123 文章目录 Selenium安装WebDriver:ChromeDriver谷歌浏览器驱动下载安装与使用最新版116/117/118/119/120/121/122/1230. 背景1. 确定Chrome版本2.…

大模型系统和应用——自然语言处理大模型基础_大模型和自然语言处理的相互影响

引言 最近在公众号中了解到了刘知远团队退出的视频课程《大模型交叉研讨课》,看了目录觉得不错,因此拜读一下。 观看地址: https://www.bilibili.com/video/BV1UG411p7zv 目录: 自然语言处理&大模型基础神经网络基础Transf…

新款奔驰G350升级动态通风按摩座椅有哪些功能

奔驰大 G350 升级通风按摩座椅的作用主要包括以下方面: 通风座椅的作用: • 改善空气流通:在炎热天气下,即使车内空调温度设定较低,乘客坐在座椅上时,身体与椅面紧密接触的部分仍可能会感到闷热&#xff…

人大高瓴发布Think-on-Graph 2.0,基于知识图的大模型推理再升级!

经常参加高考的朋友可能会体会到,比起死记硬背知识点,将知识整理成脉络往往会获得事半功倍的效果。其实对于大模型来说也是如此,哪怕被允许“开卷作答”,即通过检索增强(Retrieval-augmented generation,RA…

【前端面试3+1】20 css三栏布局6种实现方式、多行文本溢出怎么实现、token过期了怎么处理、【二叉树的中序遍历】

一、css三栏布局6种实现方式 1.浮动布局(Floats) .container {overflow: auto; /* 清除浮动 */ }.left, .right {width: 20%; /* 左右栏宽度 */float: left; }.middle {width: 60%; /* 中间栏宽度 */margin: 0 20%; /* 左右栏宽度 */ } 2.Flexbox .conta…

面试经典 222. 完全二叉树的节点个数

二叉树我最近刷的特别多,差不多快刷完了,但是有一种题型差点给我忽略了,那就是完全二叉树,这也是一个很重要的题型,今天刚好有一道题目可以来复习一下完全二叉树的特性 题目链接如下:https://leetcode.cn/…

力扣-200.岛屿数量

刷力扣热题–第二十四天:200.岛屿数量 新手第二十四天 奋战敲代码,持之以恒,见证成长 1.题目描述 2.题目解答 这道题刚开始想的确实想的绞尽脑汁的,看了相关解答才明白的,三种方法,这里想先用两种方法进行实现&#…

MySQL改密码(简洁无废话)

1.找到MySQL的bin目录: 2.在上方输入cmd: 进入这个界面: 3.输入 mysqladmin -uroot -p password 4.输入后在下面输入原密码: 5.下面输入新密码,确认新密码: 然后就可以修改成功了。

学习 Helm ,一文弄懂

1. 什么是 Helm 1.1 概述 Helm 是 Kubernetes 应用程序的包管理器,和redhat中yum 管理包类似. 1.2 架构图v3 1.3 下载 官当 最新版本 官方github curl -LO https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz 1.4 安装 解压 #由于是二进制,直接解压到/usr/local/b…

科普文:解读MySQL 执行计划explain

概叙 实战:万字小结MySQL慢原因分析-CSDN博客 实战:搞懂SQL执行流程、SQL执行计划解读和SQL优化_sql解析和sql执行计划-CSDN博客 在排查mysql执行慢的过程中,前面文章中都有解释explain执行计划,这里单独拿出来解读一下。 慢查…

uniapp打开地图直接获取位置

uniapp官网文档 https://en.uniapp.dcloud.io/api/location/open-location.html <view class"map-content" click.stop"kilometer(item)"><view class"km">{{item.distance||0}}km</view></view>import map from ../../…

业务逻辑支付漏洞靶场复现(dami,niushop,cmseasy)

目录 dami_5.4 第一种&#xff1a;直接修改页面数量 第二种&#xff1a;利用抓包修改购买数量和金额 Niushop Cmseasy 第一种&#xff1a;改变购买数量 第二种&#xff1a;利用抓包修改数量 dami_5.4 首先通过注册页面注册账户&#xff0c;并登录。 第一种&#xff1a;直…

鉴源实验室·HTTP协议网络安全攻击

作者 | 李芷若 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 背 景 随着互联网的迅猛发展&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&…

萝卜快跑引领换电革命,储能蓝海爆发千亿商机,你抓住了吗?

近日&#xff0c;百度旗下的无人驾驶出行服务平台“萝卜快跑”火爆出圈&#xff0c;7月10日凭借优秀的订单量表现成功助推百度股价上涨超10%&#xff0c;其六公里4元的超高性价比广受好评。多个网络平台的自媒体博主们也抓准时机开始各类测评体验。 百度“萝卜快跑”无人驾驶项…

QT安装 error: [QNetworkReply::NetworkError(

QT安装遇到问题&#xff1a; [29040] Warning: No QtAccount credentials found. Please login via the maintenance tool of the SDK. [29040] Warning: No QtAccount credentials found. Please login via the maintenance tool of the SDK. [31404] Warning: Network error…

linux用户组练习

准备工作 [rootlocalhost ~]# watch -n 1 tail -n 5 /etc/group使用watch 动态监控 1.建立用户组 shengcan&#xff0c;其id 为2000 2.建立用户组 caiwu&#xff0c;其id 为 2001 3.足建立用户组 jishu&#xff0c;其id 为 2002 4.建立用户lee&#xff0c;指定其主组id为sh…

QT多媒体编程(二)——视频编程知识详解及mp4视频播放器Demo

目录 引言 1. QMediaPlayer 类详解 1.1 基本用法 示例代码&#xff1a; 1.2 常用函数 2. QVideoWidget 类详解 2.1 基本用法 示例代码&#xff1a; 2.2 常用函数 3. 实际案例&#xff1a;视频播放器 UI界面 核心代码&#xff1a; 运行结果&#xff1a; 4. 总结 引…

NodeJS凉山地区特色农产品团购平台-计算机毕业设计源码72936

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4用例分析 2.5本章小结 3 系统总体设计 3…