一、HarmonyOS VS Android

相信很多关注鸿蒙的⼈,都会关注的⼀个焦点话题,那就是HarmonyOS是不是Android的套壳,对于这个话题,我只想阐明以下⼏个观点:

  1. HarmonyOS并不是Android的替代品,HarmonyOS与Android并⾮同⼀个赛道。
  2. HarmonyOS⽬前缺乏⽣态⽀持这⼀点远远⽐不上Android,但是HarmonyOS的战略眼光更加⾼。
  3. HarmonyOS相⽐Android有⼀定的性能提升。

1.1 系统定位

⾸先,我们来看⼀下这⼆者的⼀个定义:

  • Android:⼀种基于Linux内核(不包含GNU组件)的⾃由及开放源代码的操作系统。主要使⽤于移动设备,如智能⼿机和平板电脑,由美国Google公司和开放⼿机联盟领导及开发。
  • HarmonyOS:⼀款⾯向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能⼒基础上,HarmonyOS提出了基于同⼀套系统能⼒、适配多种终端形态的分布式理念,能够⽀持⼿机、平板、智能穿戴、智慧屏、⻋机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体娱乐等)业务能⼒。

从上⾯的定义就可以看出,Android和HarmonyOS两款产品的研发初衷完全不⼀样,根本就不在同⼀个赛道上,安卓系统⾯向的是⼿机端,⽽鸿蒙系统⾯向的是这些年⽐较的新的概念物联⽹,致⼒于利⽤其5G世界领先的技术,优先布局和打造⼀个超级终端,万物互联的⽣态。

1.2 内核对比

所谓“外行看热闹,内行看门道”,真正决定Android和HarmonyOS本质不同的就是内核、系统
架构等。

  • Android:基于linux的宏内核设计 ,宏内核包含了操作系统绝大多数的功能和模块,而且这
    些功能和模块都具有最高的权限,只要一个模块出错,整个系统就会崩溃,这也是安卓系统
    容易崩溃的原因。系统开发难度低。
  • HarmonyOS:基于微内核设计,微内核仅包括了操作系统必要的功能模块(任务管理、内
    存分配等)处在核心地位具有最高权限,其他模块不具有最高权限,也就是说其他模块出现
    问题,对于整个系统的运行是没有阻碍的,微内核稳定性很高。鸿蒙系统包含了两个内核:
    Linux内核和LiteOS内核。

关于这部分内容,建议大家看一下华为官方对于HarmonyOS的技术架构介绍视频,内核层总体
架构有说明。

image.png

此处,我们重点介绍一下内核层,HarmonyOS系统的内核层分为内核子系统和驱动子系统,说
明如下。

  • 内核子系统:HarmonyOS采用多内核设计,支持针对不同资源受限设备选用适合的OS内核。内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异,对上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。
  • 驱动子系统:硬件驱动框架(HDF)是HarmonyOS硬件生态开放的基础,提供统一外设访问能力和驱动开发、管理框架。

1.3 运行效率

由于HarmonyOS汲取了各种系统的有点,所以具有后发优势,在运行效率上明显更高。

  • Android:基于Java语言编码,Java语言有个很大的缺点是其不能直接与底层操作系统通信,需要通过虚拟机充当中间转换的角色。虽然Android进行了虚拟机优化,编译器优化,热点代码等技术使得运行越来越快,但是无法直接与操作系统互相通信一直影响着其性能的突破。
  • HarmonyOS:鸿蒙开发也可以采用Java语言,但官方更推荐使用ArkTs语言开发,并且针对ArkTs,官方提供了方舟编译器,通过方舟编译器编译的软件可以直接与底层操作系统通信,方舟编译器在这一层面做到了取代虚拟机。通过方舟编译器转换为操作系统能够读懂的机器语言,这样就可以跳过虚拟机解释这一步骤,运行效率明显提高。当然,这样肯定对机器的内存要求比较高。

1.4 方舟编译器

方舟编译器作为一款全新的编译器可以显著提高手机的运行速度,它不采用现有编译器边解释边执行的模式,而是将这种动态编译改为静态编译,可以做到全程执行机器码,进而高效运行程序,大大缩短程序响应时间。

image.png
并且,根据官方的介绍,方舟编译器有如下的一些优势:

  • 多语言联合:将同一应用中的不同语言代码联合编译、联合优化,消除语言间的性能 “鸿沟”,降低开发者的优化成本。
  • 轻量运行时:通过编译器的语言实现能力和优化能力增强,应用运行时的开销更小。
  • 软硬件协同:编译器与芯片实现软硬件协同优化,充分发挥硬件能效,应用体验更佳。
  • 多平台支持:支持面向多样化的终端设备平台进行编译和运行,根据设备特征提供便捷的开发与部署策略,提高开发效率。

