为什么要学习HarmonyOS?
在上一次https://www.cnblogs.com/webor2006/p/14861199.html已经对于HarmonyOS有了一个基本的认识,其中对于它的开发环境也已经搭建好了,不过这里再对“为什么要学习HarmonyOS”这个话题先再啰嗦一下。
HarmonyOS对软件开发行业的影响:
- 一个面向全场景的分布式微内核的操作系统;
其中啥叫“微内核”呢?相比基于Linux(宏内核)的Android操作系统,基于微内核的HarmonyOS,更安全,更稳定,可维护性更好,其中宏内核和微内核的区别在于:
1、宏内核是把很多功能都放在了内核当中了,往往要在Linux增加一个设备需要重新编译一下内核,不像window驱动既插既用,因为Linux将很多驱动都做在了内核当中了;
2、而微内核就比较小,它只把关键的部分(如任务调度、内存管理等)放在了内核中,而像设备的管理、图片管理之类的都是放在了内核之外了,那么带来的好处除了内核小之外,还更加安全,因为内核是稳定的,不稳定的基本都是在内核之外。
其中华为对于全场景的定义为:
- 华为生态中有来自全球的180万开发者;
- HarmonyOS有望成为全球第三大移动应用生态;
对于这么一个系统,对其其它的一个竞争对手厂家来说肯定也是感兴趣的,但是对于这些厂商来说你觉得会放心去使用一个华为竞争对手的产品么?华为为了打消其它厂商的顾虑,华为成立了开源基金会,这样其它的厂商就可以参考进来,就会公平的使用HarmonyOS了,在2020年9月10日OpenHarmony(开放原子开源基金云https://www.openharmony.cn/)开源了HarmonyOS 2.0,而OpenHarmony的一个开源路标是这样的:
- 2020年9月10日:面向内存128KB~128MB终端设备;
- 2021年4月:面向内存128MB~4GB终端设备;
- 2021年10月:面向4GB以上所有设备;
随着HarmonyOS逐步开源,其对软件行业的影响也只有越来越大的,所以做为开发者提前了解它也是非常有必要的。
HarmonyOS开发者的影响:
对终端开发者的影响:
- HarmonyOS天生支持IOT:
啥叫IOT:
- HarmonyOS不仅可以开发手机应用而且可以开发应用于物联网的智能终端应用;
- 终端开发者可以通过HarmonyOS来开发智能物联网的软件,并将其应用到智能设备上【对于未来各大智能硬件的公司肯定都会拥抱HarmonyOS的】;
- 终端开发者可以通过HarmonyOS来拓宽就业场景;
对非移动端开发者的影响:
- 对于HarmonyOS来讲无论是Android开发者、IOS开发者还是前端或后端开发者,大家都是零基础,起跑线一样;
- 非移动端开发者可以借助HarmonyOS来快速上手移动端开发实现弯道超车;
为什么要学习HarmonyOS?
- 学习门槛低,因为支持Java和JS语言进行开发。
- 应用场景广:
1、手机所需软件;
2、TV所需软件;
3、穿戴设备所需软件;
4、智能家居所需软件;
5、车载软件;
6、... - 对新技术保持敏感
- 为未来布局
如何能快速上手?
这里强调的是“快速上手”,因为可以建立起一个自信心,当然你也可以上官网一点点去学习,但是效率会比较慢,所以这里看一下要想快速上手,则可分为以下几个步骤。
对HamonyOS有个整体的认识:
- 架构了解
- 和其它系统的异同(系统层面、包的结构、开发方式的异同等)
- 利用现有的知识进行类比学习(比如你已经掌握了Android开发,则可以用它进行类比)
- 搭建开发环境(这块咱们在上一次已经搞定了)
- 开发工具使用技巧
掌握HamonyOS开发的必备基础:
- 掌握布局知识
由于HamonyOS的开发方式有两种,一种是使用Java语言,另一种是使用JS语言,所以其布局知识就得分别进行掌握了。 - 掌握页面和应用生命周期
- 掌握页面跳转和传参
- 调试技巧
掌握HamonyOS进阶知识:
- 如何自定义列表?
- 掌握多线程与并发
- 掌握JSON解析技巧
- 掌握HamonyOS网络通信基础
- 构建和打包
这里少了一个数据保存相关的知识对吧,是因为暂时先不了解它,因为对于这个快速系列最终的项目不涉及到数据库相关的技术,所以这里先略过。
通过一个小项目进行实战巩固:
这里的快速上手项目是应用在一个穿戴的手表上的,具体的效果如下:
那为啥不以手机APP为例呢?其实以什么平台运行不是重点,因为华为HarmonyOS的理念就是编写一次代码多平台运行,
关于这个特点在未来的学习中再来体会,而对于学习知识点来说没任何的影响,所以,这块不用太过纠结平台,目前入门以能学知识为主。
HarmonyOS架构解析:
鸿蒙OS技术架构:
关于这块可以参考官网https://developer.harmonyos.com/cn/docs/documentation/doc-guides/harmonyos-overview-0000000000011903,这里简单再梳理一下,先把官方的架构图给贴出来:
而对于整个架构最清晰的了解可以参考官方给的这个视频:https://developer.huawei.com/consumer/cn/training/detail/101605600905237027,反正我看完之后真的是感觉好强大。。
其中可以看到,相比Linux系统架构而言,这里多了一个第二层:系统服务层,这一层之前是集成在Linux内核层的,这也体现了Harmonyos中的微内核。
内核层:
目前有两个内核子系统:
- Linux Kernel:为了兼容Android APP
- LiteOS:为物联网硬件设备而生的内核
目前使用的是Linux Kernel,之后可能还会开发有其它的一些内核子系统,既然未来会不断扩展多个子内核系统,那么肯定需要将行为进行抽象吧,不然不好管理,于是乎就有它出现了:
这样在上层调用时就不用管具体是用的啥内核了,扩展性非常强。其截一个官方视频的说明,大概就能感知这个内核层的强大:
另外还有一个驱动子系统:
系统服务层:
然后上一层就是系统服务层了,其中可以看到,原来Linux内核层的一些东西就抽出来了:
其中还有一个很新颖的东东:“方舟多语言运行时子系统”,它是干嘛用的呢?它是可以跟方舟编译器结合起来用的,我们知道Java它不是直接生成机器指令在硬件上来运行,而是生成一个字节码在JVM中来运行,其性能就远不如机器指令的运行效率了,当然Android后来也做了一些相关的优化,比如引入了Android ART虚拟机,但是对于一些功能比如任务调度还是得借助于内核来完成,所以其性能效果也不尽如人意,但是对于这个方舟编译器,简单来说就是它可以把不同的编程语言(java、js、c、c++),都能用方舟编译器将其生成机器指令,直接在操作系统的内核层来直接运行,性能大大提升。
框架层:
这也是咱们写应用程序需要使用的框架。
用户程序框架:是管理整个应用执行流程的,比如应用的载入,资源的回收等;
UI框架:这里就有两套,一套是针对Java,一套是针对JS的;
Ability框架:这个是Harmonyos非常关键的概念,字面意思是“能力”的意思,其实做应用开发就是给设备赋予某种能力,所以这个框架就表达了一个应用程序所具备的功能。
有了这三个框架,咱们就可以基于它们来构建上层应用了。
应用层:
它是构建以FA(Feature Ability)/PA(Particle Ability)为基础组成的应用(包括系统应用和三方应用):
这里的FA和PA是HarmonyOS应用的基本组成单元,能够实现特定的业务功能,所以一个HarmonyOS的应用程序的组成元素可以为:
也就是一个应用可以包含一个或多个FA/PA,FA是有UI界面的(类似于Android中的Activity),而PA是无UI界面的(类似于Android中的Service),这里拿一个视频通话应用为例:
"视频通话主界面FA(Entry FA)":提供UI界面以便于用户交互;
然后三个PA为应用提供不同的处理能力,而比较屌的功能来了:FA/PA是可以按需下载、加载和运行,其中:
基于FA/PA构建的新型应用生态,能够实现三方服务跨设备智能分发,提供一致、高效的用户体验,这里还是以视频通话app为例:
对于手机平台而言,则会下载所有FA/PA:
但是!!!对于智慧屏平台来说,如果该平台不支持视频美颜和超级夜景能力的话,那么只会按需下载一个PA了:
是不是有一点像Android App Bundle的思想呢?
鸿蒙OS技术架构 VS Android架构:
上面对于鸿蒙OS的整体架构有了整体认识之后,接下来来类比一下Android的架构:
对于它俩的区别,说两点:
1、整体看,都基于了Linux内核进行设计的,不过HarmonyOS是基于微内核,难度更大,但是更加稳定,这个在华为开发者大会上也曾提及过,Android的内核代码有1亿多行,而HarmonyOS也就二千多行,所以Android很难保证不同设备的流畅度。
2、HarmonyOS相比Android是采用了一个分布式架构,这也是首次在移动端使用了分布式架构,对于这样的架构的好处就是就可以无缝的切换终端协同的体验,开发者可以像开发同一端设备一样开发跨终端的分布式应用,这点听着也挺牛的!!!
HarmonyOS和Android深度对比:
HarmonyOS APP工程结构:
先来看一下官网给的一张图:
HarmonyOS有两个不同类型的构建产物:
- App Pack:Application Package,简称APP,是Harmony OS应用的发布形态,它是由一个或多个HAP(Harmony OS Ability Package)包以及描述APP Pack属性的pack.info文件组成;
- HAP:是Ability的部署包,Harmony OS应用代码围绕Ability组件展开,它是由一个或多个Ability组成;
一个HAP在工程目录中对应一个Module,它是由代码、资源、第三方库及应用清单文件组成,可以分为Entry和Feature两种类型:
- Entry:应用的主模块,一个APP中,对于同一设备类型必须有且只有一个entry类型的Hap,可独立安装运行;
- Feature:应用的动态特性模块,一个APP可以包含一个或多个feature类型的HAP,也可以不含;
工程目录结构对比:
采用Java开发的HarmonyOS的工程目录结构和Android有些类似,都包含:
其对照关系表如下:
而HarmonryOS的JS的目录结构如下:
- pages目录:pages文件夹下可以包含1个或多个页面,每个页面都需要创建一个文件夹(如图中的index)。页面文件夹下主要包含3种文件类型:css、js和html文件。
1、pages > index > index.html文件:html文件定义了页面的布局结构,使用到的组件,以及这些组件的层级关系。
2、pages > index > index.css文件:css文件定义了页面的样式和布局,包含样式选择器和各种样式属性等。
3、pages > index > index.js文件:js文件描述了页面的行为逻辑,此文件里定义了页面里所用到的所有的逻辑关系,比如数据,事件等。 - app.js文件:全局的JavaScript逻辑文件和应用的生命周期管理。
安装包内部对比:
对于Android开发的人伙伴应该都知道它最终打出来的包是个apk,那么对于HarmonyOS应用它的安装包到底是什么呢?
采用HarmonyOS开发的应用会被构建成.hap,hap是由代码、资源、第三方库及应用配置文件组成的模块包。不同的hap可以被部署到不同类型的设备上,那hap的内部结构又是怎样子的呢? 咱们以上一次用到的一个工程为例,在编译之后会生成一个.hap的安装包,如下:
然后它不像Android studio能直接双击就能在DevEco-Studio查看.hap中的内容,此时咱们需要将.hap更改成一个apk,然后用Android Studio打开看一下:
其中看到.apk木有,它就是为了兼容Android app而生的:
asserts:
项目中的静态资源会被归档在该目录下,里面主要存放的是项目entry/resources/目录下的文件:
对应apk中的res与resources.arsc的集合:
classes.dex:
项目中的Java代码对应的构建产物,它是由多个.class文件处理后的产物:
对应apk中的.dex:
entry_debug_singed_entry.apk:
项目构建出的用于在Android设备上运行的产物,HarmonyOS开发出的应用能够兼容Android的奥秘也就是因为有它的存在。
config.json:
项目的配置文件,用于声明应用的Ability,以及应用所需权限信息,详见应用配置文件,对应apk中的AndroidManifest.xml:
清单文件对比:
android的清单文件是manifest.xml对吧,而harmonyOS则是config.json:那咱们以同一款应用对比一下它们之间的差异:
config.json:
{ "app": { "apiVersion": { "compatible": 4, "releaseType": "Release", "target": 5 }, "vendor": "example", "bundleName": "com.example.helloworldwithjava", "version": { "code": 1000000, "name": "1.0.0" } }, "deviceConfig": { }, "module": { "abilities": [ { "iconId": 16777219, "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] } ], "orientation": "unspecified", "descriptionId": 16777218, "labelId": 16777216, "icon": "$media:icon", "name": "com.example.helloworldwithjava.MainAbility", "description": "$string:mainability_description", "label": "$string:entry_MainAbility", "type": "page", "homeAbility": true, "launchType": "standard" } ], "deviceType": [ "phone" ], "mainAbility": "com.example.helloworldwithjava.MainAbility", "distro": { "moduleType": "entry", "installationFree": true, "deliveryWithInstall": true, "moduleName": "entry" }, "package": "com.example.helloworldwithjava", "name": ".MyApplication" } }
可以看到它是由"app"、"deviceConfig"、"module"三个部分组成,缺一不可:
- app:表示应用的全局配置信息,同一个应用的不同HAP包的“app”配置必须保持一致;
1、bundleName:对应清单中的package,应用的包名:2、vendor:开发商的描述,可以缺省,在Apk中的清单中没有对应的。
3、version:app的版本信息,对应清单中的版本信息:
4、apiVersion:对应于清单中的minsdkverison和targetsdkversion:
- deviceConfig:表示应用在具体设备上的配置信息;
- module:表示HAP包的配置信息。该标签下的配置只对当前HAP包生效;
1、package:类似于Android module中的包名。
2、name:对应于Android中的Application的名字:3、reqCapabilities:表示要求设备提供的能力:
4、reqPermissions:表示申请的权限,对应的Android清单中的use-permission
5、deviceType:表示允许Ability所运行的设备类型,因为华为的HarmonyOS是运行在全场景下的:
6、distro:是创建应用时系统为咱们生成的,不可缺省,是hap发布应用时的描述。
7、abilities:表示每个ability的信息描述,里面接受一个数组,类似于Android清单中Activity的配置:
这里对关键属性进行一个说明:orientation:支持横竖屏
icon:应用对应的icon,看一下它引用图片的用法,跟Android有一点区别:type:表示Ability的类型,page表示有界面的,service表示*面的,data类似于Android的ContentProvider
launchType:启动模式。
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1000000" android:versionName="1.0.0" android:compileSdkVersion="29" android:compileSdkVersionCodename="10" package="com.example.helloworldwithjava" platformBuildVersionCode="29" platformBuildVersionName="10"> <uses-feature android:name="zidane.software.ability" android:required="false" /> <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="29" /> <application android:label="@ref/0x7f020000" android:icon="@ref/0x7f010000" android:name="com.example.helloworldwithjava.ShellMyApplication" android:persistent="false" android:debuggable="true" android:allowBackup="false" android:usesCleartextTraffic="false" android:directBootAware="false"> <meta-data android:name="permZA" android:value="true" /> <activity android:label="@ref/0x7f020000" android:icon="@ref/0x7f010000" android:name="com.example.helloworldwithjava.MainAbilityShellActivity" android:exported="true" android:launchMode="0" android:screenOrientation="-1" /> </application> </manifest>
HarmonyOS需要的技术栈:
对于开发HarmonyOS需要的技术栈这里看一个图: