前言

前几日,华为EMUI官网微博正式发表更名为HarmonyOS。

这不就是说,当前华为手机都是鸿蒙零碎了嘛?鸿蒙还收回了一条视频,视频中显示2021年6月2号将开启鸿蒙操作系统及华为全场景新品发布会。预计当初反对EMUI11降级的机型,将全副反对降级鸿蒙零碎。我这一瞅,这不就是今天筹备推送了嘛,放松学习一波儿。

之前始终有关注过鸿蒙零碎,然而感觉应该不会很快的大面积推送零碎。直到看到这个新闻后,我才感觉是时候学一下鸿蒙零碎了。

学习鸿蒙零碎非常简单,目前鸿蒙的文档、开发者社区、学习视频都十分多。我的次要学习办法就是跟着官网读一遍文档。而后文档外面没理解过概念知识点整顿一下。

零碎定位

文档中有一段对于鸿蒙的零碎定位,看到这段文字介绍,就能够总结出鸿蒙零碎的三大特点:

  1. 分布式:鸿蒙能够适配多个终端,包含手机、平板、智能家电、智慧屏、车载机等。从这个定位而言,就阐明鸿蒙零碎从设计之初就跟安卓零碎不一样。最要害的就是,面对不同的设施终端,只须要开发一套零碎,而不须要屡次开发。也就是鸿蒙实现了一次开发,多端部署的能力。
  2. 易开发:鸿蒙零碎提供了多种开发语言API,包含Java、C、JS。也就是前后端开发人员都能够疾速上手学习鸿蒙。我感觉鸿蒙零碎架构师在设计鸿蒙的时候,也是心愿尽可能多的让各种开发人员学习和把握鸿蒙。
  3. 组件化:鸿蒙采纳组件化设计方案,能够实现不同终端设备对操作系统的要求。说人话就是呢,不同的设施对操作系统有不同的要求。比方有些智能家电不须要屏幕显示模块,采纳鸿蒙零碎的家电,会依据理论须要自由组合零碎模块。这样带来的益处之一就是,缩小智能家电零碎的大小,实现业务灵便裁剪。

从这段学习当中,让我看到了鸿蒙的愿景十分远大。不仅仅是能够代替安卓零碎,还能够将所有的智能设施连贯在一起,实现万物互联。

技术架构

我个人感觉,想学鸿蒙的话,次要依据这张技术架构图,应该就够了。剩下的所有相干常识无非就是依据这张技术架构图进行的扩大和补充。所以官网给出的这张技术架构图就是重中之重了。

鸿蒙零碎从下向上顺次分为:内核层、零碎服务层、架构层和应用层。这四层初看起来,跟隔壁的安卓零碎架构图十分像啊,但又齐全不一样。鸿蒙零碎性能能够依据理论须要,量身定制某些非必要的零碎性能和模块。

  • 内核层:内核层针对不同资源受限设施选用适宜的OS内核。说点人话就是,这一层提供了对立的内部拜访API。因为鸿蒙须要面对的设施终端泛滥,有Linux、LiteOS等。所以这一层将各个内容差别对立封装,裸露给内部的操作API接口却是对立的。我猜想也就是因为这一层等封装,才让鸿蒙能够完满兼容安卓零碎。不晓得鸿蒙可不可以开发苹果利用呢,前面学着看。
  • 零碎服务层:整个鸿蒙零碎的外围能力层。也就是包含多设施运行、平安、AI、电话、位置服务、穿戴设施啥的,都是这层干的活儿。我比拟感兴趣的是,其中提供了方舟运行时。因为没理解过方舟,前面独自整顿一下。
  • 框架层:提供了两套UI框架,Java UI框架和JS UI框架。也就说,针对JAVA程序员和JS程序员都能够上手UI界面。
  • 应用层:一个鸿蒙利用有多个FA或PA。FA有UI界面,提供用户交互的能力;PA提供后盾运行工作和数据拜访。这样做的益处就是,依据理论的业务须要,能够自由组合FA和PA,实现跨终端设备。

方舟编译器

浏览文档时,零碎服务层提供了方舟多语言运行时子系统。其中发现了如下这句话:

方舟运行时提供了C/C++/JS多语言运行时和根底的零碎类库,也为应用方舟编译器动态化的Java程序(即应用程序或框架层中应用Java语言开发的局部)提供运行时。

依照我的了解,这应该就是鸿蒙能够实现多语言开发的要害吧。而后从网上找了一篇文章,霎时明确了方舟编译器做的事件。

