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

背景

在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.rhkb.cn/news/389780.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初学(9)

9.1、结构简介 虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的…

QtQuick Text-文本样式

属性 Text项目的style属性可以设置文本的样式。 支持的文本样式有: Text.Normal(默认)Text.OutlineText.RaisedText.Sunken 示例 import QtQuickRow{spacing: 10padding: 10Text {font.pointSize: 40text: "Normal"}Text {font…

数据库原理之多表查询——使用Mysql进行内连接和外连接

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:Idea 目录 1.内连接 1.1隐式内连接 1.1.1定义 1.1.2举例 1.1.3优缺点 1.2显式内连接 1.2.1定义 1.2.2举例 1.2.3优缺点 2.外连接 2.1左外连接 2.1.1定义 2.1.2举例 2.…

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境,这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持,因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…

如何确保PLC系统安全的可靠性,这几个注意事项你需要牢记

PLC(可编程逻辑控制器)是现代工业自动化系统中的关键组成部分。在设计 PLC 系统时,安全性是至关重要的考虑因素。本文将介绍 PLC 系统设计中的一些安全注意事项,包括电源设计、接地设计、关键数字量输入输出设计和报警设计。 一.…

vue实现简易的全局加载动画效果

效果展示 思路 封装一个组件,放Img,伪类样式,固定在屏幕fixed 然后App应用这个组件,Z index拉最大,防止用户在加载动画时乱点, v-show绑定loading,该数据可以放vuex还是任一的公共状态管理变…

PDF文件点击打印无反应?是何原因造成能解决吗?

PDF无法打印怎么处理?在我们工作中,经常会遇见各种各样的文件问题,当我们想要将PDF文件打印出来纸质版使用,却不知什么原因,显示PDF无法打印,这时应该怎么处理呢? 一般情况下,PDF文件…

cesium canvas广告牌

在有些业务中,对场景中的广告牌样式要求比较高,需要动态显示一些数据,这个时候,我们可以通过将复杂背景样式制作成图片,通过canvas绘制图片和动态数据,从而达到比较好的显示效果。 1 CanvasMarker 类封装 …

学Python可少不了项目练手,这8个小项目有趣又实用,小白也能做出来_python练手项目,python教程

学习之路比较科学的学习方法是理解了之后把知识点进行运用,找一些开源的小项目做是最好的,站在岸上是学不会游泳的,光看健身视频是减不了肥的,不自己动手敲代码是学不会编程的。 我在找了8个比较有趣的小项目,技术水平…

E5092A可配置的多端口测试仪

E5092A 可配置的多端口测试仪 多达 10 个端口的全交叉测量,或者最多 22 个端口的测量功能。 概述 E5092A 多端口测试仪可以灵活配置,并可与4 端口ENA 网络分析仪(E5070B/E5071B/E5071C/E5080A)结合使用,组成频率范…

web3 solana

网址:HACKQUEST 学习初衷: 1.web3概念较为小众,相比于web2,机会较多 2.有机会remote work,带着笔记本到处浪,听着就不错 3.面对越来越卷的国内,有机会并有能力拥抱国外job,感觉是…

鸿蒙系统开发【应用接续】基本功能

应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器,主要包括一个直播视频播放界面,实现视频播放时可以从一台设备迁移到另一台设备继续运行,来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…

《LeetCode热题100》---<5.②普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道:轮转数组(中等) 第四道:除自身以外数组的乘积(中等) 第三道:轮转数组(中等) 方法一:使用额外的数…

vscode+cmake+msys2工具链配置

1、msys2下载编译器和cmake工具 pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-cmaketoolchain包中包含很多不必要的工具包,应该可以指定具体的工具g,gcc,mingw32-make的下载,详细命令请自行搜索。 2、将 m…

QT 应用程序输出中文乱码

一 ,选择文本编码 1. 点击编辑再点击Select Encoding选择编码 2 .在弹出的窗口,选择UTF-8再点击按编码保存即可 3. 重新编译,可以发现中文乱码问题解决

思维+dfs,CF 269C - Flawed Flow

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 269C - Flawed Flow 二、解题报告 1、思路分析 考虑源点相连的边的方向是确定的,因为流量是从源点往外流的 我们设cap[u] 为 和u相连边的容量和,显然入边容量要和出边容量相等&…

jvm调优参数

JVM调优是指调整JVM的参数,以优化Java程序的性能。以下是一些常用的JVM调优方法: 1.堆内存大小:通过-Xms和-Xmx参数设置JVM的初始堆内存和最大堆内存。堆内存太小会导致频繁GC,太大则可能导致内存利用率不高。 2.新生代与老年…

OS_操作系统的运行环境

2024.06.11:操作系统的运行环境学习笔记 第3节 操作系统的运行环境 3.1 操作系统引导3.2 操作系统内核3.2.1 内核资源管理3.2.2 内核基本功能 3.3 CPU的双重工作模式3.3.1 CPU处于用户态(目态)3.3.2 CPU处于内核态(管态) 3.4 特权…

鸿蒙Scroll布局,横向与纵向

注意,当横向scroll时,直接子元素的宽,不能100%, 当纵向scroll时,直接子元素的高,不能100%​​​​​​​ 1、纵向代码: 方法1:用数值计算,来设置中间的高度: …

nginx负载均衡、java、tomcat装包

一、nginx 七层负载均衡 1、七层负载均衡基础配置 2、负载均衡状态 [rootserver]# vim /usr/local/nginx/conf/nginx.confworker_processes 1;event {worker_connections 1024;}http { # 七层负载均衡支持http、ftp协议include mime.types;default_type app…