Loading...
墨滴

掀乱书页的风

2021/10/21  阅读:102  主题:兰青

鸿蒙服务卡片上架实践

背景

2021 年 6 月 3 日,华为举行了鸿蒙 OS2.0 发布会。HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上,HarmonyOS 提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体娱乐等)业务能力。那么鸿蒙系统的发布给我们带来哪些影响呢?

HarmonyOS 对软件开发行业的影响

  • 一个面向全场景的分布式微内核操作系统
  • 全球有 100 多万的开发者
  • HarmonyOS 有望成为全球第三大移动应用生态,升级用户已经超过 1 亿

HarmonyOS 对开发者的影响

对终端开发者的影响

应用场景广:手机、TV、穿戴设备、智能家居、车载软件

  • HarmonyOS 天生支持 IOT(物联网)
  • HarmonyOS 不仅支持开发手机应用,而且可以开发应用于物联网的智能终端应用(智能空调,智能油烟机等等)
  • 终端开发者可以通过 HarmonyOS 拓宽就业场景

对非移动端开发者的影响

HarmonyOS 支持 java 和 js 双语言开发,而且对 js 开发开发的能力比 java 更强大,隐隐有向前端倾斜的趋势,所以如果你是一个前端开发者,那么也可以很容易的进行鸿蒙开发。未来对移动开发者竞争会越来越激烈

58 同城服务卡片

服务卡片
服务卡片
首页
首页

要开发这样一个服务卡片,我们需要了解那些知识

  1. HarmonyOS 体系架构
  2. 什么是服务卡片
  3. 服务卡片与原子化服务有什么关系

插入一点,刚开始的时候鸿蒙是支持混合打包的,也就是现有Android应用的基础上扩展鸿蒙的特性,以最快的速度布局鸿蒙生态,现在已经被鸿蒙官方禁止了,这里就不介绍了,我只讲纯Harmony开发。

HarmonyOS 架构解析

HarmonyOS 整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 功能/模块”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或功能/模块。

HarmonyOS体系架构
HarmonyOS体系架构
Android体系架构
Android体系架构

HarmonyOS 与 Android 的体系架构呢是比较类似的,这里只说一下两者的不同之处

  1. HarmonyOS 内核采用 linux 微内核开发,Android 是采用的 linux 宏内核,微内核开发难度更大,但是系统稳定性更高。
  2. HarmonyOS 采用分布式设计,实现一次开发,多端部署

HarmonyOS 如何兼容 Android

HarmonyOS 是不是 Android 套壳?

华为 OpenHarmony 是指华为开源的鸿蒙 OS 系统,它是一个纯净版的 Harmony OS 系统,不兼容 Android 应用,而目前华为手机所使用的 HarmonyOS 2 系统,是基于 OpenHarmony 二次开发,直接打包了 HMS、EMUI 桌面以及 AOSP 框架中的代码,形成了华为手机专用的商业版手机操作系统,AOSP 起到了兼容 Android 的作用。

什么是服务卡片

服务卡片是 FA(Feature Ability,元服务,代表有界面的 Ability,用于与用户进行交互)的一种界面展示形式,将 FA 的重要信息或操作前置到卡片,以达到服务直达,减少体验层级的目的。有点类似于 Android 中的 widget

卡片常用于嵌入到其他应用中作为其界面的一部分显示,并支持拉起页面,发送消息等基础的交互功能。卡片使用方负责显示卡片。

基本概念

  • 卡片提供方 提供卡片显示内容的 HarmonyOS 应用或原子化服务,控制卡片的显示内容、控件布局以及控件点击事件。

  • 卡片使用方 显示卡片内容的宿主应用,控制卡片在宿主中展示的位置。

  • 卡片管理服务 用于管理系统中所添加卡片的常驻代理服务,包括卡片对象的管理与使用,以及卡片周期性刷新等

运作机制

