深入解析鸿蒙2.0手机Beta版的开发和设计

新新人类
发布于 2022-2-22 16:26
浏览
0收藏

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,并获得使用远程虚拟手机的权限。整个过程没什么必要详细介绍的,有兴趣的同学自行百度即可。
但有几点需要吐槽一下:
  1. 每次使用远程虚拟机,都得通过浏览器登录,能不能直接提供账号密码的登录方式,实在不行,你使用内置浏览器也好办点啊。
  2. 不提供本地虚拟机实在是太慢了,断点调试时,需要从远程虚拟手机上取得堆栈调用信息,我恍如看动画一样看着那个堆栈树在刷新(附一句,我用的是1G光纤加5G 300M Wifi)。
  3. DevEco Studio不知道怎么想的,虚拟手机的交互界面上部占用了极大的空间显示着P40和剩余使用时间(单次只能一个小时),把这些信息放在工具栏上面不好吗?实在不行,你合成一行,或者放在侧面,也节省点空间啊(如果是MediaPad,倒是可以放上面)。
  4. DevEco Studio的界面预览功能,应该是用NodeJs来支持,但非常之慢,我还没有成功过呢,反正界面简单,实在懒得折腾了。
  5. 虚拟手机的调试功能不稳定,时不时就出现无法使用,只能重新启动。
  6. 虚拟手机的WebView有问题,我无法使用浏览器,甚至无法登录QQ等,除了影响使用外,我连程序生成的文件都不方便拿到本地,对于调试非常不友好。
  7. Idea太吃内存了,我8G的笔记本,用它总是内存满满的,还出现几次内存不足退出。

 

安装完DevEco Studio后,还需要在Setting中下载HarmonyOS SDK后才能使用,这点和Android Studio是一样的,熟悉的同学应该很容易上手,不熟悉的自己百度吧。

对于分析APK等程序,我使用的是jadx1.2,无法插入链接(大家自己百度并下载吧)。

 


步骤二 直接开发并远程部署一个Hap应用
启动DevEco Studio后,创建一个手机应用,并选择Studio提供的Business Card模板(也就是一个名片列表应用),然后一路点下去,直接使用默认的MyApplication这个名字,然后就很顺利地生成整个项目了。深入解析鸿蒙2.0手机Beta版的开发和设计-鸿蒙开发者社区
接下来,需要在菜单里打开 Tools-> HVD Manager,中间可能需要登录到华为的开发账户,或者可以提前在 Tools->DevEco Login->Login进行登录操作。 登录成功后,启动HVD Manager,就有一系列设备可选,直接选择P40即可(也只有这一个手机设备可以选择),然后点击蓝色的三角启动按钮即可使用远程的虚拟机,大概几秒到几十秒(启动比较快,我本机只需要5秒左右即可使用了),就可以看到远程可用的虚拟机。
 
深入解析鸿蒙2.0手机Beta版的开发和设计-鸿蒙开发者社区
 
虚拟机启动后,即可通过上面的Run/Debug远程部署自己的应用了。深入解析鸿蒙2.0手机Beta版的开发和设计-鸿蒙开发者社区
实在无法不吐槽这个产品经理的设计,上面的两行字占了差不多四分之一的空间
部署时出现的是以下内容:
12/17 11:01:08: Launching com.example.myapplication
$ hdc shell am force-stop com.example.myapplication
$ hdc shell bm uninstall com.example.myapplication
$ hdc file send C:/Users/***/DevEcoStudioProjects/MyApplication/entry/build/outputs/hap/debug/entry-debug-unsigned.hap /sdcard/670e402d7ec643aab51bb93c72ca6c77/entry-debug-unsigned.hap
$ hdc shell bm install -p /sdcard/670e402d7ec643aab51bb93c72ca6c77/
$ hdc shell rm -rf /sdcard/670e402d7ec643aab51bb93c72ca6c77
$ hdc shell am start -n "com.example.myapplication/com.example.myapplication.MainAbilityShellActivity" -D
Waiting for application to come online: com.example.myapplication
Connecting to com.example.myapplication​
和Android的adb基本类似,然后这个应用就跑起来了。

