【HarmonyOS开发】探究Hap与App包的结构与区别

在这里插入图片描述

1、Hap与App包的区别

OpenHarmony 可以进行两种形式(Hap和App)的打包,HAP是用于本地调试的,APP包是用于上架发布的。 根据不同的设备类型,一个APP包可以包含多个HAP包。
在这里插入图片描述
下面从两个角度进行分析

1.1 编译构建角度

  • 编译构建是将HarmonyOS应用的源代码、资源、第三方库等打包生成HAP或者APP的过程。其中,HAP可以直接运行在真机设备或者模拟器中;APP则是用于应用上架到华为应用市场。
  • 一个HarmonyOS工程下可以存在多个Module,在编译构建时,可以选择对单个Module进行编译构建;也可以对整个工程进行编译构建,同时生成多个HAP。

1.2 签名角度

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

  • Hap
    1、 一个HAP在工程目录中对应一个Module,它是由代码、资源、第三方库及应用配置文件组成,可以分为Entry和Feature两种类型。Entry:应用的主模块。一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。Feature:应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。

    2、HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开,它是由一个或多个Ability组成。

    3、一个App可以有很多HAP。HAP可以直接在模拟器或者真机设备上运行,用于HarmonyOS应用开发阶段的调试和查看运行效果。

    4、原子化服务由1个或多个HAP包组成,1个HAP包对应1个FA或1个PA。每个FA或PA均可独立运行,完成1个特定功能;1个或多个功能(对应FA或PA)完成1个特定的便捷服务。

2、探究Hap的结构

OpenHarmony 的 hap 包本质上是一个压缩包,可以更改后缀名解压压缩包看下 hap 包里的文件结构,解压出来的文件结构如下所示:

2.1 解压Hap包

在这里插入图片描述

2.2 Hap的目录结构

在这里插入图片描述

2.3 目录说明

Hap 包解压后,里边包含了一个 ets、resources两个 目录和三个配置文件。

  • ets:编译后的源码文件;
    • modules.abc:源码编译之后的方舟字节码
    • sourceMaps.map:配置项,个人理解为是abc文件的一个索引文件;
  • resources:资源文件;
  • module.json/pack.info: Hap 包的配置文件;
  • resources.index: 资源目录的索引文件;

abc 文件表示方舟字节码(ark bytecode,简称 abc),所以项目运行的时候 ark 虚拟机需要加载运行这些 abc 文件。

2.3.1 module.json

{"app": {"apiReleaseType": "Release","bundleName": "com.example.healthydiet","compileSdkType": "OpenHarmony","compileSdkVersion": "3.2.13.5","debug": true,"distributedNotificationEnabled": true,"icon": "$media:app_icon","iconId": 16777217,"label": "$string:app_name","labelId": 16777216,"minAPIVersion": 9,"targetAPIVersion": 9,"vendor": "example","versionCode": 1000000,"versionName": "1.0.0"},"module": {"abilities": [{"description": "$string:EntryAbility_desc","descriptionId": 16777218,"icon": "$media:icon","iconId": 16777362,"label": "$string:EntryAbility_label","labelId": 16777219,"name": "EntryAbility","skills": [{"actions": ["action.system.home"],"entities": ["entity.system.home"]}],"srcEntrance": "./ets/entryability/EntryAbility.ts","startWindowBackground": "$color:start_window_background","startWindowBackgroundId": 16777286,"startWindowIcon": "$media:icon","startWindowIconId": 16777362,"visible": true}],"compileMode": "esmodule","deliveryWithInstall": true,"dependencies": [],"description": "$string:module_desc","descriptionId": 16777262,"deviceTypes": ["default"],"installationFree": false,"mainElement": "EntryAbility","metadata": [{"name": "ArkTSPartialUpdate","value": "true"}],"name": "entry","pages": "$profile:main_pages","requestPermissions": [{"name": "ohos.permission.INTERNET"}],"type": "entry","virtualMachine": "ark9.0.0.0"}
}

module.json 是项目里的默认配置文件,只是在打包的时候添加了一些额外的默认配置,比如 distro 下添加了值为 ark 的 virtualMachine 字段,表示当前 hap 包表运行在 ark 虚拟机里等。

2.3.2 pack.info

{"summary": {"app": {"bundleName": "com.example.healthydiet","version": {"code": 1000000,"name": "1.0.0"}},"modules": [{"mainAbility": "EntryAbility","deviceType": ["default"],"abilities": [{"name": "EntryAbility","label": "$string:EntryAbility_label","visible": true}],"distro": {"moduleType": "entry","installationFree": false,"deliveryWithInstall": true,"moduleName": "entry"},"apiVersion": {"compatible": 9,"releaseType": "Release","target": 9}}]},"packages": [{"deviceType": ["default"],"moduleType": "entry","deliveryWithInstall": true,"name": "entry-default"}]
}

pack.info用来描述和定义软件包(Package)的信息和属性。

2.3.3 区别

pack.info 是关于整个软件包的信息,而 module.json 是关于单个模块的信息

  1. pack.info 是用于描述和定义整个软件包的信息,它位于软件包的根目录下,用于标识和描述软件包本身。 module.json
  2. 是用于描述一个模块的信息,它位于模块的根目录下,用于定义模块的属性和功能。

3、思考鸿蒙应用的启动流程

  1. 桌面点击应用App图标;
  2. 操作系统(OpenHarmony)检测到应用启动请求,并根据应用的包名和入口信息找到对应的 HAP 包路径;
  3. 操作系统加载 HAP 包的信息,并解析其中的配置文件,如 pack.info、module.json等;
  4. 操作系统根据配置文件中的入口信息,找到应用的入口类和入口方法;
  5. 操作系统创建应用的运行环境,并执行应用的入口类和入口方法;
  6. 应用的入口方法执行初始化操作,如创建应用窗口、注册事件监听器等,加载资源文件;
  7. 应用初始化完成后,执行渲染页面,执行生命周期,进行网络请求等;
  8. 用户关闭应用,应用关闭;

