鸿蒙Harmony谈了这么久,和Android到底啥区别?
作者:互联网
国产操作系统鸿蒙代码终于开源,IDE也一并公开。迫不及待地安装了IDE并尝了鲜。
将按照鸿蒙OS介绍,IDE介绍,安装及运行,项目构成,APP基本组件,APP可执行文件这几个方面来讲述我自己的开发体验。
HarmonyOS
基于微内核的跨平台分布式操作系统,最新为2.0。不再停留在PPT上,公开了源码和IDE。
官方的资料我一并罗列下来。
鸿蒙OS的官方介绍:
鸿蒙OS在gitee上的主页:
内核源码的地址:
华为开发者论坛:
IDE DevEco Studio
为鸿蒙OS开发的IDE名叫DevEco Studio,基于IntelliJ IDEA Community开源版本打造。界面及开发流程和Android Studio基本一致,极易上手。
下载地址:
官网文档:
DevEco Studio安装及运行
exe下载下来之后双击可以看到配置页面。
选择其他安装目录或默认选项,然后进入启动页面。
十来分钟之后将提示是否下载SDK,选择”接受“继续。
下载成功之后将进入创建项目画面,选择“创建鸿蒙OS项目”继续。
接下来需要选择运行的硬件设备类型,目前支持电视,手表和穿戴设备三种设备类型。也可以看到预设的画面布局,以及开发语言,目前支持JS和JAVA两种开发语言。我们选择“TV”设备,空画面+JAVA开发方式,继续。
当然需要设置项目名称,包名及位置等信息,我们采用“HMApp”名称继续。
配置好之后将进入IDE主界面,并自动下载gradle等依赖包。
gradle下载及配置完毕之后,我们安装下鸿蒙OS模拟器,暂时没有本地的模拟器,只能使用远程的模拟器,需要下载Resources模块和网站登录。我们点击Tools->HVD Manager在打开模拟器设备列表的时候将自动下载Resources模块。
这里必须要提一句,下载Resources模块非常容易遇到如下的失败,很多开发者都遇到。
解决办法很多,没有特别稳妥的方案。比如重启电脑,重启IDE,重装IDE,删除IDE的缓存目录,华为开发者账号注册成功十分钟之后再试等等。反正多试几次终究能成功。
下载成功之后还需要登录华为开发者账号,才可以启动远程模拟器。IDE将自行启动默认浏览器验证账号。在登录成功之后需要“允许”,将看到登录成功的提示。
这之后我们返回IDE,将看到底部的“login success”的提示。然后我们就可以在HVD Manager列表里启动模拟器。
接着运行我们的代码,可以看到成功部署到了远程模拟器上。
项目构成
我们看一下鸿蒙APP的项目构成,并和Android Studio进行对比。
通过仔细对比,发现结构大体是类似的,在主体代码逻辑模块有着明细区别。
1,DevEco将配置清单格式由xml改为json,可能解析起来更为高效。
2,将资源文件分类为存放媒体资源的media目录,存放字符内容的element目录以及存放预设资源的rawfile目录。相比Android原生的资源目录分类更加简洁明了。只是资源文件的尺寸适配,版本适配,国际化适配需要怎么区分开来呢?
3,源文件的几大组件的实现类改了,名字看起来都有些相似,需要看源码才能辨别。
APP基本组件
官方的API说明:
为了搞清楚APP基本组件和Android的区别,我们需要查看源码的实现。我将总结出来的鸿蒙OS的APP组件大致的类图贴出来。
Android原生的Application,Activity及Service三者的类图也一并贴上。
可以看到鸿蒙OS的Ability,AbilitySlice和AbilityPackage组件都继承自同一个父类AbilityContext。而且Context并不像Android,而是个接口。
具体到方法API的区别总结一下,初步感觉是这样的。
可以看到大部分API都是类似的,只是名称上的细微差别,说明组件的设计思路基本一致。但是我们也看到鸿蒙OS出现了一些Android并不存在的API。
比如Ability提供了停止Ability的stopAbility(),设置是否支持侧滑消失的setSwipeToDismiss(),设置路由主入口的setMainRoute(),用来指定先启动的AbilitySlide实例。
比如AbilitySlice提供了开启,停止和获取Ability实例的startAbility(),stopAbility()和getAbility(),同时还提供了设置UI视图的setUIContent()。
AbilitySlice可以直接展示视图,而Android的Service不可以直接展示视图,需要依赖WindowManager去添加Window。再结合官网API的说明,我们可以断定鸿蒙OS的AbilitySlice并不同于Android的Service,它只是Ability的UI展示的一个补充,一个部分而已,更像是Fragment。上述表格的对比维度并不准确,不能直接将AbilitySlice和Service进行对比。
我们还发现一个细节,Ability和AbilitySlice在提供了onConfigurationUpdated()以外都提供了监听屏幕方向变化的onOrientationChanged()。为何将屏幕方向的变化单独处理,比较微妙。
上述表格并未展示的一点是,Ability和AbilitySlice都提供了connectAbility(Intent intent, IAbilityConnection conn)和disconnectAbility(IAbilityConnection conn)去绑定和解绑Ability。但是只有Ability提供了onConnect(Intent intent)和onDisconnect(Intent intent)去处理绑定和解绑的回调。
可以知道AbilitySlice也可以参与绑定组件但只有它依附的Ability可以处理绑定和解绑的回调。
可以发现这和Android完全不一样,Android是Activity通过bindService()和unbindService()去绑定和解绑Service,Service提供了onBind()和onUnbind()去处理绑定和解绑请求。
总结来说,
Android上活动和服务是两个不一样的概念,活动提供和用户交互的UI,服务提供后台任务的执行。活动可以启动和停止服务,也可以绑定,远程调度和解绑服务。他们两者的实现类也是分开的。
而鸿蒙OS则将活动和服务整合,统称为抽象的"能力",由实现类Ability来统一管理。需要展示UI交互的时候,它就是活动;需要执行后台任务的话它就是服务。当然,因为是Ability的缘故,服务拥有了在需要交互时直接展示UI的便利。
必须指出的一点是,虽然将前台活动和后台服务进行整合是个好想法,但很多概念容易混淆,进而导致生命周期的管理混乱。在开发的过程中也极易出错。尤其对于习惯了Activity和Service两大概念的Android开发者来说,需要好好适应一下。。。
APP可执行文件
鸿蒙OS编译出来的应用程序格式为hap,全称是harmony application package?和APK一样也是压缩包,改名之后解压下来如图。有一个同名的APK文件。。。
和一般APK的内容DIFF一下。
我们再把APK文件解压下来和一般的APK对比一下,结构和名称完全一致。
HAP文件内置APK文件当然是为了兼容Android系统,便于系统生态的营造。
具体怎么兼容?我猜想有两个可能性。
1,鸿蒙OS底层仍然是像Android一样,暂时通过PMS和PackageInstaller解析和安装APK文件。所以内置了APK文件,外部的json只是额外配置和补充。
2,鸿蒙OS完全有自己的HAP格式解析和安装流程。这个HAP里内置的APK是为了方便HAP能安装和运行到Android OS上去的。这样可以方便鸿蒙开发者开发的APP可以不用修改代码直接运行到Android设备上。具体怎么实现呢,比如HMS的App Gallery分发HAP格式到手机里的时候,可以自动解压出来APK到手机上,然后执行和APK一样的流程。
从IDE的安装和使用来看,目前还有很多需要优化的地方。
比如每次启动HVD都需要登录,比如运行APP的日志从出不来,比如没有体用本地模拟器等等。
罗马也不是一天建成的,我们需要保持积极的心态去尝试和反馈,给华为开发者一些时间。这样大家才能不断进步。
鸿蒙OS的IDE,组件设计,以及可执行文件构成,和Android有着相似之处却又有差异频频。
这种貌合神离的方式既能在生态营造上取巧,又能树立自己的风格,无奈之中透着倔强。
到底孰优孰劣尚无法评判,只能把问题交给时间和用户。
此刻我只想祝愿鸿蒙OS越来越好!