最后一次更新
12月开源前应该不会再更新了,更正一下,基于LiteOS内核是没有java虚拟机的,java编写的app只能是未来用在大内存设备上,目前小于128M内存的lite设备只能使用html+js的方法编写、编译程序,在LiteOS中使用华为已经开源的js framework运行app,目前系统整体架构如下图所示(参考华为提供文档中的JS架构增加了未来Java的一部分):
内核包含了Linux这不是我自己加的,文档中JS架构图、驱动架构图均出现了Linux,在驱动架构图中还出现了micro微内核,手机端究竟如何只有等开源了才能揭晓答案。
官方原版架构图:
再次更新
昨晚有空下载并阅读了openharmony的源代码,发现了新大陆。可以确定的是,在嵌入式设备中基于LiteOS内核,华为确实开发出了一套自己的app运行时framework、ability framework以及UI framework,并且与app开发中的java接口相一致。看得比较急,还没找到java虚拟机的实现代码,有一部分框架文档还没开放,点开链接是404,具体的以后有时间再看再更新,考研党逃了~
半天没看知乎,突然多了这么多赞
补充几点说明,首先虽然hap安装包中有apk安装包,但这并不是说鸿蒙是安卓套壳,从前面我的分析可以看出,apk包中是不包含任何软件逻辑的,这个包似乎是自动生成的,并且即使创建新的工程再编译,除了java的包名以外也基本上都不会变的。原回答的图中可以看出,apk的代码包含两个类:MainAbilityShellActivity和ShellMyApplication。shell是壳的意思,例如Linux的shell就是指在内核上套了一层壳,用户在终端通过这层壳与内核交互,从类名可以大致判断,这里的Activity是作为鸿蒙的Ability的一层壳,猜测是用来实现安卓进程与鸿蒙进程通讯。可以先看一下AbilityShellActivity的源代码:
这里的代码也正是引起大家争议的地方,因为他import了安卓的api,继承自安卓的Activity,不过这里import大多数都是与上下文有关的类,可以看到这个类还实现了一个接口IAbilityShell,查看其源代码:
这个接口用来获取系统的上下文、获取系统类加载器、设置UI,也就是说这个Activity会与相应的Ability绑定,通过这个接口在安卓进程中可以获取到鸿蒙Ability相应的上下文信息,实现进程间的ipc。同样看一下HarmonyApplication这个类:
该类继承自安卓的Application,作为一个安卓进程的实体类。该类有get、set Ability等方法来获取、设置所对应鸿蒙进程的ability。
如果分析的没错,这个apk就是用来实现鸿蒙进程与安卓进程通信的,HarmonyApplication中的最后一段代码也能说明这点
可以看到这个类初始化是会加载ipc_core.z这个so库,从名字就可判断是用于进程间ipc的。
知乎上另一个问题有大佬已经解释,鸿蒙作为分布式架构拥有分布式内核,也就是说可能鸿蒙与Linux会同时存在,如果鸿蒙的内核确实是独立于安卓的Linux内核,那么通过上面分析,鸿蒙app启动流程可能是这样:鸿蒙App在鸿蒙的内核中启动运行->鸿蒙内核主动向Linux内核发送请求运行apk包中的代码在安卓虚拟机中创建一个用于与该鸿蒙进程通信的Shell进程,并设置好对应ability的上下文环境->安卓进程通过这个Shell进程与鸿蒙进程通信。
以上纯属从软件端代码分析做出的判断,而鸿蒙实际上是什么样的存在还需要阅读鸿蒙的内核源代码,目前只开源了用于嵌入式设备的LiteOS内核,手机端只能等到12月开源才能进一步分析。
不论最终鸿蒙是自己的内核还是基于Linux还是别的什么操作,华为能将ide发布,并且公开相应的app开发文档,说明鸿蒙App基于java的开发框架就是目前这样了。华为肯定是希望开发者能尽快适配鸿蒙OS,之所以鸿蒙的Api与安卓是如此的类似,就是为了减少开发者迁移和学习的成本,现在只需静等手机端开源再下结论,其他的只能说是猜测。
最后补一句毛主席的话:没有调查就没有发言权。
以下为原回答
不知道具体的机制不多做主观回答,个人觉得为了能够兼容安卓吧,鸿蒙才2.0,想要独立的用方舟编译器把apk直接编译成鸿蒙app不太现实。刚刚装好DevCro体验了一下,整个界面和Android Studio非常接近,可用html+js的方式开发,也可以用纯java开发。api也和安卓没有太大区别,部分类名做了修改,比如activity改成了ability,整体上基本不变,这样应该是为了能够更方便的将安卓代码移植过来。
编译后生成了hap安装包,可以直接将其作为zip压缩包打开,里面有一个entry_signed_entry.apk,这里应该是程序的入口。
classes.dex是java编译后的文件,反编译可以看出是我们前面的harmonyOS的代码
将apk解压后可以看到是正常的安卓安装包
反编译这个apk中的dex,jar包查看java源代码,发现里面也确实调用到了安卓的api,不过只用到了android.os.bundle,这个类是用来在activity间通讯的。
而且这个apk是可以在安卓手机安装的只不过无法运行,因为其余的资源文件和我们编写的harmony app的代码都被抽在了外面,直接安装里面的apk运行是不行的。不知道鸿蒙具体的运行机制是啥,这个entry_signed_entry.apk的源代码也没有看出是从他来启动harmonyOS的ability。具体等后面官方公布技术细节,个人觉得鸿蒙是有安卓的运行时支持的,因为鸿蒙的hap包内本身并没有第三方的lib,要想调用这个android.os.bundle只能是系统已经内置了,鸿蒙本身就是分布式架构,针对不同的应用可以选择不同的运行时,不过这样的系统不臃肿吗?