请选择 进入手机版 | 继续访问电脑版

Discuz! Board

 找回密码
 立即注册
查看: 17686|回复: 0

再来深扒一下鸿蒙2.0Beta里的HAP如何运行

[复制链接]

3

主题

4

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2021-4-29 18:49:36 | 显示全部楼层 |阅读模式
本文转自知乎网友“猪儿笨笨

12-16号华为发布鸿蒙2.0手机beta版,以下的问题和分析以及截图等均来自于华为官方的DevEco Studio(版本号2.0.12.201)以及远程提供的P40手机运行环境(除部分可能涉及个人账号的信息会被擦除外,均无任何人为修改)。
本文并不讨论鸿蒙2.0是否安卓魔改或者别的,各位自己判断,任何人(多少有点开发经验)都可以按照文中的步骤重现所有过程。文中的所有的问题及分析,均基于计算机开发的常识(也不排除有错误的可能,可以讨论,但请言之有物)。
另外手机通过"设置->关于手机->法律信息->开放源代码许可",应该也能看到很多信息,但虚拟手机不知道为什么,总是无法显示,浏览器也无法正常使得(我猜是WebView出问题了)。有真机的同学可以看看。
在深扒鸿蒙2.0Beta里的HAP如何运行之前,先做一下几个基础的科普性内容:
  • 怎么使用Linux会被起诉?
    Linux使用的是GPL协议,可以认为是在开源协议里对商业最不友好的一种协议,也被业内称为病毒协议。象Google为了让Android可以商用,所以通过HAL层的设计,让开发者的程序虽然在Linux上运行,但不需要开源,方便商用。其实违反了GPL协议,并不一定会被起诉,特别是象Linux这种由社区而非公司掌控,起诉主体都不明确,更别提在中国起诉了。事实上中国有一个公司,文石公司使用了Linux,但 Onyx 官方回应“技术团队无法公开源码”,并希望得到谅解。还有再之前的FFMpeg事件,连腾讯都在榜上。所以尽管可能很多公司违反GPL协议,但在中国,外国社区基本无法起诉中国公司,所以即使某些公司违反了开源协议,也基本上只能是骂骂罢了。
  • 怎么使用AOSP会被起诉?
    首先要理解虽然大家都觉得Android是由Google控制的,其实不是,Google的确是在很大程度上决定了Android的方向,但厂商的Android OS都是基于AOSP(Android Open Source Project)开发的。任何厂商都可以不经过Google和开放手持设备联盟的授权随意使用Android操作系统;但是制造商不能随意地在自己的产品上使用Google的标志和Google的应用程序,例如Google Play等。除非Google证明其生产的产品设备符合Google兼容性定义文件(CDD),这样才能在智能手机上预装Google Play Store、Gmail等Google的私有应用程序,并且获得CDD的智能手机厂商也可以在其生产的智能手机上印上“With Google”的标志。所以只要不违反这些原则,怎么使用AOSP都不违法,也不会被起诉。当年阿里的云手机也违反了GPL协议,也没见起诉,即使Google怀疑Alios手机是魔改的安卓,也没有起诉阿里,而是以不给宏基手机发兼容性认证为威胁要求宏基退出。因为Google真正能控制的是GMS,也就是说没有通过兼容性认证,就可以随时关闭GMS。考虑到现在的情况,这个对于华为不是威胁,所以Google基本不可能以Android这个事来起诉华为。
    顺便解释一下GMS有多重要,为什么国内安卓手机配置比较高但还普遍不如海外Android手机流畅,很大程度上就是因为消息机制,GMS的消息机制和Apple的一样,可以在App没有活动的情况下,发送通知,但国内没有GMS,所以微信,淘宝等各种应用就想办法驻留后台来接收消息,增大耗电/内存占用等。国家也成立了消息联盟,想解决这个问题,但效果吗,大家都懂得。
  • 是不是华为发布了鸿蒙2.0Beta又没被起诉,后续就表示可以正常使用了?
    这个不一定的,只是说现在没有被起诉,一是因为只是beta,并没有正式商用,并不是一个合适的起诉时机。二是如果真有起诉机会,外国公司也很有耐心,参见Oracle起诉Google赔88亿(Android从2007年发布Beta版本,08年发布真机,Sun没有起诉,但09年Oracle收购Sun以后,却在10年以Java侵权起诉了Google要赔88亿刀)。事实上鸿蒙2.0Beta使用Java进行开发,就已经给自己埋了个雷,至于会不会爆,只能等待。
  • 华为的DevEco Studio怎么和Android Studio一样,是不是抄袭?
    这倒不是,因为都是在Idea的基础上修改的,在DevEco Studio的安装目录下的plugins目录里,找到android目录,里面有一个plugin.xml文件,里面就写着“<vendor>JetBrains &amp; Huawei</vendor>”,算是合作开发吧。让人不解的是,为什么是android目录,而不是harmony目录,我随手统计了一下,这个目录里的库文件是最多的,说明主要功能都由该插件提供。

