现状与诉求

随着 HarmonyOS Next 5.0 版本正式发布,众多开发者基于 ArkTS 语言为 HarmonyOS Next 系统开发了大量应用,这极大地丰富了 HarmonyOS 的生态。越来越多的应用上线,也给开发者带来了挑战,开发者需要同时开发和维护适用于 HarmonyOS Next、Android、iOS 三个平台的应用程序。这不仅意味着开发工作量大幅增加,开发成本也随之上升,而且很难保持一致的交互体验。

ArkUI-X 跨平台框架是基于 HarmonyOS 打造的跨端跨平台框架,能实现 “一次开发、三平台部署”。 基于ArkTS开发的HarmonyOS Next应用,配套ArkUI-X跨平台框架,可以快速改造为跨平台应用,缩短开发周期,同时还能确保应用在 HarmonyOS Next、Android、iOS 多个平台上,为用户提供一致的交互体验。

本文重点介绍如何将HarmonyNext应用工程转换为跨平台工程,实现一码多平台。

改造目标

从零开始或基于现有HarmonyOS Next App进行改造,使其可快速部署于Android、IOS平台。

通过ArkUI-X框架Bridge能力实现ArkTS与原生平台交互。

方案说明

依据分层架构设计理念,分三部分阐述。

产品定制层(products)

由于不同操作系统之间的数据平台差异等客观原因,部分功能基于各平台的独特能力来实现不可避免。基于此,在products层,建议开发者建立两个module,分别命名为harmonyos和arkuix。在不同的hap包中集成对应的独特功能模块,最终编译成独立的hap包,以此实现功能隔离的效果。

当然,倘若在app的实际开发进程中确定所有功能在三端应用时均可实现,也就是不需要考虑平台差异性问题,可以直接采用单hap设计。开发者需要根据实际开发状况进行全面综合的考量。

module 编译产物:hap包 运行设备平台/系统能力支持
harmonyos harmonyos.hap HarmonyOS Next
arkuix arkuix.hap Android
arkuix arkuix.hap iOS

products层为App主module,其编译产物为HAP。作为应用的入口。一般保留有应用启动页和应用首页。由于采用了分包编译,需要开发者于harmonyos.hap(下面简称A包)和 arkuix.hap (下面简称B包)中各自独立开发应用启动页和应用首页(下面简称Pages),带来额外的开发量。基于此,建议开发者进行 products层 设计时考虑以下几点:

共性考虑:对于App来说,A包和B包都存在”设置页面、我的页面、登录页面“(见上图),这些共性的代码和文件如果分别存放于A包和B包会导致大量的冗余代码,也不利于后期维护,因此建议对其进行抽象,形成一个独立的模块存放(features层模块main),通过module依赖的方式使用。

差异性考虑:对于App来说,仅A包存在”发现页面“(见上图),如果B包运行至”发现页面“时会产生不可预知的后果。

$$ B包的Pages设计时删除相关的页面元素,用户使用基于B包的app时不感知”发现页面“。

$$ 相关的数据结构、方法函数等应重新设计,可以抽象的部分进行抽象,存于features层模块main;无法抽象的部分各自实现。

基础特性层(features)

Features层属于App的特性界面层,其编译产物为HAR/HSP包。在该层级中,包含了应用的所有UI界面、弹窗、媒体图片等元素,这些都是能够被用户直接感知并进行操作的。此层是借助HarmonyOS的ArkUI组件以及相关能力来进行设计与开发的,并且ArkUI-X框架确保了在Android/iOS与HarmonyOS Next上能够拥有相同的展示效果和交互体验。

1.开发者进行设计时需首先考虑ArkUI-X框架的实际适配状况,使用支持跨平台的UI控件、属性、方法进行跨平台开发,因为在UI组件方面存在的差异,是无法借助Bridge能力来弥补的。

2.API接口的使用:在使用API接口时可能会遇到以下两种情况:1、API不支持跨平台。2、API在Android、IOS平台支持能力有差异(具体信息可参考相应的API文档)。因此不建议开发者在features层直接调用API接口实现功能。应尽可能对其抽象,于commons层创建功能模块实现,使用时调用commons层相应功能模块接口。具体实现详见“第三部分:公共能力层(commons)”。

3.共通组件:在实际开发过程中,可以抽象出部分满足多种场景的共通UI。可以在commons层创建模块“uicomponents”,将共通UI抽象并实现,实现代码复用的效果。

4.应注意,features层应合理设计模块,谨慎处理模块间依赖关系,避免循环依赖等问题。

模块main

Products层harmonyos.hap(下面简称A包)和 arkuix.hap (下面简称B包)这样的双hap设计解决了因设备平台差异导致的应用功能差异的问题。但是由此引入了新问题:如果对Products层代码进行量化,那么共性代码(A包和B包可复用的一套代码)是要远远多于差异性代码(A包和B包需各自进行设计,无法复用)的。开发者在后续的开发和维护过程中,每次都需要同时修改分别部署于A包和B包的共性代码。由此产生大量冗余代码和不必要的工作量。

为解决该问题,我们设计了模块main。模块main使用HAR。通过将共性的部分抽取、实现。后续的开发和维护过程中,仅修改main模块即可,从而提升开发效率,减少冗余代码,优化代码结构。

  然而,需要特别注意的是,当products层采用单hap设计时,由于所有功能都集成在一个hap包中,因此无需额外创建模块main,以避免不必要的复杂性。

图片左侧为单hap设计,因为不存在差异性代码,所有代码集成于Products层phone.hap中,向下依赖features层。

图片右侧为双hap设计,其中差异性代码各自在harmonyos.hap和arkuix.hap中分别实现,实现功能隔离。共性代码抽象集成于features层模块main中,A包和B包共同依赖模块main,实现代码复用。

公共能力层(commons)

commons层是App的能力集合体,其编译产物为HAR/HSP包,主要用于阐述App的核心功能与附加服务。它向上能够为features层和products层直接给予能力方面的支持,向下则依靠运行设备平台的系统能力。ArkUI - X框架的Bridge能力,为功能模块直接调用Android/iOS平台的能力提供了有力的支撑。

需要注意的是,commons层应当合理规划模块设置,谨慎对待模块间的依赖关系,避免出现循环依赖等问题。

建议开发者首先考虑使用ArkUI-X框架已有API进行开发。

根据当前ArkUI-X框架的适配现状,可分为三种改造方式,结合架构图commons层 NetWork进行说明。至于工程中具体的文件部署细节详见:工程目录结构设计。

说明: 示例代码主要展示整体流程、架构。相关代码细节如接口定义、函数功能实现等需开发者根据实际进行开发填充。

ArkUI-X跨平台应用改造指南的更多相关文章

  1. Ubuntu 12.04 改造指南

    文章转自:http://www.lupaworld.com/article-217719-1.html 升级12.04已经有一段时间了.作为一个从08年就开始用Ubuntu的老用户,我觉得作为一个LT ...

  2. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

  3. 【云享专刊】开源遇上华为云,OCP架构变身“云原生框架”

    摘要:华为云DTSE团队出品云原生改造指南,助力轻松实践OCP上云. 本文分享自华为云社区<[云享专刊]开源遇上华为云,OCP架构变身"云原生框架">,作者:华为云社区 ...

  4. Disconf实践指南:改造篇

    上一篇文章Disconf实践指南:使用篇介绍了如何在项目中应用disconf,虽然实现了分布式配置的实时刷新,但是我们希望能够去除所有的配置文件,把配置都交给disconf管理,本地只需要实现配置监听 ...

  5. 超级简单的跨平台高性能音视频播放框架QtAv编译指南

    目录 一.了解QtAv 二.相关文章 三.下载QtAv源码 四.下载QtAv依赖库 五.设置环境变量 1.gcc设置方式 2.msvc(cl)设置方式 六.编译 七.测试 一.了解QtAv 这几天抱着 ...

  6. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  7. 使用React Native来撰写跨平台的App

    React Native 是一个 JavaScript 的框架,用来撰写实时的.可原生呈现 iOS 和 Android 的应用.其是基于 React的,而 React 是 Facebook 的用于构建 ...

  8. Visual Studio Code 配置指南

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ...

  9. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  10. .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存

    注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...

随机推荐

  1. Windows 10右键添加 "在此处打开命令窗口" 菜单

    1.添加右键菜单的两种效果: 第一种是在 桌面/文件夹窗口中/选中文件夹上直接点击右键,显示"在此处打开命令窗口"选项,如图: 第二种是在 桌面/文件夹窗口中/选中文件夹上按住Sh ...

  2. Oracle删除用户及用户下的全部数据

      1.查看用户 select * from all_users select * from user_users select * from dba_users 2.查看用户的连接状况 select ...

  3. docx4j转换HTML并生成word文档实践

    一.背景 在项目开发中,有一个需求需要将富文本编辑器中的内容转换为word文档.在网上看了很多开源第三方工具包的对比,最终选择了docx4j,主要原因有一下几点: 可以将html转换为word 对wo ...

  4. Redis 原理 - String

    String 数据结构 首先我来看下, Redis 中 String 的数据结构: 我们称之为 SDS (Simple Dynamic String) 简单动态字符串 struct sdshdr { ...

  5. Arrays.asList() 详解

    [1. 要点] 该方法是将数组转化成List集合的方法. List list = Arrays.asList("a","b","c"); 注 ...

  6. nginx 部署配置

        下载nginx 包(http://nginx.org/en/download.html)   nginx常用命令: nginx -s stop 快速关闭Nginx,可能不保存相关信息,并终止w ...

  7. MySQL性能调优必知:Performance Schema引擎的配置与使用

    当你在MySQL高并发情况下的进行性能调优时,需要知道调整后的影响.例如查询是否变快了?锁是否会减慢运行速度?内存使用情况如何?磁盘IO等待时间变了吗? . Performance Schema就有一 ...

  8. Linux权限之基础权限

    介绍 Linux是多用户的操作系统,允许多个用户同时登录和工作,Linux权限是操作系统用来限制不同用户对资源的访问机制.这里暂且将Linux的权限分为三类: 基本权限:给文件和目录的所属者.所属组. ...

  9. MySQL的并发问题的解决方案

    怎么解决脏读.不可重复读.幻读这些问题呢?其实有两种可选的解决方案 方案一.读操作利用MVCC(多版本并发控制),写操作进行加锁. 所谓的MVCC,就是生成一个ReadView,通过ReadView找 ...

  10. 🎀java-自定义日志注解

    简介 创建自定义日志注解,对相关接口记录请求日志. 环境 SpringBoot 实现 注解定义 定义注解类 package com.zk.app.annotation; import com.zk.a ...