云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

我的第一个鸿蒙app,以及所见内容(ZT)

jxf315 2025-03-19 13:43:45 教程文章 27 ℃

知乎上很火的帖子,转过来大家看看。

首先声明一下,我不会得出鸿蒙是安卓换皮这样的结论,这话题见仁见智,这里我只记录开发过程中所见到的内容,该文章仅做鸿蒙开发交流

做为一名安卓开发……

见到鸿蒙2.0上线了,当然得体验一下,然后和其他猿一样,成功地看到让人激动的"hello world"

可是接下来看到的,到让我感到意外,因为run之后,我竟然在build -> intermediates -> shell -> debug -> src -> main -> java -> com -> 包名 目录下看到安卓的原生代码

首先是androidManifest文件夹的内容

从内容可以看到,application导向ShellMyApplication,第一个启动的activity为MainAbilityShellActivity,也就是build包里的那几个文件

点开之后可以看到父类在ohos.abilityshell包里,最终继承的是安卓的activity和application

ohos.abilityshell包下还有安卓的四大组件

从代码里可以看到鸿蒙在这里给activity,service,provider分别写了代理类,有兴趣的可以自己去看源码

ohos.abilityshell里依赖的android,主模块是无法直接调用的,但这个对安卓开发不是难事,只要在主模块添加相同的依赖,就可以调用相对应的代码了,于是我在build.gradle里依赖了安卓包:implementation '
com.google.android:android:4.1.1.4'

如果鸿蒙app背后真的有一个安卓的application在运行,那么我们肯定能获取到这个application的实例,这对安卓开发来说,这也不是难事,写个反射就行

反射获取application

打印一下application的类名,顺便弹个Toast验证一下application是否可用……

然后奇迹发生了……

打印结果证明确实有个ShellMyApplication在背后运行

Toast也正常弹出

Toast正常弹出,除了证明鸿蒙背后有个application在运行外,还证明了windowManager也是安卓的,继续推论的话,framework层也是安卓的……呃,扯远了

再看看activity是否被调用,验证也很简单,
registerActivityLifecycleCallbacks监听一下就行

为了监听到activity的生命周期,我执行的操作:打开app->退回桌面->再打开app,结果嘛,当然一点意外都没有……MainAbilityShellActivity走了个完整的生命周期

application拿到了,那就彻底放飞自我……

首先是用安卓的方法打开自己的设置界面

结果当然也没意外呢

麻利地打开了……

再试试打开其他app,尝试打开拨号界面……

正常打开了,这至少证明鸿蒙系统里那个系统拨号app是个安卓app

打印了几次activity的生命周期,发现鸿蒙的AbilitySlice都是在activity的onstart()方法之后运行,所以我尝试在activity的onResume方法里添加给activity添加几个控件…

运行结果

查看绘制布局,发现在activity渲染的是一个整体

断点分析后发现activity只有一个子控件:AGPContainerView,数据太多这里就不截图了

打印这个类和他的父类,发现AGPContainerView是一个SurfaceView

从这些信息大致可以推断出鸿蒙重新定义了一套新的ui api(ohos.agp.components包),那些承继自Component的控件,比如Text,Button,DirectionalLayout等都会在SurfaceView绘制

至于鸿蒙为什么要重新定义一套新的ui,那就不得而知了

作者:落花时节啃狗

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最近发表
标签列表