在这里说个好玩的事,我文章里只是清楚的说出了事实,即每个程序员都能按照既定的步骤得到相同的结果。但一堆人拿着未来的规划以及自己的误解来质疑。我就很好奇一件事,你有这么多的时间,不如直接写一个可以证明你自己观点的HAP包或者别的代码来证明我文章里有什么事实是错的,不就好了吗?还是说你们写不出来,或者干脆连个开发者账号都没有去注册。程序员在技术方面至少应该坚持:因为看见所以相信,而不是因为相信所以看见。
这里必须要夸奖一下华为,很正面的回复了我提的几个问题,这才是真正做技术的态度,还是希望华为能够真正做出来一些东西。奉劝一些人,别把自己想象中的东西当成真的,这样只会害了华为,而不是支持华为。
[color=inherit !important][backcolor=rgba(246, 246, 246, 0.88)]华为开发者论坛&#8203;developer.huawei.com我也是醉了,华为开发者论坛的版主又把自己的回复删除了,幸亏我当时截图,否则肯定被骂惨。想看截图的点下面链接,我把截图贴在另一篇文章里,就不在这里占地方了。(真是经不起夸奖啊)[color=inherit !important]华为开发者论坛回复截图&#8203;pic1.zhimg.com
@slon

你写的以下内容,均在华为官方开发者论坛,由版主统一回答了,你看你还要坚持不?
  • “IDE里的框架层是C++写的”
    官方回答:IDE是Idea开发的。 IDEA官网写着用Java开发的。不知道你怎么这么坚信它是用C++开发的。
  • “去微博上找钊哥科普吧,他是鸿蒙的首席领导者,你要信息他应该可以给你,手机版未开源,源码信息只能通过LITE OS开放的源码去了解鸿蒙有可能的实现”“引导者不是领导者,鸿蒙有很多个区,深圳 北京 主要推广负责人”
    官方回答:钊哥不是华为员工。 一个不是华为员工的人,竟然被你当作推广负责人,我实在理不清楚为什么?
  • “人家不是在测试了吗,已经开放给开发发者了,一切都是刚开始,现在也可以利用那特性自己开发一个分布式应用”
    官方回答:后续会有相关的案例代码开源,目前代码已经有了,正在策划放出,请关注OpenHarmony开源社区。 官方都说还在策划阶段,并没有正式放出,请问你又是从哪里拿到的消息。
  • "懂的工程师都在了解鸿蒙的分布式,底层实现,而不是关心什么兼容安卓,有安卓有的东西"
    官方回答:当前鸿蒙是双框架,运行在ART虚拟机中,但是上层已经封装了鸿蒙的接口,在后续的鸿蒙版本中可以逐步解耦AOSP,直至单框架完全不依赖AOSP,AOSP是10.0的。 这个答案应该是和我几篇文章的内容一致吧。怎么到了你那里,变成兼容安卓了,官方都承认是在ART虚拟机中运行的,说白了还是安卓啊。
@金立明

@Pedro

你们两位这么双标有意思吗?
他扯半天规划,说自己做很久的内核,没有给一行代码,你们看不见,不说。
他从不正面回答我问了多次给个APP来证明他观点,你们看不见。
他给个错误代码,我批评,你们看不见。
他说别人不愿意copy代码测试,但他自己不测试,你们还是看不见。
一堆人说了半天,没有一个人愿意给个代码展示一下,你们是只能动嘴不能动手吗?


@lilin 你有意思吗?让你正面回答有没有一个现在的App能证明你的观点,问了你四五遍,你就是不回复,有还是没有。有就给出地址,我下载测试不就好了。如果没有,就说没有,承认你所说的东西都是规划,现在还没有实现,未来鸿蒙可能会实现,我也没有说过未来不能实现啊?
一个号称调试过内核以及中间层api的人,对于一个提了7遍的问题,都不愿意正面回复,那么和你的任何讨论都是浪费时间。
如果说这就是你的回复,我只能拉黑了。
你自己都不愿意花3-5分钟时间去验证代码,还用同样的问题去指责别人,够双标。
准备回复的时候,他把话删除了,我只好在正文里回复了。
他说的地址在这里 2020征文-手机【干货】鸿蒙应用程序流转的实现 有兴趣的同学自己去验证吧。


