CH3-HarmonyOS开发基础

2023-11-17

背景

  • 移动应用前端界面的定制需要引用很多定制化的图片资源,包括系统图标等;
  • 应用还需要考虑国际化和本地化,这也需要应用中定义的资源限定词文件
  • 此 外,第三方库也是增强应用能力的有力工具。这些内容需要涉及到资源和库文件如何存储,以及在应用中如何引用这些资源

目标

  • 深入理解HarmonyOS APP和HAP的组成及工作原理
  • 掌握对应用关键资源的配置和访问方法

一、APP

  • HarmonyOs的应用软件包以APP Pack ( Application Package )形式发布,它是由一个或多个HAP( HarmonyOS Ability Package )以及描述每个HAP属性的pack.info组成。
    • HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开。

1.1 APP包组成

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

1.2 APP和HAP结构

20220112121906

二、Ability

2.1 Ability

  • Ability应用所具备的能力的抽象,一个应用可以包含一个或多个Ability。Ability分为两种类型:FA( Feature Ability)和PA( Particle Ability )。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。
  • libs(库文件)是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件),存放在libs目录。
  • 配置文件(config.json)包含应用中Ability的配置信息,用于声明应用的Ability,以及应用所需权限等信息。

2.2 pack.info

  • 描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。HAP的具体属性包括:
    • delivery-with-install表示该HAP是否支持随应用安装。“true”表示支持随应用安装;“false”表示不支持随应用安装;
    • name: HAP文件名;
    • module-type︰模块类型,entry或feature;device-type:表示支持该HAP运行的设备类型。

三、libs库文件

3.1 HAR

HAR(HarmonyOS Ability Resources)可以提供构建应用所需的所有内容,包括源代码、资源文件和config.json文件。HAR不同于HAP,HAR不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。

四、resources资源文件

4.1 resources目录

  • 应用的资源文件(字符串、图片、音频等)统一存放于resources目录下,便于开发者使用和维护。resources目录包括base目录与限定词目录

  • 目录结构

20220112123802

限定词目录

  • 限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成包括语言、文字、国家或地区、横竖屏、设备类型和屏幕密度等六个维度,限定词之间通过下划线(_)或者中划线( -)连接。开发者在创建限定词目录时,需要掌握限定词目录的命名要求以及与限定词目录与设备状态的匹配规则

20220112124309

  • 类型

20220112124121

20220112124215