image.png

二、Android系统

在正式介绍HarmonyOS之前,我们有必要先认识下Android系统。

2.1 Android系统简介

Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,由Google成立的OHA(Open Handset Alliance,开放手机联盟)领导并开发,为各类智能手机及便携式设备提供可运行的操作系统。

Android操作系统最早由Andy Rubin、Rich Miner和Nick Sears等人创建并开发,后被Google于2005年收购。2007年11月,Google联合硬件制造商、软件开发商及电信营运商组建了开放手机联盟,随后以Apache开源许可证的授权方式,发布了Android的源代码,称之为AOSP(Android Open Source Project,Android开放源代码项目)。

2008年,Google提出了AndroidHAL架构,并联合HTC发布了第一部Android智能手机。随后,Android不断发展更新,并逐渐扩展到平板电脑及其他领域,如电视、数码相机、游戏机、智能手表等。并在2011年,首次超过塞班系统,跃居全球移动操作系统市场份额第一,彼时的iOS、塞班等移动操作系统完全没有任何抗衡能力。而Android之所以能在短时间内称雄移动操作系统市场,得归功于Android系统的AOSP。

并且,随着Android系统的不断发展壮大,Android在2017年3月成功超越Microsoft Windows,成为全球装机量最多的操作系统。截至2023年8月,根据StatCounter统计,除了美国、英国、加拿大、巴哈马、冰岛等少数国家和地区外,Android都是占比最高的智能手机操作系统。

2.2 Android系统架构

Android系统构架又被称为体系结构,和其他操作系统一样,Android系统也采用了分层的架
构,共分为四层五个部分,从下到上分别是Linux内核层、硬件抽象层(HAL)、Android系统
运行库、Java API框架层和应用层,如下图所示。

image.png

下面具体来介绍下这几层。

Linux内核层

Android的核心系统服务依赖于Linux内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。同时,Linux内核也是硬件和软件栈之间的抽象层,允许设备制造商为内核开发硬件驱动程序。

硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准接口,向更高级别的 Java API 框架提供接入能力。HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架API要求访问硬件设备时,Android 系统将为该硬件加载相应的库模块。

Android Runtime & 系统库

对于运行Android 5.0或更高版本的设备,每个应用都在自己的进程中运行,并且拥有自己的Android Runtime (ART) 实例。而在 Android 5.0版本之前,Dalvik就是Android Runtime。ART通过执行DEX文件,可以在设备上运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,作为一种经过优化的字节码文件,DEX文件占用的内存很少。

并且,编译工具链(如Jack)能够将Java源代码编译为DEX字节码,使其运行在Android设备上。ART主要功能包括:预先 编译(AOT) 和即时 (JIT) 编译,优化垃圾回收 (GC),以及调试方面的支持,如专用采样分析器、详细的诊断异常和崩溃报告等。

同时,Android还包含一套核心运行时库,可提供Java API框架所使用的 Java编程语言中的大部分功能,还包括一些Java 8语言功能。

事实上,Android系统的许多核心系统组件和服务(如ART和HAL)都是构建自原生代码,所以需要使用C和C++来编写对应的原生库,然后再提供Java API供应用层调用。例如,我们可以通过Android提供的Java OpenGL API来访问OpenGL ES的相关服务,实现在应用中绘制和操作2D和3D图形的需求。

Java API框架层

Java API框架层主要是提供构建应用程序可能用到的各种API,Android自带的一些核心应用就使用到了这些API,当然开发者也可以使用这些API来构建属于自己的应用程序。

事实上,这些API是创建Android应用所必须的构建模块,它们是一些简化后的系统组件和服务,是可以重复使用的,具体包括如下:

  • 丰富、可扩展的视图系统,可用于构建应用的UI,如列表、网格、文本框、按钮以及浏览器
    等;
  • 资源管理器,用于访问非代码资源,如本地化的字符串、图形和布局文件等;
  • 通知管理器,用于在应用的状态栏中显示提醒消息;
  • Activity管理器,用于管理应用的生命周期,以及提供导航栈管理;
  • 内容提供程序,用于访问其他应用的数据或者共享自己的数据;

应用层