不论是晚期的电子管还是当初的半导体晶体管,这些计算的根本单位能辨认的只有电平的高下,在计算机中咱们就用0和1来示意。1和0的各种组合就是机器是能看懂的语言,也就是机器码。计算机的初期,人们就是用0和1来写成程序命令的,这种反人类的编码显然是程序员痛恨的,于是有了汇编语言,用字符来表示命令编码,这就不便了很多,然而大型程序仍然不可行,C\C++,JAVA等高级语言应运而生。能够说高级语言是为程序员设计的,也是为大型的软件工程设计的,因而逐渐诞生了面向对象编程的继承、多态以及回调、反射等机制,不论高级语言怎么变动,处理器可能辨认的都只是机器码,编译器就承当了这个翻译转化的角色,这也是方舟编译器要做的事儿。

当初的手机零碎iOS之所以比Android零碎更晦涩的一个起因,就是因为iOS没有像Android一样的虚拟机。Java之所以能够做到跨平台的起因尽管是因为有虚拟机,然而在手机操作系统上,虚拟机却连累了Android。虚拟机打包成的字节码尽管能够做到于机器硬件无关,然而当程序执行的时候,还是须要再次编译成机器码能力执行。也就是Java开发完的程序须要编译两次才能够执行,反观iOS则只须要一次。因为iOS有集成swiftc编译命令的Xcode工具。

鸿蒙比安卓会更晦涩的一个起因也是因为没有虚拟机,它采纳了和iOS一样的机制,生成安装包时间接编译成适合的机器码。

从下面的图中能够发现,安卓利用在运行前须要动态编译,而后在ART虚拟机中,还须要执行解析器解析代码。逐字解析之后,还须要JIT。这就产生了额定的开销。反观方舟编译器,在开发阶段,就曾经将其可执行文件进行了动态编译工作,剩下的只须要装置和运行即可。

方舟编译器除了去掉虚拟机,还实现了多语言联合开发。当初开发一款APP很少只应用到一种语言的,在开发利用时会应用到各种其余语言开发的库,比方C语言。不同语言之间也是须要通信、调用的。在安卓阵容中,采纳的是不同语言在独自的环境中,而后通过中间代码编译成机器码去执行。而且是当程序运行时。这样就会产生零碎额定的开销。

方舟编译器采纳的是,不同语言在开发环境中,就编译成一套可执行文件,而后在运行环境中执行。

总结来说,方舟编译器针对现有的安卓问题,采纳解决思路就是开发阶段解决。

  • 去掉虚拟机,在开发阶段就动态编译生成可执行文件。
  • 去掉JNI,在开发阶段提供对立的程序,而后生成可执行文件。

我感觉,通过这样的策略,对用户而言手机零碎APP必定是更快更晦涩了,因为所有的开销在开发阶段就解决的差不多了,那程序运行时天然是快的。这就让我想起了Xcode,当初光下载Xcode 12.5就须要11.7G的存储空间,我电脑中Xcode就占用了25G的存储空间。

利用基础知识

在开始学习之前,理解一下HarmonyOS利用的基础知识。HarmonyOS应用软件包由HAP(HarmonyOS App Package)和形容文件pack.info组成。一个HAP由代码、资源、三方库和配置文件组成。

一个App Pack的逻辑图如上图,这张图蕴含了很多信息:

  • entry:利用主模块,有且只有一个。也就是图中黄色的模块
  • feature:援用动静模块。能够有多个,甚至一个都没有。途中蓝色的模块
  • 每个App 都有一个用来形容HAP属性的文件,pack.info,图片中绿色局部。
  • 每个独自的hap模块都会有一个用来配置模块的配置文件,config.json。它是用来申明Ablitiy的。
  • libs中寄存利用的三方依赖代码,如so、jar等。
  • 资源文件包含图片、音频等,都寄存于resources中。
  • Ability是利用能力等封装,其中又由有UI界面等FA和无UI界面等PA组成。

HarmonyOS利用开发根底

华为开发者学院有一个人才打算,外面有一门课程HarmonyOS利用开发系列课(根底篇)。通过本课程的学习,开发者可能具备使用HarmonyOS顺利开发利用的能力。

接下来就是对这门课程进行学习,同时联合官网文档进行补充行学习。

首先依据官网文档给出的疾速入门创立一个能够实现页面跳转的小利用。

开发环境搭建

我的开发环境是MacOS,间接下载和装置DevEco Studio即可。同时DevEco Studio须要登录华为开发者账号,因为后续开发是须要应用到近程模拟器,所以必须得有华为开发者账号。

装置实现后,须要配置一下开发环境。依照官网给出的配置开发环境的办法,主动下载安装了最新版本的HarmonyOS SDK安装包。其中默认应用的是Java语言的SDK。因为还没开始学怎么用JS开发,我先不装置JS语言的SDK包。当初的版本曾经是2.1.1.20了,比文档下面要更新一些了。这个版本是2021年4月30日最新公布的一个版本。而且能够发现我的API Version曾经是5了,前面创立我的项目时,须要抉择的版本应该也是对应上的。

