【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.mzph.cn/news/579801.shtml

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

相关文章

uniapp中uview的text组件

基本使用&#xff1a; 通过text参数设置文本内容。推荐您使用:textvalue的形式 <u--text text"我用十年青春,赴你最后之约"></u--text>设置主题&#xff1a; 通过type参数设置文本主题&#xff0c;我们提供了五类属性。primary error success warning…

javafx写一个文档编辑器

文本编辑器是一种用于编辑纯文本文件的工具。它具有基本的文本编辑功能,如插入、删除、复制、粘贴等。文本编辑器通常不具备格式化文本、排版和图形编辑等高级功能,专注于纯文本的编辑。常见的文本编辑器包括记事本(Notepad)、Sublime Text、Visual Studio Code、Atom、Emacs…

【leetcode100-021】【矩阵】搜索二维矩阵 II

【题干】 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 【思路】 以右上角为起点斜着看这个矩阵&#xff0c;会发现&#xff0c;这是一颗二叉搜索树。 …

中间件系列 - Redis入门到实战(高级篇-分布式缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 Redis持久化Redis主从Redis哨兵Redis分片集群 一 分…

每日一题——LeetCode876.链表的中间结点

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 1.题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&…

nginx-proxy-manager初次登录502 bad gateway

nginx-proxy-manager初次登录502 bad gateway 按照官方docker-compose安装后,页面如下: 默认账户密码: adminexample.com/changeme点击sign in,提示Bad Gateway 打开调试 重装后依然如此,最后查阅githup issue 找到答案 https://github.com/NginxProxyManager/nginx-proxy-…

【教学类-43-01】20231226 九宫格数独1.0

作品展示——九宫格数独&#xff08;正方形手工纸&#xff09; 背景需求&#xff1a; 最近陆续出了“X-Y比大小”“X-Y加法判断题”&#xff0c;发现1/3大4班孩子都能完成&#xff0c;3-4位孩子表示“太简单”。 大4班20号同学&#xff0c;做完0-10的判断题后说&#xff1a;“…

OpenHarmony开发者自测试框架初学指南

OH开发者自测试框架初学指南 前言前置环境搭建wsl2安装wsl2迁移源码下载编译环境 测试框架应用环境搭建libreadline-dev安装python库安装nfs-kernel-server验证 windows环境准备vscodeusbipd 生成测试用例更改BUILD.gn的配置项关于fuzz配置编写fuzz用例编译fuzz用例执行 后记 前…

redis在linux集群部署

1.下载redis wget http://download.redis.io/releases/redis-3.2.9.tar.gz 2.解压redis tar -zxvf redis-3.2.9.tar.gz 3.安装redis 在解压redis目录下 make install /usr/soft/redis/ 4.启动redis 在redis的bin目录 执行 ./redis.conf 5.设置redis 端口 密码 集群 vim redis.c…

mongodb聚合_删除_可视化工具

3.5 MongoDB中limit和skip MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录&#xff0c;可以使用MongoDB的Limit方法&#xff0c;limit()方法接受一个数字参数&#xff0c;该参数指定从MongoDB中读取的记录条数。limit()方法基本语法如下所示&#xff1a;…

跟着LearnOpenGL学习12--光照贴图

文章目录 一、前言二、漫反射贴图三、镜面光贴图3.1、采样镜面光贴图 一、前言 在跟着LearnOpenGL学习11–材质中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xf…

不浪费原料的汉堡制作方案(LeetCode日记)

LeetCode-1276-不浪费原料的汉堡制作方案 题目信息: 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 t o m a t o S l i c e s tomatoSlices tomatoSlices 和 c h e e s e S l i c…

【uniapp】Uniapp cli 自动化打包脚本实现

一、前言 通常使用uniapp开发app时&#xff0c;大多数会使用项目的云服务打包&#xff0c;否则的话再借助原生会变得极其复杂&#xff0c;还要去安装对应大内存的环境。如果恰好此时&#xff0c;你有一个需求是&#xff0c;可以随意的更换logo和封面、标题切换成另外一个app&a…

Hadoop集成对象存储和HDFS磁盘文件存储

1.环境配置 1.1 版本说明 组件版本是否必须其他事项Hadoop3.3.0是hadoop3.3.0之后原生支持国内主要对象存储Hive3.1.3否实测没有Hive也可以使用sparksql&#xff0c;使用hive更好的管理HDFS数据spark3.3.1是hive和spark整合后&#xff0c;语法为HSQL&#xff0c;自定义函数按…

深入理解 golang 中的反射机制

目录 什么是反射 反射的使用方法 反射的应用场景 反射的性能考量 反射的最佳实践 小结 反射机制是计算机科学中的一个重要概念&#xff0c;程序通过反射可以在运行时访问、检测和修改自身的状态和行为。Golang 作为静态类型的编译型语言&#xff0c;虽然在设计上倾向于简…

机器学习——决策树(三)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类&#xff0c;要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接&#xff1a;https://pan…

大语言模型激活函数绘图

使用torch中的激活函数&#xff0c;绘制多个激活函数多一个图中对比展示 引入依赖 import torch from torch.nn import functional as F import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Arial Unicode MS]定义单个曲线图的绘制函数 def draw_single_plot…

解决Pycharm pip安装模块太慢问题,pycharm2022没有manage repositories配置镜像源

解决方案 方法清华阿里云中国科技大学华中理工大学 或者直接-i 加镜像 方法 URL写下面任意一个 清华 https://pypi.tuna.tsinghua.edu.cn/simple阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/华中理工大学 http:/…

钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024发酵展

钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024济南生物发酵展&#xff01; 展位号&#xff1a;2号馆A65展位 2024第12届国际生物发酵产品与技术装备展览会&#xff08;济南&#xff09;于3月5-7日在山东国际会展中心盛大召开&#xff0c;展会同期将举办30余场高质…

LENOVO联想笔记本小新Pro 14 IRH8 2023款(83AL)电脑原装出厂Win11系统恢复预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1M1iSFahokiIHF3CppNpL4w?pwdzr8y 提取码&#xff1a;zr8y 联想原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等自带的预装软件程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件…