再来深扒一下鸿蒙2.0Beta里的HAP如何运行
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 & Huawei</vendor>”,算是合作开发吧。让人不解的是,为什么是android目录,而不是harmony目录,我随手统计了一下,这个目录里的库文件是最多的,说明主要功能都由该插件提供。
下面的操作,需要操作者拥有一台已经升级鸿蒙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的信息
确认一下这个机器是P40
看一下Android虚拟机的信息
再次确认手机厂商等
看一下系统里都运行了什么
这个其实很简单,就是随便Android应用APK的Activity里的onCreate方法上加个断点,同样在HAP里的Ability里的onCreate方法上加个断点,远程看看堆栈,不多话,直接上两张图。
这个是标准的Android App中Activity的堆栈
这个是HAP中Activity的堆栈
两者在堆栈上基本没有区别,都是由android.app的handleStartActivity来调用的,后面的堆栈不同,我在上一篇文章中分析过,应该是鸿蒙设计的Ability内部自带了一些内容,包括设置上下文等。从上图上可以看出HAP程序还是在Andorid Runtime里运行的,至于这个Android Runtime怎么来的,这个要看华为怎么解释了,我就不随意揣测了。关于这块的详细分析,可以看我上一篇文章。
再用两张图对比看看,能证明鸿蒙的通用控件,如Button/Image等不是直接使用Android里的通用控件。左图的线表示了每个Android标准控件的区域,而右图则少了很多线,说明鸿蒙的通用控件是重新实现的。
最后再上一张Boot ClassLoader的信息图。
按照正常的程序来理解,HAP不能算是系统原生应用,就好比一个原来用AWT写界面的Java GUI程序,不管是用JavaFx还是Swing改写一遍,都仍然是一个Java程序,不能叫JJ程序。