极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”

极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”_第1张图片

一、背景

鸿蒙的原生开发是无法支持到安卓原生配置的,导致鸿蒙直接嵌入安卓库需要做相应的改造。MobTech作为第三方SDK提供方,有必要为开发者提供更方便的接入解决方案。我们的目标是鸿蒙开发者和安卓开发者接入MobSDK的成本是一样的。在这个终极目标的前提下,我们需要突破鸿蒙的一些限制。

本文主要就如何突破安卓和鸿蒙之间的差异做到无缝迁移展开,同时将为大家介绍鸿蒙的一些原理性知识。下面我们将从鸿蒙与安卓的差异、兼容的卡点、突破的原理几个方面进行深入讨论。

二、鸿蒙项目 VS 安卓项目

极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”_第2张图片

从项目整体结构上来看,鸿蒙和安卓基本是相同的,包含代码、资源、布局、配置和国际化等。但是深入了解则发现存在很大的差别。

1、四大组件到Ability
鸿蒙为了跟安卓剥离的更为彻底,已经完全废弃了四大组件的设计(仅仅保留四大组件的概念),这种改变带来的问题是需要重写原来这部分安卓代码。
组件主题

极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”_第3张图片

2、AndroidManifest.xml到config.json

鸿蒙废弃了XML的配置,采用了json格式来配置项目,但是这种改变并不是简单的文本格式的转变,里面可配置的内容也做了很大的修改,甚至有些属性是只有鸿蒙才有的,而有些在安卓里的属性在鸿蒙里已被完全废除。

3、AAR变成了HAR
HAR(HarmonyOS Ability Resources)可以提供构建应用所需的所有内容,包括源代码、资源文件和config.json文件。HA不同HAP,HAR不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。
从上面HAR的解释来看,HA和AAR作用是一样的,但里面的内容却大不一样,这就导致了鸿蒙上是不能直接使用AAR的,而同样安卓上也是不能使用HAR。

4、鸿蒙不支持kotlin语言
如果原来安卓SDK是kotlin语言编写的,那么直接放入鸿蒙工程中,是跑不起来的。目前鸿蒙还不能支持kotlin语言。

三、无缝兼容的卡点

1、 AndroidManifest.xml四大组件怎么配置到鸿蒙里面?
2、 资源文件怎么打入到鸿蒙包里面?
3、 如何无阻碍的使用AAR包?
4、 安卓源码如何和鸿蒙一起通过编译?

**四、了解原理,突破限制

鸿蒙打包后生成的是hap文件,解压后的结构如下:

极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”_第4张图片

hap文件里assets文件夹对应的就是resources文件夹下的各种资源,而libs是依赖的各种jar、har、so等第三方库,dex其实是我们编写的鸿蒙代码编译成的结果。

最为神秘的就是其中的.apk文件了,它就一个作用:用来兼容安卓系统。如果没有这个apk,在安卓手机上根本就无法运行hap文件,它就是一个入口,通过它可以去加载鸿蒙的代码。主要是ShellMyApplication和 MainAbilityShellActivity 去实现加载鸿蒙,有点类似插件化的概念。

ShellMyApplication核心事情

  • 判断鸿蒙环境是否加载完成
  • 初始化鸿蒙应用
  • 加载鸿蒙的Ability
  • 初始化数据总线 接收系统产生的各种事件然后转发给鸿蒙应用

MainAbilityShellActivity核心事情

  • 初始化AbilityShellActivityDelegate
  • 代理安卓系统的各种回调事件

有了apk,我们就有了突破卡点的入口。因为apk里了我们需要的AndroidManifest.xml文件、资源文件夹。我们要做的就是在编译的过程中将原来安卓SDK的配置写进去就可以了。

最终效果

最后,我们在鸿蒙里接入分享SDK和安卓里接入分享SDK的对比效果:

极客星球 | Android原生SDK无缝嵌入鸿蒙开发“黑科技”_第5张图片

可以看到现在所有的配置都跟安卓上一样(除了GroupID不同而已),也无需增加其他额外配置。

五、总结

通过突破鸿蒙无安卓配置的卡点并加上业务逻辑封装成一个单独的插件,我们就能抹平鸿蒙项目接入安卓SDK所代来的差异,使得鸿蒙开发和安卓开发几乎可以无缝衔接。

目前MobTech的ShareSDK有包括微信、QQ、微博、抖音在内的多个平台已经“鸿蒙化”,开发者接入这些平台将跟接入安卓保持一致,后续我们会进一步扩充平台的数量,同时也会将MobTech下的其他SDK也逐步“鸿蒙化”,方便开发者接入。

你可能感兴趣的