步骤三 对Hap应用的调试-反编译及运行时分析
本地找到生成的hap文件,是一个zip格式的压缩包,解开后,可以看到以下内容。
深入解析鸿蒙2.0手机Beta版的开发和设计-鸿蒙开发者社区使用Jadx把entry_signed_entry.apk和classes.dex解开,分别得到以下内容:深入解析鸿蒙2.0手机Beta版的开发和设计-鸿蒙开发者社区
其中apk中所带的AndroidManifest.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" android:compileSdkVersion="29" android:compileSdkVersionCodename="10" package="com.example.myapplication" platformBuildVersionCode="29" platformBuildVersionName="10">
    <uses-feature android:name="zidane.software.ability" android:required="false"/>
    <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="29"/>
    <application android:label="MyApplication" android:icon="@drawable/icon" android:name="com.example.myapplication.ShellMyApplication" android:persistent="false" android:debuggable="true" android:process="com.example.myapplication" android:allowBackup="false" android:usesCleartextTraffic="false" android:resizeableActivity="false" android:directBootAware="false">
        <meta-data android:name="permZA" android:value="true"/>
        <activity android:label="MyApplication" android:icon="@drawable/icon" android:name="com.example.myapplication.MainAbilityShellActivity" android:process="com.example.myapplication" android:launchMode="standard" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

 

而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。

深入解析鸿蒙2.0手机Beta版的开发和设计-鸿蒙开发者社区

我把代码详细的过了一遍,大概理解了整个运行的过程。
首先是这个apk会按照正常的Android生命周期加载,启动ShellMyApplication,然后在它的父类HarmonyApplication里有一个setBundleInfo(BundleInfo bundleInfo)方法,由外部注入了配置信息,这个信息我断点查看,发现和config.json是一致的。而config.json则是对myapplication应用做了定义。然后在createUserApplication方法里,再调用setUserApplication等方法,通过当前Application实例的ClassLoader加载了用户编写的类,即MyApplication这个类,再将接下来的工作转给MyApplication等用户编写的功能类。 也就是说这个apk起的是一个引导和加载功能。

步骤四 对鸿蒙的部分解析
我把能看到的代码大致过一遍,也基本理解了鸿蒙2.0在开发这块的思路了(当然,只是个人看法,如果有不同看法,请明确提出进行讨论)。
  1. 鸿蒙2.0提供的SDK,对外的接口完全屏蔽了Android(至少我翻的上百个类对外接口都不存在暴露Android类的内容),这样如果有一天完全脱离Android框架,理论上讲是有可能的(虽然难度极大)。但由于还是使用Java代码开发,所以理论上讲会和Google一样,会碰到Oracle的版权问题,而且对java库的依赖,从长远看,应该也没办法脱离Java。
  2. Apk用来引导,然后使用ClassLoader加载用户程序,优点是可以屏蔽Android接口,缺点是在某些环境上可能会出不兼容问题,用过Shell方式封装Activity的同学应该知道我说的是什么,但华为从底层通过config.json可能容易解决这个问题。
  3. 至少在虚拟手机层面,是有一个Android运行时存在的,至于这个Android Runtime是不是华为开发的,还是直接来自AOSP,我就不猜了,也不评论了。
  4. 根据Log看到的信息,虚拟手机层面,应该还是有一个Linux Runtime存在的,因为里面的各种运行环境和参数都展示了有linux各种库参与。至于有没有鸿蒙微内核的存在,我没法证明,也没法证伪。
  5. 如果鸿蒙微内核也存在,和Linux Runtime一起存在,这种双内核结构,只能说我的见识没法猜想两者如何协作,比如由谁负责资源中断,各种硬件驱动由谁负责加载,在哪个进程中调用,驱动和程序等是进程内调用还是IPC等等。如果哪位有双内核资源调配的方案或者论文,可以补充一下。

 

 

 

分类
已于2022-2-22 16:26:25修改
1
收藏
回复
举报
1条回复
按时间正序
/
按时间倒序
wx61dcf2c056024
wx61dcf2c056024

能复现吗,能复现的话就把你的常用邮箱和空闲时间发送到deveco_studio@huawei.com,方便远程会议现场解决问题

回复
2022-3-17 09:47:09
回复
    相关推荐