HarmonyOS(七)一次开发,多端部署

2024-09-28  本文已影响0人  简单Timor

定义:一套代码工程,一次开发上架,多端按需部署。
目标:支撑开发者快速高效的开发支持多种终端设备形态的应用,实现对不同设备兼容的同时,提供跨设备的流转、迁移和协同的分布式体验。

关键问题

要实现’一多布局‘,我们需要考虑以下问题:

不同设备间的屏幕尺寸、色彩风格等存在差异,页面如何适配。

不同设备的系统能力有差异,如智能穿戴设备是否具备定位能力、智慧屏是否具备摄像头等,功能如何兼容。

如何实现一套代码同时能部署到多种不同设备上,代码工程如何组织。

界面级一多

布局能力

自适应布局
自适应布局
响应式布局

当窗口宽度从一个断点变化到另一个断点时,改变页面布局(如将页面内容从单列排布调整为双列排布甚至三列排布等)以获得更好的显示效果。

响应式布局
Grid 布局

资源使用

在页面开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。有两种方式处理:

应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中的表现。
系统资源:开发者直接使用系统预置的资源定义(即分层参数)。

交互归一

HarmonyOS 自动统一了各种交互操作,无需开发者处理,统一了各种交互方式的API,即实现了交互归一。

功能级一多

如果某个系统能力没有写入应用的要求能力集中,那么在使用前需要判断设备是否支持该系统能力。

方法1:HarmonyOS定义了API canIUse帮助开发者来判断该设备是否支持某个特定的syscap。

if (canIUse("SystemCapability.Communication.NFC.Core")) {
   console.log("该设备支持SystemCapability.Communication.NFC.Core");
} else {
    console.log("该设备不支持SystemCapability.Communication.NFC.Core");
}

方法2:开发者可通过import的方式将模块导入,若当前设备不支持该模块,import的结果为undefined,开发者在使用其API时,需要判断其是否存在。

import controller from '@kit.ConnectivityKit';
try {
    controller.enableNfc();
    console.log("controller enableNfc success");
} catch (busiError) {
    console.log("controller enableNfc busiError: " + busiError);
}

配置联想能力集和要求能力集

// syscap.json
{
    "devices": {
        "general": [            // 每一个典型设备对应一个syscap支持能力集,可配置多个典型设备
            "default",
            "tablet"
        ],
        "custom": [             // 厂家自定义设备
            {
                "某自定义设备": [
                    "SystemCapability.Communication.SoftBus.Core"
                ]
            }
        ]
    },
    "development": {             // addedSysCaps内的sycap集合与devices中配置的各设备支持的syscap集合的并集共同构成联想能力集
        "addedSysCaps": [
            "SystemCapability.Communication.NFC.Core"
        ]
    },
    "production": {              // 用于生成rpcid,慎重添加,可能导致应用无法分发到目标设备上
        "addedSysCaps": [],      // devices中配置的各设备支持的syscap集合的交集,添加addedSysCaps集合再除去removedSysCaps集合,共同构成要求能力集
        "removedSysCaps": []     // 当该要求能力集为某设备的子集时,应用才可被分发到该设备上
    }
}

工程级一多

工程级一多需要考虑如何实现一套代码同时能部署到多种不同设备上,代码工程如何组织。

应用程序包结构

在进行应用开发时,一个应用通常包含一个或多个Module。Module是HarmonyOS应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。

Module分为“Ability”和“Library”两种类型:

HarmonyOS的应用以APP Pack形式发布,其包含一个或多个HAP包。HAP是HarmonyOS应用安装的基本单位,HAP可以分为Entry和Feature两种类型:

部署模型

“一多”有两种部署模型:

从屏幕尺寸、输入方式及交互距离三个维度考虑,可以将常用类型的设备分为不同泛类:

对于相同泛类的设备,优先选择部署模型A,对于不同泛类设备,优先选择部署模型B。

说明
应用在不同泛类设备上的UX设计或功能相似时,可以使用部署模型A。
应用在同一泛类不同类型设备上UX设计或功能差异非常大时,可以使用部署模型B,但同时也应审视应用的UX设计及功能规划是否合理。
本小节引入部署模型A和部署模型B的概念是为了方便开发者理解。实际上在开发多设备应用时,如果目标设备类型较多,往往是部署模型A和部署模型B混合使用。
不管采用哪种部署模型,都应该采用一次编译。

工程结构

“一多”推荐在应用开发过程中使用如下的“三层工程结构”。

代码工程结构抽象后一般如下所示:

/application
├── common                  # 可选。公共能力层, 编译为HAR包或HSP包
├── features                # 可选。基础特性层
│   ├── feature1            # 子功能1, 编译为HAR包或HSP包或Feature类型的HAP包
│   ├── feature2            # 子功能2, 编译为HAR包或HSP包或Feature类型的HAP包
│   └── ...
└── products                # 必选。产品定制层
    ├── wearable            # 智能穿戴泛类目录, 编译为Entry类型的HAP包
    ├── default             # 默认设备泛类目录, 编译为Entry类型的HAP包
    └── ...

说明:
部署模型不同,相应的代码工程结构也有差异。部署模型A和部署模型B的主要差异点集中在products层:部署模型A在products目录下同一子目录中做功能和特性集成;部署模型B在products目录下不同子目录中对不同的产品做差异化的功能和特性集成。

开发阶段应考虑不同类型设备间最大程度的复用代码,以减少开发及后续维护的工作量。
整个代码工程最终构建出一个APP包,应用以APP包的形式发布到应用市场中。


B
上一篇 下一篇

猜你喜欢

热点阅读