下面的操作,需要操作者拥有一台已经升级鸿蒙2.0Beta的手机或者注册为华为开发者联盟的用户,可以远程使用虚拟机,本文里使用的远程虚拟机,本地使用的adb是Android SDK28对应的版本。
工作一 先看看从虚拟机上能拿到哪些信息
待远程虚拟手机启动完成后,使用adb devices命令,可以得到以下图:
这个估计是DevEco Studio给本地开的调试端口,我懒得再去通过tcp抓包看细节了,这个不影响操作。
通过adb shell命令直接连接到远程华为手机的控制台上,然后执行uname -a(uname 是UNIX和类UNIX操作系统命令,用于显示当前操作系统名称。),得到下图:
显示的是Linux,内核是4.14.112,这也和在设置里看到的信息一致,又随便试了几个linux命令,都能正常运行,所以正常判断是,这个远程鸿蒙2.0Beta手机里运行着一个Linux系统。
接下来,用getprop命令得到系统的一些详细内容,直接上图。
随便执行了一下ls命令,列出各种资源这个是用来查看当前系统支持的Android版本再看一下Linux的信息看一下Android虚拟机的信息确认一下这个机器是P40再次确认手机厂商等看一下系统里都运行了什么
再补充一句:华为开发者论坛版主已经承认底层使用的是Linux内核了,算是官方回答了吧,如果关于这块有歧义或者争议,可以直接去问他。
[color=inherit !important][backcolor=rgba(246, 246, 246, 0.88)]华为开发者论坛&#8203;developer.huawei.com
工作二 确认一下HAP到底是在什么环境里运行的
这个其实很简单,就是随便Android应用APK的Activity里的onCreate方法上加个断点,同样在HAP里的Ability里的onCreate方法上加个断点,远程看看堆栈,不多话,直接上两张图。
这个是标准的Android App中Activity的堆栈这个是HAP中Activity的堆栈
两者在堆栈上基本没有区别,都是由android.app的handleStartActivity来调用的,后面的堆栈不同,我在上一篇文章中分析过,应该是鸿蒙设计的Ability内部自带了一些内容,包括设置上下文等。从上图上可以看出HAP程序还是在Andorid Runtime里运行的,至于这个Android Runtime怎么来的,这个要看华为怎么解释了,我就不随意揣测了。关于这块的详细分析,可以看我上一篇文章。
[color=inherit !important][backcolor=rgba(246, 246, 246, 0.88)]猪儿笨笨:深入解析鸿蒙2.0手机Beta版的开发和设计&#8203;zhuanlan.zhihu.com
接下来,再通过断点上下文带的数据看看Ability这个类里用了哪些东西,继续上图。
其中蓝色框里的是DevEco自动生成的Ability子类MainAbility,下面的黑色框里则是android窗口带的WindowDecorActionBar类,说明Ability的子类是使用了android的一些基础类(这里要说一下,DecEco自带的Harmony SDK里的jar,里面的类都是stub类,不带实现,所以只能通过这种方式断点查看)。
这张图上的两个红框里的内容说明,提供UI的Ability里其实是使用了android.view.SurfaceView进行UI界面的绘制。这里强调一件事,鸿蒙的UI的确不是直接使用Android里的各种通用控件,而是在使用偏底层的SurfaceView自己进行绘制的。
再用两张图对比看看,能证明鸿蒙的通用控件,如Button/Image等不是直接使用Android里的通用控件。左图的线表示了每个Android标准控件的区域,而右图则少了很多线,说明鸿蒙的通用控件是重新实现的。

下面继续上图,看看ClassLoader的信息。
这张图的红框里说明,整个hap还是由Android Runtime加载并运行的,但鸿蒙应该是在外部加了一个定制的类加载路径,用来加载hap里的classes.dex文件中带的类。
最后再上一张Boot ClassLoader的信息图。
写到这里,看得懂的同学,也应该理解了HAP到底是一个什么情况,以及在手机里如何运行。
按照正常的程序来理解,HAP不能算是系统原生应用,就好比一个原来用AWT写界面的Java GUI程序,不管是用JavaFx还是Swing改写一遍,都仍然是一个Java程序,不能叫JJ程序。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鸿蒙学院

GMT+8, 2021-6-12 22:07 , Processed in 1.588505 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表