在上一次https://www.cnblogs.com/webor2006/p/14861199.html已经对于HarmonyOS有了一个基本的认识,其中对于它的开发环境也已经搭建好了,不过这里再对“为什么要学习HarmonyOS”这个话题先再啰嗦一下。
对于这么一个系统,对其其它的一个竞争对手厂家来说肯定也是感兴趣的,但是对于这些厂商来说你觉得会放心去使用一个华为竞争对手的产品么?华为为了打消其它厂商的顾虑,华为成立了开源基金会,这样其它的厂商就可以参考进来,就会公平的使用HarmonyOS了,在2020年9月10日OpenHarmony(开放原子开源基金云https://www.openharmony.cn/)开源了HarmonyOS 2.0,而OpenHarmony的一个开源路标是这样的:
随着HarmonyOS逐步开源,其对软件行业的影响也只有越来越大的,所以做为开发者提前了解它也是非常有必要的。
这里强调的是“快速上手”,因为可以建立起一个自信心,当然你也可以上官网一点点去学习,但是效率会比较慢,所以这里看一下要想快速上手,则可分为以下几个步骤。
这里少了一个数据保存相关的知识对吧,是因为暂时先不了解它,因为对于这个快速系列最终的项目不涉及到数据库相关的技术,所以这里先略过。
这里的快速上手项目是应用在一个穿戴的手表上的,具体的效果如下:
那为啥不以手机APP为例呢?其实以什么平台运行不是重点,因为华为HarmonyOS的理念就是编写一次代码多平台运行,
关于这个特点在未来的学习中再来体会,而对于学习知识点来说没任何的影响,所以,这块不用太过纠结平台,目前入门以能学知识为主。
关于这块可以参考官网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,之后可能还会开发有其它的一些内核子系统,既然未来会不断扩展多个子内核系统,那么肯定需要将行为进行抽象吧,不然不好管理,于是乎就有它出现了:
这样在上层调用时就不用管具体是用的啥内核了,扩展性非常强。其截一个官方视频的说明,大概就能感知这个内核层的强大:
另外还有一个驱动子系统:
然后上一层就是系统服务层了,其中可以看到,原来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的整体架构有了整体认识之后,接下来来类比一下Android的架构:
对于它俩的区别,说两点:
1、整体看,都基于了Linux内核进行设计的,不过HarmonyOS是基于微内核,难度更大,但是更加稳定,这个在华为开发者大会上也曾提及过,Android的内核代码有1亿多行,而HarmonyOS也就二千多行,所以Android很难保证不同设备的流畅度。
2、HarmonyOS相比Android是采用了一个分布式架构,这也是首次在移动端使用了分布式架构,对于这样的架构的好处就是就可以无缝的切换终端协同的体验,开发者可以像开发同一端设备一样开发跨终端的分布式应用,这点听着也挺牛的!!!
先来看一下官网给的一张图:
HarmonyOS有两个不同类型的构建产物:
一个HAP在工程目录中对应一个Module,它是由代码、资源、第三方库及应用清单文件组成,可以分为Entry和Feature两种类型:
采用Java开发的HarmonyOS的工程目录结构和Android有些类似,都包含:
其对照关系表如下:
而HarmonryOS的JS的目录结构如下:
对于Android开发的人伙伴应该都知道它最终打出来的包是个apk,那么对于HarmonyOS应用它的安装包到底是什么呢?
采用HarmonyOS开发的应用会被构建成.hap,hap是由代码、资源、第三方库及应用配置文件组成的模块包。不同的hap可以被部署到不同类型的设备上,那hap的内部结构又是怎样子的呢? 咱们以上一次用到的一个工程为例,在编译之后会生成一个.hap的安装包,如下:
然后它不像Android studio能直接双击就能在DevEco-Studio查看.hap中的内容,此时咱们需要将.hap更改成一个apk,然后用Android Studio打开看一下:
其中看到.apk木有,它就是为了兼容Android app而生的:
项目中的静态资源会被归档在该目录下,里面主要存放的是项目entry/resources/目录下的文件:
对应apk中的res与resources.arsc的集合:
项目中的Java代码对应的构建产物,它是由多个.class文件处理后的产物:
对应apk中的.dex:
项目构建出的用于在Android设备上运行的产物,HarmonyOS开发出的应用能够兼容Android的奥秘也就是因为有它的存在。
项目的配置文件,用于声明应用的Ability,以及应用所需权限信息,详见应用配置文件,对应apk中的AndroidManifest.xml:
android的清单文件是manifest.xml对吧,而harmonyOS则是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"三个部分组成,缺一不可:
2、vendor:开发商的描述,可以缺省,在Apk中的清单中没有对应的。
3、version:app的版本信息,对应清单中的版本信息:
4、apiVersion:对应于清单中的minsdkverison和targetsdkversion:
类似于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:启动模式。
<?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需要的技术栈这里看一个图: