12-16号华为发布鸿蒙2.0手机beta版,以下的问题和分析以及截图等均来自于华为官方的DevEco Studio(版本号2.0.12.201)以及远程提供的P40手机运行环境(除部分可能涉及个人账号的信息会被擦除外,均无任何人为修改)。 个人不对鸿蒙2.0手机beta版做任何魔改安卓,自行研发的讨论,任何人(多少有点开发经验)都可以按照文中的步骤重现所有过程。文中的所有的问题及分析,均基于计算机开发的常识(也不排除有错误的可能,可以讨论,但请言之有物)。
深入解析鸿蒙2.0手机Beta版的开发和设计
发表于 2020-12-17 18:49:072289查看
12-16号华为发布鸿蒙2.0手机beta版,以下的问题和分析以及截图等均来自于华为官方的DevEco Studio(版本号2.0.12.201)以及远程提供的P40手机运行环境(除部分可能涉及个人账号的信息会被擦除外,均无任何人为修改)。 个人不对鸿蒙2.0手机beta版做任何魔改安卓,自行研发的讨论,任何人(多少有点开发经验)都可以按照文中的步骤重现所有过程。文中的所有的问题及分析,均基于计算机开发的常识(也不排除有错误的可能,可以讨论,但请言之有物)。
步骤一 注册用户及配置开发环境
要开发鸿蒙应用,必须去官网注册开发者身份,批准后即可下载对应的DevEco Studio,并获得使用远程虚拟手机的权限。整个过程没什么必要详细介绍的,有兴趣的同学自行百度即可。
-
每次使用远程虚拟机,都得通过浏览器登录,能不能直接提供账号密码的登录方式,实在不行,你使用内置浏览器也好办点啊。
-
不提供本地虚拟机实在是太慢了,断点调试时,需要从远程虚拟手机上取得堆栈调用信息,我恍如看动画一样看着那个堆栈树在刷新(附一句,我用的是1G光纤加5G 300M Wifi)。
-
DevEco Studio不知道怎么想的,虚拟手机的交互界面上部占用了极大的空间显示着P40和剩余使用时间(单次只能一个小时),把这些信息放在工具栏上面不好吗?实在不行,你合成一行,或者放在侧面,也节省点空间啊(如果是MediaPad,倒是可以放上面)。
-
DevEco Studio的界面预览功能,应该是用NodeJs来支持,但非常之慢,我还没有成功过呢,反正界面简单,实在懒得折腾了。
-
虚拟手机的调试功能不稳定,时不时就出现无法使用,只能重新启动。
-
虚拟手机的WebView有问题,我无法使用浏览器,甚至无法登录QQ等,除了影响使用外,我连程序生成的文件都不方便拿到本地,对于调试非常不友好。
-
Idea太吃内存了,我8G的笔记本,用它总是内存满满的,还出现几次内存不足退出。
安装完DevEco Studio后,还需要在Setting中下载HarmonyOS SDK后才能使用,这点和Android Studio是一样的,熟悉的同学应该很容易上手,不熟悉的自己百度吧。
对于分析APK等程序,我使用的是jadx1.2,无法插入链接(大家自己百度并下载吧)。
步骤二 直接开发并远程部署一个Hap应用
启动DevEco Studio后,创建一个手机应用,并选择Studio提供的Business Card模板(也就是一个名片列表应用),然后一路点下去,直接使用默认的MyApplication这个名字,然后就很顺利地生成整个项目了。

接下来,需要在菜单里打开 Tools-> HVD Manager,中间可能需要登录到华为的开发账户,或者可以提前在 Tools->DevEco Login->Login进行登录操作。 登录成功后,启动HVD Manager,就有一系列设备可选,直接选择P40即可(也只有这一个手机设备可以选择),然后点击蓝色的三角启动按钮即可使用远程的虚拟机,大概几秒到几十秒(启动比较快,我本机只需要5秒左右即可使用了),就可以看到远程可用的虚拟机。
虚拟机启动后,即可通过上面的Run/Debug远程部署自己的应用了。
实在无法不吐槽这个产品经理的设计,上面的两行字占了差不多四分之一的空间
和Android的adb基本类似,然后这个应用就跑起来了。
步骤三 对Hap应用的调试-反编译及运行时分析
本地找到生成的hap文件,是一个zip格式的压缩包,解开后,可以看到以下内容。
使用Jadx把entry_signed_entry.apk和classes.dex解开,分别得到以下内容:
其中apk中所带的AndroidManifest.xml文件如下:
而hap文件里带的classes.dex也是目前Android的编译后运行文件格式,也正是项目里的Java代码生成的目标文件。
从上面来看,APK还是一个遵守Android标准的App包,然后我打开里面的ShellMyApplication,看里面的代码:
package com.example.myapplication; import ohos.abilityshell.HarmonyApplication; public class ShellMyApplication extends HarmonyApplication { public void onCreate() { ShellMyApplication.super.onCreate(); } }
具体的工作应该是由ohos.abilityshell.HarmonyApplication来完成的,于是我在DevEco Studio中找到这个类,这个类继承自android.app.Application。

我把代码详细的过了一遍,大概理解了整个运行的过程。
首先是这个apk会按照正常的Android生命周期加载,启动ShellMyApplication,然后在它的父类HarmonyApplication里有一个setBundleInfo(BundleInfo bundleInfo)方法,由外部注入了配置信息,这个信息我断点查看,发现和config.json是一致的。而config.json则是对myapplication应用做了定义。然后在createUserApplication方法里,再调用setUserApplication等方法,通过当前Application实例的ClassLoader加载了用户编写的类,即MyApplication这个类,再将接下来的工作转给MyApplication等用户编写的功能类。 也就是说这个apk起的是一个引导和加载功能。
步骤四 对鸿蒙的部分解析
我把能看到的代码大致过一遍,也基本理解了鸿蒙2.0在开发这块的思路了(当然,只是个人看法,如果有不同看法,请明确提出进行讨论)。
-
鸿蒙2.0提供的SDK,对外的接口完全屏蔽了Android(至少我翻的上百个类对外接口都不存在暴露Android类的内容),这样如果有一天完全脱离Android框架,理论上讲是有可能的(虽然难度极大)。但由于还是使用Java代码开发,所以理论上讲会和Google一样,会碰到Oracle的版权问题,而且对java库的依赖,从长远看,应该也没办法脱离Java。
-
Apk用来引导,然后使用ClassLoader加载用户程序,优点是可以屏蔽Android接口,缺点是在某些环境上可能会出不兼容问题,用过Shell方式封装Activity的同学应该知道我说的是什么,但华为从底层通过config.json可能容易解决这个问题。
-
至少在虚拟手机层面,是有一个Android运行时存在的,至于这个Android Runtime是不是华为开发的,还是直接来自AOSP,我就不猜了,也不评论了。
-
根据Log看到的信息,虚拟手机层面,应该还是有一个Linux Runtime存在的,因为里面的各种运行环境和参数都展示了有linux各种库参与。至于有没有鸿蒙微内核的存在,我没法证明,也没法证伪。
-
如果鸿蒙微内核也存在,和Linux Runtime一起存在,这种双内核结构,只能说我的见识没法猜想两者如何协作,比如由谁负责资源中断,各种硬件驱动由谁负责加载,在哪个进程中调用,驱动和程序等是进程内调用还是IPC等等。如果哪位有双内核资源调配的方案或者论文,可以补充一下。
能复现吗,能复现的话就把你的常用邮箱和空闲时间发送到deveco_studio@huawei.com,方便远程会议现场解决问题