Android系统在发布时会默认提供一些核心应用程序包,如电子邮件、短信、日历、互联网浏览和联系人等,它们一般使用Java语言进行编写。事实上,所有安装在手机上的应用程序都是属于这一层的。

三、HarmonyOS系统

3.1 HarmonyOS系统简介

HarmonyOS是华为发布的一款面向万物互联的全新分布式操作系统。不同于既有的Android、iOS、Windows、Linux等操作系统,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够同时支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景业务能力,实现极速发现、极速连接、硬件互助、资源共享的场景体验。

自2019年8月正式发布以来,HarmonyOS一共经过了四次大的迭代。目前的HarmonyOS 4.0,称为支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备的操作系统。

3.2 HarmonyOS系统架构

和Android系统一样,HarmonyOS系统架构遵从分层设计,从下向上依次是内核层、系统服务层、框架层和应用层。系统功能按照【系统】> 【子系统】>【功能/模块】逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或功能/模块。HarmonyOS系统架构如下图所示。

image.png

下面我们重点介绍下这几层。

内核层

HarmonyOS系统的内核层分为内核子系统和驱动子系统,说明如下。

  • 内核子系统:HarmonyOS采用多内核设计,支持针对不同资源受限设备选用适合的OS内核。内核抽象层(KALKernelAbstract Layer)通过屏蔽多内核差异,对上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。
  • 驱动子系统:HarmonyOS驱动框架(HDF,HarmonyOS Driver Foundation)作为HarmonyOS硬件生态开放的基础,提供统一外设访问能力和驱动开发、管理框架。

    系统服务层

    系统服务层是HarmonyOS核心能力的集合,通过框架层对上层的应用程序提供服务。该层包含
    以下几个部分:

  • 系统基本能力子系统集:为分布式应用在HarmonyOS多设备上运行、调度、迁移等操作提供基础能力,由分布式软总线、分布式数据管理、分布式任务调度、方舟多语言运行时、公共基础库、多模输入、图形、安全、AI等子系统组成。
  • 基础软件服务子系统集:为HarmonyOS提供公共的、通用的软件服务,由事件通知、电话、多媒体、DFX、MSDP&DV等子系统组成。
  • 增强软件服务子系统集:为HarmonyOS提供针对不同设备的、差异化的能力增强型软件服务,由智慧屏专有业务、穿戴专有业务、IoT专有业务等子系统组成。
  • 硬件服务子系统集:为HarmonyOS提供硬件服务,由位置服务、生物特征识别、穿戴专有硬件服务、IoT专有硬件服务等子系统组成。

同时,根据不同设备形态的部署环境,基础软件服务子系统集、增强软件服务子系统集、硬件服
务子系统集内部可以按子系统粒度进行裁剪,并且每个子系统内部又可以按功能粒度进行裁剪。

框架层

框架层为HarmonyOS应用程序提供Java/C/C++/JS等多语言的用户程序框架和Ability框架,以及各种软硬件服务对外开放的多语言框架API。同时为采用HarmonyOS的设备提供C/C++/JS等多语言框架API,需要注意的是,不同设备支持的API与系统的组件化裁剪程度相关。

应用层

应用层包括系统应用和第三方非系统应用。通常,HarmonyOS应用由一个或多个FA(Feature Ability)或PA(Particle Ability)组成。其中,FA有UI界面,提供与用户交互的能力;而PA无UI界面,提供后台运行任务的能力以及统一的数据访问抽象。基于FA/PA开发的应用,能够实现特定的业务功能,支持跨设备调度与分发,为用户提供一致、高效的应用体验。

3.3 HarmonyOS包结构

在正式进行HarmonyOS应用/服务开发前,开发者需要掌握应用/服务的一些包结构和基本概念。通常,应用/服务发布形态为APP Pack(Application Package,简称APP),它是由一个或多个HAP(Harmony Ability Package)包以及描述APP Pack属性的pack.info文件组成。

HAP是HarmonyOS应用安装的基本单位,由编译后的代码、资源、三方库及配置文件构成,HAP可以分为Entry和Feature两种类型,说明如下。

  • Entry类型的HAP:应用/服务的主模块,可独立安装运行。对于同一类型的设备,APP可以包含一个或多个Entry类型的HAP,如果同一类型的设备包含多个Entry模块,需要配置distroFilter分发规则,这样就可以在做应用的云端分发时,对不同规格的设备进行分发。
  • Feature类型的HAP:应用/服务的动态特性模块。通常,一个APP可以包含零到多个Feature类型的HAP,并且只有包含Ability的HAP才能够独立运行。

