HarmonyOS和Android深度对比

HarmonyOS APP 工程结构

0000000000011111111.20200916170403.13774785578472036601762489183905:50510916092911:2800:37EA003FE0055241CEB8AF759F1E200502CED26A7A1608F2018AB4BF6EEA7169.png?needInitFileName=true?needInitFileName=true

HarmonyOS应用发布形态为APP Pack(Application Package,简称APP),它是由一个或多个HAP(HarmonyOS Ability Package)包以及描述APP Pack属性的pack.info文件组成。

一个HAP在工程目录中对应一个Module,它是由代码、资源、第三方库及应用清单文件组成,可以分为Entry和Feature两种类型。

Entry:应用的主模块。一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。

Feature:应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。

HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开,它是由一个或多个Ability组成。Ability分为两种类型:FA(Feature Ability)和PA(Particle Ability)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。

工程目录结构对比

[$]

HarmonyOS 采用Java语言的工程目录结构如下图所示:

Android 工程目录如下图所示:

HarmonyOS 采用Java语言的工程目录结构 和 Android 工程目录结构对比如下:

目录结构Android HarmonyOS
源码目录project\entry\src\main\javaproject\app\src\main\java
资源文件目录project\app\src\main\resproject\entry\src\main\resources
清单文件project\app\src\main\AndroidManifest.xmlproject\entry\src\main\config.json
依赖文件目录project\app\libsproject\entry\libs
模块编译配置文件project\app\build.gradle project\entry\build.gradle
gradle目录 project\gradle project\gradle

另外,HarmonyOS 还可以采用 Javascript 语言进行编写,工程目录结构如下图所示:

pages 目录:

pages 文件夹下可以包含1个或多个页面,每个页面都需要创建一个文件夹(如图中的index)。页面文件夹下主要包含3中文件类型:css、js和htm文件

pages/index/index.html 文件 :该html文件定义了页面的布局结构,使用到的组件,以及这些组件的层级关系。

pages/index/index.css 文件:该css文件定义了页面的样式与布局,包含样式选择器和各种样式属性 。

pages/index/index.js 文件: 该js文件描述了页面的行为逻辑,此文件里定义了页面里所用到的所有逻辑关系,比如数据、事件等。

app.js 目录:

该文件是全局的 Javascript 逻辑文件和应用的生命周期管理。

安装包内部对比

Android开发的小伙伴都知道,Android应用最终会被打包成 .apk文件,.apk也是Android 应用的安装包后缀。那么对于 HarmonyOS 应用,它的安装包到底是什么呢?

采用 HarmonyOS 开发的应用会被构建成 .hap文件,.hap是由代码、资源、第三方库及应用配置文件组成的模块包。

不同的 hap 可被部署到不同类型的设备上,那 hap 的内部结构 又是怎么样子的呢?

hap 和 apk 类似都是应用的归档文件,都是 基于的 ZIP 文件格式,你可以将后缀名改为.zip文件,然后对其进行解压,得到最终文件

.apk文件解压以后的文件如下图所示:

.hap 文件解压以后的文件如下图所示:

清单文件对比

清单文件是开发一款应用必不可少的构成部分,接下来我们来对比下鸿蒙OS的清单文件和Android清单文件的异同。

在Android中的清单文件为 AndroidManifest.xml文件,而 鸿蒙OS的清单文件为 config.json

接下来我们来通过对比同一款应用的config.json与AndroidManifest.xml文件,来看下两者之间的异同:

config.json文件

{
  "app": {
    "bundleName": "com.example.helloword",
    "vendor": "example",
    "version": {
      "code": 1,
      "name": "1.0"
    },
    "apiVersion": {
      "compatible": 3,
      "target": 3
    }
  },
  "deviceConfig": {},
  "module": {
    "package": "com.example.helloword",
    "name": ".HelloWord",
    "reqCapabilities": [
      "video_support"
    ],
    "deviceType": [
      "tv"
    ],
    "distro": {
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry"
    },
    "abilities": [
      {
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "landscape",
        "formEnabled": false,
        "name": "com.example.helloword.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "HelloWord",
        "type": "page",
        "launchType": "standard"
      },
      {
        "orientation": "landscape",
        "name": "com.example.helloword.MeAbility",
        "icon": "$media:icon",
        "description": "$string:meability_description",
        "label": "entry",
        "type": "page",
        "launchType": "standard"
      }
    ]
  }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hbkykj.helloword">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

鸿蒙OS应用的配置文件“config.json”中由“app”、“deviceConfig”和“module”三个部分组成,缺一不可。

  • app :表示应用的全局配置信息。同一个应用的不同HAP包的“app”配置必须保持一致
  • deviceConfig:表示应用在具体设备上的配置信息。
  • module:表示HAP包的配置信息。该标签下的配置只对当前HAP包生效

[/$]

如果觉得文章有帮助到你,可以扫描以下二维码
   请本文作者 喝一杯
pay_weixin pay_weixin

发表评论

电子邮件地址不会被公开。 必填项已用*标注