卡片管理服务包含以下模块:

  • 周期性刷新:在卡片添加后,根据卡片的刷新策略启动定时任务周期性触发卡片的刷新。
  • 卡片缓存管理:在卡片添加到卡片管理服务后,对卡片的视图信息进行缓存,以便下次获取卡片时可以直接返回缓存数据,降低时延。
  • 卡片生命周期管理:对于卡片切换到后台或者被遮挡时,暂停卡片的刷新;以及卡片的升级/卸载场景下对卡片数据的更新和清理。
  • 卡片使用方对象管理:对卡片使用方的 RPC 对象进行管理,用于使用方请求进行校验以及对卡片更新后的回调处理。
  • 通信适配层:负责与卡片使用方和提供方进行 RPC 通信。

卡片提供方包含以下模块:

  • 卡片服务:由卡片提供方开发者实现,开发者实现 onCreateForm、onUpdateForm 和 onDeleteForm 处理创建卡片、更新卡片以及删除卡片等请求,提供相应的卡片服务。
  • 卡片提供方实例管理模块:由卡片提供方开发者实现,负责对卡片管理服务分配的卡片实例进行持久化管理。
  • 通信适配层:由 HarmonyOS SDK 提供,负责与卡片管理服务通信,用于将卡片的更新数据主动推送到卡片管理服务。

什么是原子化服务

原子化服务是 HarmonyOS 提供的一种面向未来的服务提供方式,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统程序框架后台安装后即可使用)、可为用户提供一个或多个便捷服务的用户应用程序形态。例如:某传统方式的需要安装的购物应用 A,在按照原子化服务理念调整设计后,成为由“商品浏览”“购物车”“支付”等多个便捷服务组成的、可以免安装的购物原子化服务 A*。

原子化服务与传统方式的需要安装的应用对比
原子化服务与传统方式的需要安装的应用对比

服务卡片是 HarmonyOS 原子化服务的展示方式

Harmony VS Android 深度对比

了解了 HarmonyOS 的体系架构以及服务卡片以后,我们就要开始开发了。作为一个 android 开发者来说,在了解了 Harmony 开发 SDK 一些概念以后是可以快速上手鸿蒙开发的,为什么这么讲呢

我们来看一下 HarmonyOS 和 Android 的深度对比

目录结构对比

harmony java工程目录
harmony java工程目录
harmony js工程目录
harmony js工程目录
目录结构 Android HarmonyOS
源码目录 src>main>java src>main>java
资源文件目录 src>main>res src>main>resources
清单文件 src>main>AndroidManifest.xml src>main>config.json
依赖文件目录 libs libs
模块编译配置文件 build.gradle build.gradle
gradle 目录 gradle gradle
构建产物 .apk .hap

.hap 文件里面会生成一个 apk 文件,这也是能够兼容 android 的原因

hap文件结构
hap文件结构

API对比

API Android HarmonyOS
静态资源索引文件 R ResourceTable
组件多状态背景 selector.xml state-container.xml
布局加载器 LayoutInflater LayoutScatter
碎片页 Fragment Fraction
窗体 Activity Ability(page)
绘图对象 Drawable ShapeElement
开发工具命令集 adb hdc
res资源管理 Resource ResourceManager
app上下文 Context Context
列表组件 ListView 、RecyclerView ListContainer
多页组件 ViewPager PageSlider
线性布局 LinearLayout DirectionalLayout
相对布局 RelativeLayout DependentLayout
handler android.os.Handler ohos.eventhandler.EventHandler
组件容器 ViewGroup ComponentContainer
... ... ...

太多了,就不一一列举了。

生命周期对比

HarmonyOS支持应用以Ability为单位进行部署。 Ability可以分为FA(Feature Ability)和PA(Particle Ability)两种类型,每种类型为开发者提供了不同的模板,以便实现不同的业务功能。

  • FA支持Page Ability(类比成Android的Activity): Page模板是FA唯一支持的模板,用于提供与用户交互的能力。一个Page实例可以包含一组相关页面,每个页面用一个AbilitySlice实例表示。

  • PA支持Service Ability和Data Ability:

    • Service模板(类比成Android的Service):用于提供后台运行任务的能力。
    • Data模板(类比成Android的ContentProvider):用于对外部提供统一的数据访问抽象。
