鸿蒙OS到底是不是Android套皮?(不多说,看源码!)

人生就像一场旅行,不必在乎目的地。在乎的,是沿途的风景以及看风景的心情。

#正文
某人曾说「没有调查就没有发言权」

最近鸿蒙系统关注度好高,支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词,吵的不可开交。作为十八流码农,本着了解行业动态、体验HarmonyOS开发流程、找出HarmonyOS的特性与不足、看看是否有新的机会,也为了看看吵得不可开交的诸位谁说得对,特地在这个鸿蒙系统马上正式开放升级的时间点,开发体验了一番。

HarmonyOS到底怎么实现的——扒皮HarmonyOS

了解一个软件怎么实现的,最好还是查看源代码。但是承诺2020年开源的OpenHarmony项目到现在只开源到嵌入式设备,这条路自然走不通。只好退而求其次,看看已经开放的SDK、IDE、开发示例、编译产物,管中窥豹一下HarmonyOS到底怎么实现的。

1、安装IDE-配置环境-编译运行

这部分很简单,下载DevEco Studio,然后照着文档一步步操作就好了。模板选择了唯二的JS模板:Phone > Refresh Feature Ability。

然后一直下一步,申请下虚拟机,编译运行就成功了。

1)分析编译产物

运行成功后,先大致分析一下编译产物,找一下程序入口,看看代码到底怎么运行的。点开build文件夹,打开一看,喔噢!!!这目录结构和Android的太相似了,于是我熟练的点开outputs文件夹找apk文件。

hap???怎么和预想的不一样?不过侵淫Linux多年的经验告诉我,后缀都是浮云,于是果断把.hap改成.apk,然后用Android Studio打开,果然:

对比官方给出的App逻辑视图:

我们发现:
1、没有找到描述每个HAP属性的pack.info估计是因为工程只定义了一个Entry,没有定义Feature,于是只生成了Entry的安装包,但是按照官方文档给的说法

Entry可以独立安装运行,在只定义一个Entry的情况下,编译出这种包也说得通
2、App逻辑视图中的config.json正常在。
3、App逻辑视图中的abilities竟然编译成Android包的.dex执行文件,而用js定义的界面、视图、逻辑竟然归入assets中,这里面就有点猫腻了。
4、编译的可执行文件中竟然包含一个.apk文件,这个不速之客可在App逻辑视图中完全没体现,值得怀疑于是接下来,我们就先重点分析这个entry_signed_entry.apk,分析一下这个不速之客在App安装包里有什么作用。

2、分析entry_signed_entry.apk

继续用Android Studio打开这个文件

是一个标准的Android App!!于是熟练的点开Android应用描述文件:AndroidManifest.xml通过描述文件可以发现,整个apk只做了两件事:

  1. 定义Application为ShellApplication
  2. 定义MainActivity为MainAbilityShellActivity

emmmmm……这名字起得真直白

按照Android开发的惯例,从build文件夹中找这两个类的相关文件。

果然不费吹灰之力,接着分析源代码:先分析一下Application的定义文件ShellMyApplication:

ShellMyApplication继承自HarmonyOS SDK的AceHarmonyApplication,不过啥事都没干,接着看AceHarmonyApplication:

emmmmm……俄罗斯套娃吗?照样啥事也没干,那就接着找它的父类:
HarmonyApplication:

看这么大段的引用和变量定义,应该是正主没错了,不过HarmonyOS的HarmonyApplication竟然继承自Android的Application,这件事就得说道说道了HarmonyApplication整个文件很长,就不贴代码了,这个类主要做了如下几个工作:

1、初始化HarmonyOS应用…
2、输出HarmonyOS应用开始初始化的日志…
3、加载HarmonyOS的Ability到Android的Application的HashMap中…

4、接收系统产生的各种事件然后转发给鸿蒙应用…

5、初始化一个EventRunner,结合ohos包的代码来看,估计就是官方文档提到的「分布式软总线」,是HarmonyOS所谓的「分布式设计」的相关实现,这部分后面分析

码农果然都是老实人,起名都这么实诚又恰如其分:

ShellApplication的作用就是Android的Application提供一个Shell(壳),让HarmonyOS的Application寄生其中
接着来看看MainAbilityShellActivity,依旧是套娃设计,直接看具体的实现:

MainAbilityShellActivity依旧继承自Android的Activity,整个文件依旧很长,但是逻辑很简单,就一个作用:<

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值