运行hello world

老规矩,新环境都会创立一个hello world,表明环境是否搭建胜利。

在创立我的项目时,我抉择的是API Version 5, 因为想体验最新的API。

要想应用模拟器,必须登录华为开发者账号。

登录账号后,抉择P40机型作为模拟器,而后运行代码到模拟器中。我运行完后果和文档下面给出的图片,有些出入。我界面当中的“Hello World”文字,并没有在垂直方向居中,而是定格在了最下面。然而也阐明了,开发环境搭建实现了。

用XML创立UI布局

在HarmonyOS中提供了Java UI框架,而Java UI框架又提供了两种布局形式:XML布局和代码布局。为撒HarmonyOS会提供xml布局形式呢?

我想这可能是架构者须要吸引局部Android开发者们,退出到鸿蒙零碎的开发当中来。提供多种不同的开发方式,帮忙鸿蒙零碎倒退和壮大。

文档这里并没有说怎么创立一个Button按钮或者Text文本,而是间接给出了一段代码。然而文档中给出了是采纳DependentLayout布局,而且给出了Text和Button组件的连贯地址。

我用DevEcoStudio创立的我的项目,依照文档提醒,关上ability_main.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?><DirectionalLayout    xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:height="match_parent"    ohos:width="match_parent"    ohos:orientation="vertical">    <Text        ohos:id="$+id:text_helloworld"        ohos:height="match_content"        ohos:width="match_content"        ohos:background_element="$graphic:background_ability_main"        ohos:layout_alignment="horizontal_center"        ohos:text="$string:mainability_HelloWorld"        ohos:text_size="50px"        /></DirectionalLayout>

比照了一下文档给出代码,发现布局形式不一样,我这里应用的是DirectionalLayout形式布局,而文档应用的是DependentLayout形式布局。

依照文档给出的步骤开始后,又发现一个问题,每次运行模拟器都须要重新安装利用,从新运行利用才行,如同没有相似Flutter一样的热更新。

起初发现应用文档中提到的预览器能够解决实时预览界面成果的问题。

最初我调整的代码如下:

<?xml version="1.0" encoding="utf-8"?><DirectionalLayout    xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:height="match_parent"    ohos:width="match_parent"    ohos:orientation="vertical">    <Text        ohos:id="$+id:text_helloworld"        ohos:height="match_content"        ohos:width="match_content"        ohos:background_element="$graphic:background_ability_main"        ohos:layout_alignment="horizontal_center"        ohos:text="$string:mainability_HelloWorld"        ohos:text_size="50px"        />    <Button        ohos:id="$+id:button"        ohos:width="match_content"        ohos:height="match_content"        ohos:text="Next"        ohos:text_size="19fp"        ohos:text_color="#FFFFFF"        ohos:top_padding="8vp"        ohos:bottom_padding="8vp"        ohos:right_padding="70vp"        ohos:left_padding="70vp"        ohos:center_in_parent="true"        ohos:layout_alignment="horizontal_center"        ohos:below="$id:text_helloworld"        ohos:margin="10vp"        ohos:background_element="$graphic:background_button"/></DirectionalLayout>

因为是拷贝的官网文档代码,然而须要调整的中央为:

  • Button按钮的below属性,应该为Text的id属性。我查了一下手册,临时没有找到这个属性是干什么用的。
  • 我拷贝的代码过去当前,发现按钮没有程度居中,增加了一行ohos:layout_alignment="horizontal_center"
  • 运行的后果图看,文字和按钮并没有垂直方向居中。阐明组件的某些属性没有调整对,看来后续还得调整一下。

用代码创立UI布局

用代码创立UI布局就是在Java文件中,编写布局代码。间接拷贝文档给出的代码即可。

这次运行的成果跟文档下面统一了。而后有几处留神点

  • 拷贝的Java代码,应用的是DependentLayout布局形式。这应该就是导致第一个页面没有垂直居中的起因。
  • java代码也同样反对实时预览性能。在java代码中,间接运行预览即可。

至此文档上的疾速入门手册就运行胜利了。尽管代码全是拷贝,也并不知道其中的概念。所以还须要进一步学习。

拿到证书

把握了下面这些基础知识后,再去学习华为给出的课程就非常简单了。认真看一遍官网给出的视频介绍,而后听听每节课前面的答疑,最初做做每节课的考核。全都实现之后,只须要做一份毕业考试题,就能够了。

这是我第一次线上学习带有华为认证的课程,而且明天刚好是6月1儿童节,心愿本人每天都仍然充斥童心查看学习上来✌️✌️✌️。

这个证书其实就是证实有了一个对HarmonyOS根底的意识而已。离真正能开发HarmonyOS利用的能力还差不少间隔,后续还须要持续致力。