harmony FA生命周期
harmony FA生命周期
android Activity生命周期
android Activity生命周期

虽然生命周期各阶段的具体定义不一样,但是Ability和Activity的生命周期大致相同的,我们在开发中可以用Android来类比,但是具体的一些细节可能会不同。

Ability Activity
onStart() onCreate(),onStart()
onActive() onResume()
onInactive() onPause()
onBackground() onStop()
onForeground() onRestart()
onStop() onDestory()

通过上面的讲解,假如你没有听懂,也没关系,只要记住2点就可以

  1. HarmonyOS是很高大上的
  2. HarmonyOS和Android开发比较类似,Android开发人员非常容易上手

HarmonyOS开发体验——束手束脚

如果你做过iOS开发,那么体验就会相对好一些,因为鸿蒙的某些开发机制就是对标iOS的,比如SDK源码不公开,复杂的证书调试机制。如果你没有iOS的相关经验,那真的是一把心酸泪啊。

如果关注鸿蒙的同学可能会发现一个问题,网上关于鸿蒙的文章,99%都是讲鸿蒙的系统框架多么高大上,很少有SDK源码解析的。像事件分发机制,Compoment的绘制原理这些最基本的东西都没人分析。这是因为HarmonyOS的SDK源码闭源的,拿不到源码,没法分析。由于SDK不开源,开发体验,直线下降

踩坑记录

  1. 使用 uri 方式跳转到 Android 应用的时候,假如目标 app 没有启动,则无法跳转
 Intent wubaIntent = new Intent();

 Operation operation = new Intent.OperationBuilder()
           .withAction("android.intent.action.VIEW")
           .withUri("跳转协议")
           .withFlags(Intent.FLAG_ABILITY_NEW_MISSION| Intent.FLAG_NOT_OHOS_COMPONENT)
           .build();


wubaIntent.setOperation(operation);
startAbility(wubaIntent);

鸿蒙提供了一个 action,Intent.FLAG_NOT_OHOS_COMPONENT,专门为跳转到 Android 应用设计的,但是使用这个 action 就会造成上面的问题。最后鸿蒙给出了解决方案:去掉这个 action,就可以正常跳转了...

  1. zh 目录
image
image

文档中标注的 3 个字段,会强行取 base 目录下的资源,不会识别 zh 目录下的资源,很奇葩的设定。反馈给鸿蒙,鸿蒙说后续会优化

  1. 打印log(Hilog)

最基础的一个功能,经历了3个阶段

  • 真机无法打印log,只能打印Error级别(有时候不输出)
  • 可以打印log,但是有bug,有时候顺序不对(抓狂)
  • 正常打印log
  1. webview始终处于最顶层

DependentLayout(相对布局)或StackLayout(FrameLayout)中使用WebView会遮挡其它控件,目前没有解决方案,改需求

  1. webview没有缓存功能

一旦断网,当前页面或者返回上级页面直接报错,鸿蒙为了安全设计,把缓存功能去掉了,但是没有提供相应的替代方案...

  1. 第三方库处于待丰富阶段

鸿蒙虽然也在快速发展,但是一些第三方插件还是相对较少,基本是使用原始的开发方式

  1. 报错信息少,定位困难

有些错误日志,莫名其妙,看了会一脸懵逼,只能不断的Google和查看API文档。而且由于源码看不到,找不到深层次的报错原因

  1. 签名文件不支持配置相对路径

只支持绝对路径,这就造成一个问题,如果是多人开发,首次 拉代码后都要重新配置签名文件路径,而且不能提交

  1. 服务卡片尺寸不固定