4、备注

可以通过 010 Editor 打开生成的字节码文件,部分内容如下所示:
在这里插入图片描述

class PreviewCustomCounter extends ViewPU {constructor(parent, params, __localStorage, elmtId = -1) {super(parent, __localStorage, elmtId);this.__weight = new ObservedPropertySimplePU(50, this, "weight");this.setInitiallyProvidedValue(params);}setInitiallyProvidedValue(params) {if (params.weight !== undefined) {this.weight = params.weight;}}updateStateVars(params) {}purgeVariableDependenciesOnElmtId(rmElmtId) {this.__weight.purgeDependencyOnElmtId(rmElmtId);}aboutToBeDeleted() {this.__weight.aboutToBeDeleted();SubscriberManager.Get().delete(this.id__());this.aboutToBeDeletedInternal();}get weight() {return this.__weight.get();}set weight(newValue) {this.__weight.set(newValue);}initialRender() {this.observeComponentCreation((elmtId, isInitialRender) => {ViewStackProcessor.StartGetAccessRecordingFor(elmtId);Row.create();if (!isInitialRender) {Row.pop();}ViewStackProcessor.StopGetAccessRecording();});{this.observeComponentCreation((elmtId, isInitialRender) => {ViewStackProcessor.StartGetAccessRecordingFor(elmtId);if (isInitialRender) {ViewPU.create(new CustomCounter(this, {value: this.weight + 'g',onDec: () => {this.weight -= 50;},onInc: () => {this.weight += 50;}}, undefined, elmtId));}else {this.updateStateVarsOfChildByElmtId(elmtId, {value: this.weight + 'g'});}ViewStackProcessor.StopGetAccessRecording();});}Row.pop();}rerender() {this.updateDirtyElements();}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313006.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPad产品如何升级BIOS程序

操作步骤: 重要提示: 更新BIOS存在风险!如果您的电脑在此过程中出现死机,系统崩溃或断电,则BIOS或UEFI固件程序可能会损坏,这将使您的电脑无法启动。 由于BIOS的版本或者在升级过程中出错,可能会造成不可…

Flink学习-时间和窗口

在流数据处理应用中,一个很重要、也很常见的操作就是窗口计算。所谓的“窗口”,一 般就是划定的一段时间范围,也就是“时间窗”;对在这范围内的数据进行处理,就是所谓的 窗口计算。所以窗口和时间往往是分不开的。 时…

HTML5+CSS3③——无语义布局标签、画盒子、CSS定义、CSS引入方式

目录 无语义布局标签 画盒子 CSS定义 小结 CSS引入方式 小结 无语义布局标签 画盒子 CSS定义 小结 CSS引入方式 小结

【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 一、概述 MyBatis简介 主要特性 1. 动态SQL 2.结果映射 3 .插件机制 二、MyBatis配置文件 1.配置文件结构 数据库连…

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到,node.js是基础,提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式,以加速开发。

详解全志R128 RTOS安全方案功能

介绍 R128 下安全方案的功能。安全完整的方案基于标准方案扩展&#xff0c;覆盖硬件安全、硬件加解密引擎、安全启动、安全系统、安全存储等方面。 配置文件相关 本文涉及到一些配置文件&#xff0c;在此进行说明。 env*.cfg配置文件路径&#xff1a; board/<chip>/&…

ROS学习记录:用C++实现对wpr_simulation软件包中机器人的运动控制

一、在工作空间下输入catkin_make进行编译 二、在工作空间中输入source ./devel/setup.bash后回车 三、机器人的运动控制在wpr_simulation中有一个例子程序&#xff0c;在工作空间中输入&#xff1a; roslaunch wpr_simulation wpb_simple.launch后回车 四、就会启动一个仿真环…

单目相机标定理论及张正友标定法总结

我们的真实世界是三维的&#xff0c;拍摄的图片是二维的&#xff0c;相机起到的就是映射的过程&#xff0c;可以把相机看成一个广义的函数&#xff0c;输入的三位场景&#xff0c;输出是二维的图片&#xff08;灰度图&#xff09;&#xff0c;一般情况下我们看到的是彩色图&…

从 MySQL 的事务 到 锁机制 再到 MVCC

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、事务 1.1 含义 1.2 ACID 二、锁机制 2.1 锁分类 2.2 隔离级别 三、MVCC 3.1 介绍 3.2 隔离级别 3.3 原理 四、总结 前…

B端产品学习-市场调研与分析

B端产品市场调研与分析 目录&#xff1a; 为什么要做产品调研 B端产品调研对比C端产品调研 B端产品调研要怎么做 为什么要做产品调研 杰克特劳特说过&#xff1a;“成为唯一。如果不能争得第一&#xff0c;那就找到一个能够成为第一的细分&#xff0c;这就是定位的第一法则…

关于“Python”的核心知识点整理大全54

目录 18.4 创建其他网页 18.4.1 模板继承 1. 父模板 base.html 注意 2. 子模板 index.html 注意 18.4.2 显示所有主题的页面 1. URL模式 urls.py 2. 视图 views.py 3. 模板 topics.html 18.4.3 显示特定主题的页面 1. URL模式 urls.py 2. 视图 views.py 往…

【C#】知识点实践序列之Lock的输出多线程信息

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2023年第2篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇在Lock锁定代码…