base目录

  • 在应用开发的hml和js文件中使用$r的语法,可以对Js模块内的resources目录下的json资源进行格式化,获取相应的资源内容

    • res-defaults.json文件内容为
    {strings: {
    hello: 'hello world')
    
    • 对于js页面对象的属性$r,可以使用string类型的key参数,返回值为string类型,如:

      this.$r('strings.hello')
      

4.2 系统资源文件

  • 目前支持的系统资源文件

20220112124922

五、config配置文件

  • 应用的每个HAP的根目录下都存在一个“config.json”配置文件,文件内容主要涵盖以下三个方面:
    • 应用的全局配置信息,包含应用的包名、生产厂商、版本号等基本信息;
    • 应用在具体设备上的配置信息,包含应用的备份恢复、网络安全等能力;
    • HAP包的配置信息,包含每个Ability必须定义的基本属性(如包名、类名、类型以及Ability提供的能力),以及应用访问系统或其他应用受保护部分所需的权限等。

包含元素

  • “config.json”的内部结构;
    • app对象的内部结构;
    • deviceConfig对象的内部结构;
    • module对象的内部结构;
  • HAP与HAR的配置文件的合并

“config.json”

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

20220112130528

1. app对象

  • app对象包含应用的全局配置信息
"app": {
    "bundleName":"com.huawei.hiworld.example",
    "vendor": "huawei",
    "version":{ 
        "code": 2,
        "name": "2.0"
        }
}

20220112141903

2. deviceConfig对象

  • deviceConfig包含在具体设备上的应用配置信息,可以包含default、phone、tablet、tv、car、wearable、liteWearable和smartVision等属性。default标签内的配置是适用于所有设备通用。
"deviceConfig": {
    "default": {
        "process": "com.huawei.hiworld.example",
        "supportBackup": false,
        "network": {
            "cleartextTraffic": true,
            "securityConfig": {
                "domainSettings": { 
                    "cleartextPermitted": true,
                    "domains": [
                        {
                            "subdomains": true,
                            "name": "example.ohos.com"
                        }
                    ]
                }
            }
        }
    }
}

20220112142902

phone对象

20220112143144

3. module对象

module对象包含HAP包的配置信息

"module": {
    "mainAbility": "MainAbility",
    "package": "com.example.myapplication.entry",
    "name": ".MyOHOSAbilityPackage",
    "description": "$string:description_application",
    "supportedModes": ["drive"],
    "deviceType": ["car"],
    "distro": {
        "deliveryWithlnstall": true,
        "moduleName": "ohos_entry",
        "moduleType": "entry",
		...
    }
}

20220112143735

内部结构

20220112144507

3.1 distro对象
"distro": {
    "deliveryWithInstall":true,
    "moduleName":"ohos_entry",
    "moduleType":"entry",
    "installationFree":true
}

20220112144906

3.2 js对象
"js": [
    {
        "name": "default",
        "pages": [
            "pages/index/index",
            "pages/detail/detail"],
        "window": {
        	"designWidth": 750,
            "autoDesignWidth":false
        },
		"type": "form"
    }
]

20220112145024

3.3 abilities对象
"abilities": [
    {
        "name": ".MainAbility",
        "description": "himusic main ability",
        "icon": "$media:ic_launcher",
        "label": "HiMusic",
        "launchType": "standard",
        "orientation": "unspecified",
        "permissions": [], 
        "visible": true,
        "skills": [...],
        "type": "page"
    },
]

20220112145617

  • abilities对象的次要属性

20220112145645

skills对象
"skills": [
    {
        "actions": ["action.system.home"], 
        "entities": ["entity.system.home"],
        "uris": [
            {
                "scheme": "http",
                "host": "www.xxx.com",
                "port": "8080",
                "path": "query/student/name",
                "type": "text/*"
            }
        ]
    }
]

20220112150232

forms对象
"forms": [
    {
        "name": "Form_Js",
        "description": "It's Js Form",
        "type": "JS",
        "jsComponentName": "card",
        "colorMode": "auto",
        "isDefault": true,
        "updateEnabled": true,
        "scheduledUpdateTime": "11:00",
        "updateDuration": 1,
        "defaultDimension": "2*2",
        "supportDimensions": ["2*2","2*4","4*4"]
    },
]

20220112150521

配置文件的合并

  • 如果应用模块中调用了HAR,在编译构建HAP时,需要将HAP的“config.json”文件与 一个或多个HAR的“config.json”文件,合并为一个“config.json”文件。在合并过程中, 不同文件的同一个标签的取值可能发生冲突,此时,需要通过配置mergeRule来解决冲 突
合并规则
  • HAP与HAR的“config.json”文件合并时,需要将HAR的配置信息全部合并到HAP的配 置文件。系统定义了详细的合并规则;
  • HAP的优先级总是高于HAR。当HAP依赖于多个HAR时,先加载的HAR的优先级高于后 加载的HAR,按照HAR的加载顺序依次合并到HAP文件

六、HAR

6.1 在工程中添加Module

  • Module是HarmonyOS应用的基本功能单元,包含了源代码资源文件第三方库应用清单文件每一个Module都可以独立进行编译和运行。一个HarmonyOS应用通常会 包含一个或多个Module,因此,可以在工程中,创建多个Module,每个Module分为 AbilityLibrary(HarmonyOS Library和Java Library)两种类型

Module类型

  • 一个APP中,对于同一类型设备有且只有一个Entry Module,其余Module的类型均 为Feature。因此,在创建一个类型为Ability的Module时,遵循如下原则:
  • 若新增Module的设备类型为已有设备时,则Module的类型将自动设置为“Feature” 。
  • 若新增Module的设备类型为当前还没有创建Module,则Module的类型将自动设置为 “Entry”

6.2 新建空Module

20220112151637

6.3 创建HarmonyOS库

  • 创建库模块
  • 将库模块编译为HAR
  • 发布Har包到Maven仓
  • 为应用模块添加依赖
创建库Module

20220112151749

将库模块编译为HAR
  • 利用Gradle可以将HarmonyOS Library库模块构建为HAR包,以便在工程中引用HAR或 者将HAR包提供给其它开发者进行调用;
  • 构建HAR包的方法:在Gradle构建任务中,双击debugHarmonyHar或 releaseHarmonyHar任务,构建Debug类型或Release类型的HAR。

编译并输出库模块

20220112151853

发布Har包到Maven仓
  • 借助Gradle提供的Maven-publish插件,可以将Har包发布到本地或远程Maven仓,方 法如下:
    • 在工程根目录下,点击鼠标右键New > File,创建一个以“.gradle”结尾的文件,如 upload.gradle;
    • 在创建的upload.gradle文件中,添加一定代码
    • 在Har模块的build.gradle中添加HAR发布脚本。添加完成后,请点击Sync Now进行同步
    • 同步完成后,会在Gradle任务中增加publishing的任务列表;
    • 双击执行publishMavenPublicationToMavenRepository任务,将HAR包发布到指定的Maven地 址
为应用模块添加依赖
  • 在应用模块中调用HAR,常用的添加依赖的方式包括如下两种:

    • 调用同一个工程中的HAR:HAR包和应用模块在同一个工程,打开应用模块的build.gradle文 件,在dependencies闭包中,添加如下代码。添加完成后,请点击Sync Now同步工程。

       dependencies { 
       	implementation project(":mylibrary") 
       }
      
    • 调用Maven仓中的HAR:无论Har包是本地Maven仓还是远程Maven仓,均可以在工程的 build.gradle的allprojects闭包中,添加HAR所在的Maven仓地址。

      repositories { 
      	maven { 
      		url 'file://D:/01.localMaven/' 
      	}
      }
      

本章总结

  • 本章主要介绍了HarmonyOS APP和HAP包的组成,通过对这些包主要成分的介绍,引出如何构建HAR库文件如何在项目中引用库文件
  • 接着分析了重要成分资源文件配置文件的内容和作用,以及如何对它们进行访问和配置

  * `调用Maven仓中的HAR`:无论Har包是本地Maven仓还是远程Maven仓,<font color='cornflowerblue'>均可以在工程的 build.gradle的`allprojects闭包`中,添加HAR所在的Maven仓地址。 </font>

    ```
    repositories { 
    	maven { 
    		url 'file://D:/01.localMaven/' 
    	}
    }
    ```

    





# 本章总结 

* 本章主要介绍了HarmonyOS `APP和HAP包的组成`,通过对这些包主要成分的介绍,引出`如何构建HAR库文件`,`如何在项目中引用库文件`;
* 接着分析了`重要成分资源文件`和`配置文件`的内容和作用,以及`如何对它们进行访问和配置`







































































本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CH3-HarmonyOS开发基础 的相关文章

  • 为什么 JavaFX API 不包含在 Java 8 J2SE 中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有谁知道为什么 JavaFX 8 仍然不是即将推出的 Java 8 中的日常 J2SE API 显示所有 Java 组件的技术图清楚地将 Jav
  • 最终字段可能尚未/已经初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何处理抛出检查异常的静态最终字段初始值设定项 https stackoverflow com questions 1866770 how to handle a static final field
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • 我应该使用 JDBC getNString() 而不是 getString() 吗?

    我们正在构建一个由 Oracle 数据库支持的 Java 应用程序 我们使用 JDBC 驱动程序 访问该数据库ojdbc6 jar and orai18n jar 数据库模式主要使用以下方式存储文本列NVARCHAR2数据类型 The JD
  • 为什么这个动作不抽象? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我很难理解为什么一个类中的一个操作是抽象的 而另一个类中的操作不是 源代码1 编译时出错 https gyazo com cd3c
  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • 为本地@ExceptionHandler编写JUnit测试

    我有以下控制器 class Controller ResponseStatus HttpStatus OK RequestMapping value verifyCert method RequestMethod GET public vo
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • EJB 中 @Stateless 相对于 @Singleton 的真正用例是什么

    如果我正确理解EJB Singleton实际上与普通Java中的Singleton相同 也是spring中的单例 gt 一个实例 每个调用同时通过同一个实例 Stateless 声明一个 bean 它可以 但不得 具有多个实例 但限制是一个
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • java中的第三个布尔状态是什么?

    虽然我知道根据定义 布尔值仅包含两种状态 真或假 我想知道布尔值在用这些状态之一初始化之前有什么值 它默认为 false http java sun com docs books tutorial java nutsandbolts dat
  • 如何在启用嵌入时间戳和 LTV 的情况下签署 PDF?

    我正在尝试签署启用了时间戳和 LTV 的 pdf 以便它在 Adob e Reader 中显示如下 在英语中 这意味着 签名包含嵌入的时间戳 和 签名启用了 LTV 这是我正在使用的代码 PrivateKey pk get pk from
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • AES 密钥是随机的吗?

    AES 密钥可以通过此代码生成 KeyGenerator kgen KeyGenerator getInstance AES kgen init 128 but 如果我有一个 非常可靠 的生成随机数的方法 我可以这样使用它吗 SecureR
  • 检查 Java 字符串实例是否可能包含垃圾邮件数据的最简单方法

    我有一个迭代 String 实例的过程 每次迭代对 String 实例执行很少的操作 最后 String 实例被持久化 现在 我想为每次迭代添加一个检查 String 实例是否可能是垃圾邮件的检查 我只需验证 String 实例不是 成人材
  • 如何让JComboBox中的内容居中显示?

    目前我有这个JComboBox 我怎样才能将其中的内容居中 String strs new String 15158133110 15158133124 15158133458 JComboBox com new JComboBox str

随机推荐

  • 团队新人多,稳定性经验不足,研发质量怎么保障?|TakinTalks论道

    一分钟精华速览 在研发和稳定性保障过程中 人与设备 程序 组织的交互是一个复杂的过程 虽然人们极少会恶意犯错 但由于受特定情景下的实际条件影响 人为失误也时有发生 那么 如何尽可能减少这些失误的发生 如何保障研发质量和系统稳定 TakinT
  • 读《大数据时代》有感

    大数据时代 读后感 大数据时代 这本书主要描述的是大数据时代到临人们生活 工作与思维各方面所遇到的重大变革 文中清晰的阐述了大数据的基本概念和特点 并列出明确的观点 不管对于产业实践者 还是对于政府和公众机构 都非常具有价值 作者将本书分为
  • STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)

    1 软件准备 1 编程平台 Keil5 2 CubeMX 2 硬件准备 1 某宝买的RGB模块 4个灯珠级联 2 F1的板子 本例使用经典F103C8T6 3 ST link 下载器 4 杜邦线若干 3 模块资料 1 模块简介 没什么比手册
  • 图像目标检测之cascade-rcnn实践

    最近一直在调试目标检测方面的模型 其中mmdetection中就集成了许多的目标检测模型 其中表现比较好的模型中有cascade rcnn 因此也趁这个机会具体了解一下这个模型的发展脉络 1 模型原理 在two stage模型中 常见都会预
  • 【网络云盘客户端】——项目简介

    项目简介 网络云盘客户端时基于QT C 框架实现了一个网络云盘客户端软件 主要功能包括用户的注册 登录 显示用户的个人文件列表 以及文件的上传 下载 删除 共享文件 登录界面 主窗口界面 文件属性对话框 文件展示列表 上传文件 详细实现参考
  • 【图像处理】 常用边缘检测算法对比分析

    边缘的定义 首先介绍什么是边缘 在数字图像中 边缘是指图像局部变化最显著的部分 边缘主要存在于目标与目标 目标与背景之间 是图像局部特性的不连续性 如灰度的突变 纹理结构的图标 颜色的图标等 尽管图像的边缘点产生的原因各不相同 但他们都是图
  • [操作系统] 分页存储管理中的页表项长度

    看到很多人有疑问 读到这里的时候我也有疑问的 在操作系统的分页存储管理方式中 写道 将页表始址与页号和页表项长度的乘积相加 便得到该表项在页表中的位置 于是可从中得到该页的物理块号 将之装入物理地址寄存器中 列出式子出来 页表始址 页号x页
  • Java excel poi 下载模板功能无法在Microsoft Excel 打开,但是可以WPS Excel打开

    问题 并且只显示前几个字段 后面的几个字段不显示 版本使用
  • 我的 Android 求职简历

    昨晚在Diycode的微信交流群里面 有位在校的童鞋想要找一份开发的实习工作 他把简历做好后在群上共享了一份 我看到后便下载了一份 看了看简历内容 我在想如果我是招聘单位看简历的 这份简历可以说是基本没戏的 因为内容基本和开发没有多大关系
  • Qt5Error:msvc-version.conf loaded but QMAKE_MSC_VER ins‘t set

    错误描述 msvc version conf loaded but QMAKE MSC VER ins t set 解决方案 这种情况一般都是修改了项目的配置之后出现的 也就是 qmake stash文件出错 删除这个文件再进行重新编译即可
  • 基于python的布尔盲注爆破脚本(sqli-libs第八关)

    写这个脚本的原因是因为布尔爆破步骤的繁琐 因此写下这个半自动化脚本来提升效率 只需输入url和标志词便可开始爆破 下面结合sqli libs第八关来详细说明 这一关是布尔盲注 布尔盲注用于页面没有回显的情况下 但是心细的同学会发现当我们注入
  • 使用Microsoft.Reporting. WebForms中ReportViewer报表查看器(Server方式)

    添加Web Reference http
  • Flex程序编译

    Makefile三要素 目标 依赖 命令 详解可见makefile 编写 周北 CSDN博客 makefile 编写 Makefile中常用函数和自动化变量 wildcard 扩展通配符 例 OBJECTS wildcard o 该找到目标
  • C++构造函数中不调用虚函数的原因

    今天在看网上一篇帖子的时候看到这个问题 试讲关于C 对象虚函数表和类型信息的 RTTI 的 正好看到了如下内容 这个是为什么在构造函数中不能调用虚函数的原因 因为任何时候在基类中的虚函数调用 都不可能到达子类的实现 因为子类的虚表初始化是在
  • [docker]搭建elasticsearch服务

    1 拉取镜像 docker pull elasticsearch 8 7 0 如果需要其他版本的话 访问 Dockerhttps hub docker com ela
  • QT从入门到入土(四)——文件的读写操作

    引言 文件的读写是很多应用程序具有的功能 甚至某些应用程序就是围绕着某一种格式文件的处理而开发的 所以文件读写是应用程序开发的一个基本功能 Qt 提供了两种读写纯文本文件的基本方法 用 QFile 类的 IODevice 读写功能直接进行读
  • uniapp中的分享功能实现(APP,小程序,公众号)

    uniapp中的分享功能实现 APP 小程序 公众号 1 APP端的分享 app端的分享可以直接使用uniapp封装的方法uni share uni app的App引擎已经封装了微信 QQ 微博的分享SDK 开发者可以直接调用相关功能 可以
  • Android交叉编译OpenCV+FFmpeg+x264的艰难历程

    前言 如果你没有兴趣看完本文 只想获得可编译的代码或编译后的产物 可以直接点击下面的链接 跟随步骤编译代码或直接下载我编译好的产物 注 编译顺序要按照 x264 gt FFmpeg gt OpenCV 这样来 x264 FFmpeg Ope
  • 使用less处理重复性background-image定位问题

    1 问题描述 使用angular的列表循环解释问题 其他框架类似 css上面使用flex布局 index html代码 div class container div class item div class div p class ite
  • CH3-HarmonyOS开发基础

    文章目录 背景 目标 一 APP 1 1 APP包组成 1 2 APP和HAP结构 二 Ability 2 1 Ability 2 2 pack info 三 libs库文件 3 1 HAR 四 resources资源文件 4 1 reso