UI设计的时候是正方形,由于桌面布局不同实际会被拉伸成各种尺寸,适配起来就很恶心

image
image
  1. 布局时weight比重无论View是否显示,都会占据剩余空间

调试机制

调试机制可以用 4 个字来形容非常奇葩,为了避免大家走弯路,下面带大家写一个 HelloWorld,你可能以为运行 HelloWorld 很简单,我当时也这么认为的,最后证明是 too young too simple。
为了对标 ios 的签名机制,如果做过 ios 开发的同学,应该习以为常了

下载 IDE

DevEco Studio
DevEco Studio

安装过程这里就省略了,傻瓜式安装

image
image

这里只提一句,不支持 M1 版本的 mac,所以运行起来会出现卡段,延迟,体验不到丝滑顺畅的感觉

创建 HelloWorld

harmony 支持 java 和 js 开发,这里我们就选择熟悉的 java 语言开发了

image
image

修改默认参数 image

自动生成模板代码

image
image

按照我们开发 android 经验来讲,这时候链接手机,点击运行按钮,就可以安装启动 app,然而现实往往是不尽人意的。

image
image

运行之后会报一个 Failure[INSTALL_FAILED_NO_BUNDLE_SIGNATURE]的错误,无法安装,意思就是没有 bundle 签名

创建应用

  1. 需要有一个华为开发者账号,没有的话自行注册(必须实名,否则无法使用全部功能)
  2. 模拟器和真机调试,官方文档非常详细,这里我就不多写了 使用真机调试

结论:

  • 模拟器开发涉及到手势操作不方便,而且有一个小时的时间限制
  • IDE 自动签名方式,适用于自己写 demo 测试,不会发给别人的情况
  • 多人合作开发,如何申请调试签名呢

演示第三种方式

image
image

添加 HarmonyAppProvision 信息

image
image

注意,上面有 2 个选项,选择证书和选择设备,刚开始我们是没有的,所以需要进行设置
harmony 是没有默认证书的,如何生成证书呢,跟 android studio 是类似的

生成证书的过程

上传证书

证书这 2 步搞完以后,下面我们新增设备,找到新增设备的页面,这个地方需要获取 UDID,写着通过 harmony 调试助手获取,但是只是针对手表使用。那么我们怎么获取 udid 呢

image
image
  1. adb shell bm get -udid
  2. hdc shell bm get -udid

hdc 是鸿蒙的调试工具,这两个命令很容易让人产生遐想

完成证书创建和设备添加之后,我们再回到第一步

选择调试证书
选择调试证书
选择调试设备
选择调试设备

下载证书配置签名

需要 3 个文件,以及申请证书时使用的密码

image
image
image
image

配置完这一些列之后就可以进行调试安装了

开发调试问答阶段

  1. 调试证书和调试设备可以在不同的测试应用中共用吗

答:可以,但是添加应用的包名那一步是必不可少的,也就是每新建一个工程,都需要在 AppGallery Connect 中创建应用才能调试

  1. release 包可以调试安装吗

答:release 包不支持调试安装。仅用于发布上架,也就是说我们要把 App 的功能在 debug 包上都验证一遍

  1. 我打了一个 debug 安装包直接发给 QA,QA 可以测试吗

答:不可以,鸿蒙手机无法识别鸿蒙安装包,只能通过命令安装

  1. 组内新买了一台鸿蒙手机,可以直接用于测试吗?测试包还能随意组织体验吗?

答:不可以,必须在 AppGallery Connect 中添加新的设备 udid,并且重新下载签名文件,重新打包,才可以安装

  1. 出现 bug 后我可以查看鸿蒙 sdk 的源码,定位到底是在哪儿报错的吗

答:不可以,鸿蒙 sdk 不开放源码,出了问题只能查看 api 文档,调试的时候很憋屈

掀乱书页的风

2021/10/21  阅读:102  主题:兰青

作者介绍

掀乱书页的风