由于要验证个人几个应用可否移植到鸿蒙,仔细看了下鸿蒙,固然做为开发者,确定要从开发环境看起。java
鸿蒙OS的开发工具叫作DevEco Studio,和Android Studio同样,也是基于IDEA。程序员
由于构建工具是gradle,因此天然在命令行用gradlew assembleDebug试了一下,果真开始编译了:shell
看下输出文件:json
39k的hap文件,这就是一个纯粹的鸿蒙应用,对应安卓的apk,这是没有签名的debug版本,用7zip打开这个hap文件看看:服务器
这几个文件都能理解,安卓的manifest文件变成了config.json。但让我没想到的是,这里竟然包了一个apk文件。试着把这个apk解出来,再用7zip打开,还真是个标准apk网络
既然是apk,天然放到普通安卓手机上试一下咯,安装没有问题,图标也看到了,点开...闪退,用adb看一下日志:app
04-09 15:12:53.334 7450 7450 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "ohos.abilityshell.HarmonyApplication" on path: DexPathList[[zip file "/data/app/com.example.hello_hm-THrK3d5xftGaJlBnx92w_A==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.hello_hm-THrK3d5xftGaJlBnx92w_A==/lib/arm64, /system/lib64, /product/lib64]] 04-09 15:12:53.334 7450 7450 E AndroidRuntime: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230) 04-09 15:12:53.334 7450 7450 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:379) 04-09 15:12:53.334 7450 7450 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:312) 04-09 15:12:53.334 7450 7450 E AndroidRuntime: ... 16 more
ClassNotFound,看来这个apk是不能跑在纯安卓上的,只能跑在鸿蒙上,那这个apk是什么意思? 也许是为了鸿蒙的底层是安卓时,能够跑这个apk达到让底层安卓管理鸿蒙应用的目的吧,反过来也就是说,若是哪一天鸿蒙彻底脱离安卓,天然就不须要这个apk了,这只是个人想法,用adb验证一下。工具
能够看到,经过adb shell能够看到这个鸿蒙应用,用dumpsys能够看到当前的Activity叫作MainAbilityShellActivity,但这是咱们代码里没有的东西,从哪里来的?应该就是上面这个自动生成的apk跑出来的。布局
引用一下官方文档,鸿蒙应用是由一个或多个HAP(HarmonyOS Ability Package)包以及属性文件pack.info文件组成。这点和安卓不一样,安卓一个应用是一个apk。性能
HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开,它是由一个或多个Ability组成。Ability分为两种类型:FA(Feature Ability,中文名称:元程序)和PA(Particle Ability,中文名称:元服务)。FA/PA是应用的基本组成单元,可以实现特定的业务功能。FA有UI界面,而PA无UI界面。
官方语言挺绕口,个人理解,Ability就是组件,FA对应安卓的Activity,PA对应安卓Service。Ability加上资源文件打包起来就是hap,对应安卓的apk。
我没有运行鸿蒙的真机,只能选择模拟器运行,这个模拟器是云加载的,须要先验证华为开发者帐号,而后就能够看到了:
四种模拟器,表明四种设备类型,我要验证个人手机应用,天然就选了P40,启动很快,也不占用本地内存,很好。点击IDE里的调试,就能够运行到模拟器中了。模拟器上有个倒计时,应该是云端模拟器不能占用太长的时间,超时会被释放。
尝试了一下调试,怎么也设置不了断点,按照文档作了各类设置都不行,只好去华为开发者网站提交一个问题,很快次日收到了回复,问题修复并提供了升级包下载。同时看了一下华为的文档,若是要真机调试,须要先申请调试证书,并配置签名信息,也就是说,估计华为的签名策略会收紧,向苹果看齐,将来鸿蒙的应用市场可能只有官方一家。
个人几个应用虽然是普通安卓应用,但因为都用到了比较多的安卓服务和硬件特性,应该能比较能说明鸿蒙的兼容性,在看个人App以前,先看下这个模拟器的版本,后面兼容性测试都是基于这个版本。
先来看碎片记忆,这个应用使用了悬浮窗和桌面小部件,用adb安装一下,没有问题,运行并导入词库,碎片记忆的悬浮窗已经跑起来了。
再想试试桌面小部件,但是云端模拟器不支持长按桌面加小部件,只支持双指捏合,这应该是EMUI11的一个改动,在云端模拟器,没办法触发双指,因此暂时还看不到小部件的支持状况。
再试试隐秘参数,这是一个硬件检测和性能测试工具,使用了不少安卓底层的API,在安装以前我是有点怀疑它可否正常运行的,但实际状况是:
不只正常运行,还竟然测出了显示屏和触控厂商,这在纯安卓版的P40上都测不出的,兼容性看起来没什么问题。性能部分就有意思了,SOC跑分急剧下降,显示刷新率20hz,内存、存储性能所有降低的厉害,按道理,若是只是远程真机,不该该下降性能,只是有网络延迟,因此估计是模拟器致使的,彷佛是一个跑在P40物理机上的虚拟机。
最后看下微动手势,这个一个须要无障碍服务和陀螺仪传感器才能工做的的手势工具。
配置无障碍服务没有问题,但惋惜由于在云端,没办法触发陀螺仪手势,看来这个只能经过真机才能验证了。但从几个应用总体来看,当前鸿蒙在兼容apk方面没什么问题。
回头再来看下鸿蒙工程文件,整个工程有些部分和安卓仍是类似的,这对于安卓程序员来讲比较友好,能够快速上手,有一些概念也能够相互对照:
安卓 | 鸿蒙 | |
---|---|---|
项目配置 | AndroidManifest.xml | config.json |
应用标识 | package | bundle |
字符资源 | strings.xml | string.json |
调试shell | adb | hdc |
gradle配置 | build.gradle | build.gradle |
看一下项目的布局文件和源码,UI部分代码须要彻底重写了,不可能兼容安卓的Layout和控件了,大部分的API都不一致了,只是有些在安卓中能够找到一个依稀的影子,但接口都是不同的。
这说明了一个问题,若是不是以安卓兼容模式运行,现有的安卓应用要想移植到鸿蒙,工做量仍是很大的,基本上须要彻底重写。
整个上手的感受仍是不错,IDE、文档、模拟器都挺顺畅的,hello-world对原安卓开发人员也保持了刚好的“熟悉”,这已经很是不错了,做为常常评估各类奇奇怪怪系统的开发者,一半以上的系统都是由于不成熟的hello-world把我吓退的,这一点鸿蒙已经有一个好的起点。
在兼容性方面,看起来不用太担忧,如今的鸿蒙由于自带安卓,能够运行apk,起码从个人几个App来看,除了没法验证的几个地方,都没有问题,固然将来若是鸿蒙剥离安卓,那就要考验第三方的跟进度了,目前看,应用须要重写才能兼容鸿蒙。