同时,HarmonyOS应用开发分成了两种开发模型,分别是Stage模型和FA模型用。其中,FA模型是鸿蒙早期版本就支持的模型,适合工程结构不是很复杂的应用;Stage模型则是API 9新增的模型,是为了解决FA模型无法解决的开发场景而开发的新模型。

FA模型与Stage模型最大的区别在于,FA模型的每个应用组件独享一个虚拟机,多个应用组件共享同一个虚拟机。所以,相比Stage模型来说,FA模型的应用程序包结构要简单许多,如下图所示。

image.png

可以看到,FA模型将所有的资源文件、库文件和代码文件都放在assets文件夹中,然后在文件
夹内部进一步进行区分,说明如下。

  • config.json:应用配置文件,IDE会自动生成一部分模块代码,开发者按需修改其中的配
    置。
  • assets:HAP所有的资源文件、库文件和代码文件集合,内部由entry和js文件夹构成。
    entry文件夹存放的是资源文件和resources.index文件。
  • resources:用于存放应用的资源文件,如字符串、图片等,便于开发者使用和维护。
  • resources.index:资源索引表,由IDE调用SDK工具自动生成。
  • js:文件夹中存放的编译后的代码文件。
  • pack.info:Bundle中用于描述每个HAP属性的文件,由IDE工具生成Bundle包时自动生成。

Stage模型基于FA模型的基础概念演化而来,开发者能够使用它开发出分布式场景下的复杂应
用,Stage模型应用包结构如下图所示。

image.png

可以看到,每个应用程序都可以包含多个HAP包文件,而HAP则由ets、libs、resources等文件
夹和resources.index、module.json、pack.info等配置文件构成,说明如下。

  • ets:用于存放应用代码编译后的字节码文件。
  • libs:用于存放库文件,库文件是HarmonyOS应用依赖的第三方代码。
  • resources:用于存放应用的资源文件,便于开发者使用和维护。
  • resources.index:是资源索引表,由IDE编译工程时生成。
  • module.json:HAP配置文件,内容由工程配置中的module.json5和app.json5组成,IDE会
    自动生成一部分默认配置,开发者按需修改其中的默认配置。
  • pack.info:用于描述每个HAP属性的文件,如应用的bundleName和versionCode信息、模
    块的name、type和abilities等信息。

不过,从API 10开始,HarmonyOS将逐步弃用FA模型,并主推Stage模型。因为,相较于FA模
型,FA模型目录管理更加简单方便,且更容易扩展。

三、HAR与HSP

OpenHarmony提供了两种共享包,分别是HAR(Harmony Archive)静态共享包和HSP
(Harmony Shared Package)动态共享包。

HAR与HSP都是为了实现代码和资源的共享,都包含有代码、C++库、资源和配置文件,二者最
大的不同之处在于,HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产
物中会存在多份相同拷贝。而HSP中的代码和资源可以独立编译,运行时在一个单独的进程中,
代码也只会存在一份,HAR和HSP在APP包中的形态下图所示。

image.png

HAR表示HarmonyOS开发中的静态共享包,类似于Android开发中的aar包。HAR包含代码、C++库、资源和配置文件,HAR可以实现多个模块或多个工程之间ArkUI组件、资源等代码的共享。不同于HAP,HAR不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。

HSP表示HarmonyOS开发中的动态共享包,类似于Android开发中的library模块。HSP只能在应用内部其他的HAP或HSP使用,实现应用内部代码、资源的共享。同时,应用内HSP跟随其宿主应用的APP包一起发布,与该宿主应用具有相同的包名和生命周期。

HSP旨在解决HAR存在的几个问题:

  • 多个HAP引用相同的HAR,导致的APP包大小膨胀问题。
  • 多个HAP引用相同的HAR,HAR中的一些状态变量无法共享的问题。

HSP的一些约束:

  • HSP及其使用方都必须是Stage模型。
  • HSP及其使用方都必须使用esmodule编译模式。
  • HSP不支持在配置文件中声明abilities、extensionAbilities标签。

关于HarmonyOS系统的一些基本概念和知识就给大家介绍到这个,接下来,我将通过一些基础
语法和实战项目,来交大家如何上手HarmonyOS应用开发。


xiangzhihong
5.9k 声望15.3k 粉丝

著有《React Native移动开发实战》1,2,3、《Kotlin入门与实战》《Weex跨平台开发实战》、《Flutter跨平台开发与实战》1,2和《Android应用开发实战》