免费做销售网站有哪些,那些网站是php开发的,外贸网站销售方式,郑州推广优化公司一、前言
最近在搞公司标准产品适配OpenHarmony 平台#xff0c; 按照行业上的常用方法#xff0c;在Android 是将底层代码用c 封装成 xxx.so #xff0c;然后将其他一部分打包成 xxx.jar。 因此#xff0c;在OpenHarmony 平台也是打算按照这个模式。正所谓#xff0c;好…一、前言
最近在搞公司标准产品适配OpenHarmony 平台 按照行业上的常用方法在Android 是将底层代码用c 封装成 xxx.so 然后将其他一部分打包成 xxx.jar。 因此在OpenHarmony 平台也是打算按照这个模式。正所谓好记忆不如烂笔头写下这篇文章以后也可以翻阅查看。
二、相关概念
1. Android 平台
1.1 xxxx.so
静态库在程序编译时会被连接到目标代码中程序运行时将不再需要该静态库。编译之后程序文件大但加载快隔离性也好。 动态库在程序编译时并不会被连接到目标代码中而是在程序运行是才被载入因此在程序运行时还需要动态库存在。多个应用程序可以使用同一个动态库启动多个应用程序的时候只需要将动态库加载到内存一次即可。一般Linux 编译为xx.so Windows 编译为 xxx.dll.
编译动态库
在Linux Android
-shared 该选项指定生成动态连接库让连接器生成T类型的导出符号表有时候也生成弱连接W类型的导出符号不用该标志外部程序无法连接。相当于一个可执行文件 -fPIC表示编译为位置独立的代码不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要而不能达到真正代码段共享的目的。 -L.表示要连接的库在当前目录中 -ltest编译器查找动态连接库时有隐含的命名规则即在给出的名字前面加上lib后面加上.so来确定库的名称。
1.2 xxx.jar
在Java开发中JARJava Archive是一种常见的文件格式用于不同的场景。 JAR包是Java的类进行编译生成的class文件打包的压缩包通常用于存放类库和依赖。在开发过程中我们经常需要引用一些通用的类将这些类打包成JAR包便于管理和使用。例如当我们使用某些功能时就需要导入支持这些功能的JAR包。 2. OpenHarmony 平台
2.1 xxx.so
静态库在程序编译时会被连接到目标代码中程序运行时将不再需要该静态库。编译之后程序文件大但加载快隔离性也好。 动态库在程序编译时并不会被连接到目标代码中而是在程序运行是才被载入因此在程序运行时还需要动态库存在。多个应用程序可以使用同一个动态库启动多个应用程序的时候只需要将动态库加载到内存一次即可。
2.2 xxxx.har
在OpenHarmony 中这个是新平台因此也有跟Android 相类似的技术。
在 华为开发者文档有提到相关概念
应用程序包概述-应用程序包基础知识-开发基础知识-入门 | 华为开发者联盟 (huawei.com)
2.2.1 应用程序包概述
用户应用程序泛指运行在设备的操作系统之上为用户提供特定服务的程序简称“应用”。一个应用所对应的软件包文件称为“应用程序包”。
HarmonyOS提供了应用程序包开发、安装、查询、更新、卸载的管理机制方便开发者开发和管理HarmonyOS应用具体如下 应用软件所涉及的文件多种多样开发者可通过HarmonyOS提供的集成开发工具将其开发的可执行代码、资源、三方库等文件整合到一起制作成HarmonyOS应用程序包便于开发者对应用程序的部署。 应用软件所涉及的设备类型多种多样开发者可通过HarmonyOS提供的应用程序包配置文件指定其应用程序包的分发设备类型便于应用市场对应用程序包的分发管理。 应用软件所包含的功能多种多样将不同的功能特性按模块来划分和管理是一种良好的设计方式。HarmonyOS提供了同一应用程序的多包管理的机制开发者可以将不同的功能特性聚合到不同的包中方便后续的维护与扩展。 应用软件涉及的芯片平台多种多样有x86、ARM等还有32位、64位之分HarmonyOS为应用程序包屏蔽了芯片平台的差异使应用程序包在不同的芯片平台都能够安装运行。 应用软件涉及的软件信息多种多样有应用版本、应用名称、组件、申请权限等的信息HarmonyOS包管理为开发者提供了这些信息的查询接口方便开发者在程序中查询所需要的包信息。 应用软件涉及的资源多种多样有媒体资源、原生资源、字符资源以及国际化的资源等HarmonyOS包管理将不同的资源归档到不同的目录中并集成资源索引文件方便应用对资源的查找和使用。
2.2.2 应用程序包结构
在OpenHarmony 中应用程序包分为两种结构
Stage模型应用程序包结构FA模型应用程序包结构
2.3.1 基于Stage模型的应用结构
基于Stage模型开发的应用经编译打包后其应用程序包结构如下图应用程序包结构Stage模型所示
在开发态一个应用包含一个或者多个Module可以在DevEco Studio工程中创建一个或者多个Module。Module是HarmonyOS应用/服务的基本功能单元包含了源代码、资源文件、第三方库及应用/服务配置文件每一个Module都可以独立进行编译和运行。 Module分为“Ability”和“Library”两种类型“Ability”类型的Module对应于编译后的HAPHarmony Ability Package
“Library”类型的Module对应于HARHarmony Archive或者HSPHarmony Shared Package。
其中
开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件即HAP。HAP是HarmonyOS应用安装的基本单位包含了编译后的代码、资源、三方库及配置文件。
打包后的HAP包结构包括ets、libs、resources等文件夹和resources.index、module.json、pack.info等文件。
ets目录用于存放应用代码编译后的字节码文件。libs目录用于存放库文件。库文件是HarmonyOS应用依赖的第三方代码.so二进制文件。resources目录用于存放应用的资源文件字符串、图片等便于开发者使用和维护详见资源分类与访问。resources.index是资源索引表由IDE编译工程时生成。module.json是HAP的配置文件内容由工程配置中的module.json5和app.json5组成该文件是HAP中必不可少的文件。IDE会自动生成一部分默认配置开发者按需修改其中的配置。详细字段请参见应用配置文件。pack.info是Bundle中用于描述每个HAP属性的文件例如app中的bundleName和versionCode信息、module中的name、type和abilities等信息由IDE工具生成Bundle包时自动生成。 应用程序包结构Stage模型 2.2.3 共享包概述
HarmonyOS提供了两种共享包HARHarmony Archive静态共享包和HSPHarmony Shared Package动态共享包。
HAR与HSP都是为了实现代码和资源的共享都可以包含代码、C库、资源和配置文件. HAR和HSP在APP包中的形态示意图 2.2.3.1 HAR
HAR中的代码和资源跟随使用方编译如果有多个使用方它们的编译产物中会存在多份相同拷贝.
2.2.3.2 HSP
HSP中的代码和资源可以独立编译运行时在一个进程中代码也只会存在一份。
HAR不同于HAP不能独立安装运行在设备上只能作为应用模块的依赖项被引用。 三、HAR模式创建工程
HAR-共享包-应用程序包基础知识-开发基础知识-入门 | 华为开发者联盟 (huawei.com)
2.1 创建HAR工程
通过DevEco Studio创建一个HAR模块详见创建库模块。HAR模块默认不开启混淆能力开启混淆能力需要把HAR模块的build-profile.json5文件中的artifactType字段设置为obfuscation配置如下所示
{apiType: stageMode,buildOption: {artifactType: obfuscation}
}
artifactType字段有以下两种取值默认缺省为original。
original不混淆。obfuscation混淆。
需要对代码资产进行保护时建议开启混淆能力混淆能力开启后DevEco Studio在构建HAR时会对代码进行编译、混淆及压缩处理保护代码资产。
注意artifactType字段设置为obfuscation时apiType字段必须设置为stageMode因为Stage模型才支持混淆。
2.2 HAR开发注意事项
HAR不支持在配置文件中声明abilities、extensionAbilities组件。HAR不支持在配置文件中声明pages页面。HAR不支持在build-profile.json5文件的buildOption中配置worker。FA模型与Stage模型的HAR不支持相互引用。Stage模型的HAR不能引用AppScope内的内容。在编译构建时AppScope中的内容不会打包到HAR中导致HAR资源引用失败。
2.3 导出HAR的ArkUI组件、接口、资源
2.3.1 Index.ets接口文件
Index.ets文件是HAR导出声明文件的入口HAR需要导出的接口统一在Index.ets文件中导出。Index.ets文件是DevEco Studio默认自动生成的用户也可以自定义在模块的oh-package.json5文件中的main字段配置入口声明文件配置如下所示
{main: Index.ets
}
2.3.2 导出ArkUI组件
ArkUI组件的导出方式与ts的导出方式一致通过export导出ArkUI组件示例如下
// library/src/main/ets/components/MainPage/MainPage.ets
Component
export struct MainPage {State message: string Hello Worldbuild() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)}.width(100%)}.height(100%)}
}
HAR对外暴露的接口在Index.ets导出文件中声明如下所示
// library/Index.ets
export { MainPage } from ./src/main/ets/components/MainPage/MainPage
2.3.3 导出ts类和方法
// library/src/main/ts/test.ets
export class Log {static info(msg: string) {console.info(msg);}
}export function func() {return har func;
}export function func2() {return har func2;
}
HAR对外暴露的接口在Index.ets导出文件中声明如下所示
// library/Index.ets
export { Log } from ./src/main/ts/test
export { func } from ./src/main/ts/test
export { func2 } from ./src/main/ts/test
2.3.4 导出native方法
在HAR中也可以包含C编写的so。对于so中的native方法HAR通过以下方式导出以导出libnative.so的加法接口add为例
// library/src/main/ets/utils/nativeTest.ts
import native from libnative.soexport function nativeAdd(a: number, b: number) {let result: number native.add(a, b);return result;
}
HAR对外暴露的接口在Index.ets导出文件中声明如下所示
// library/Index.ets
export { nativeAdd } from ./src/main/ets/utils/nativeTest
2.3.5 资源
HAR模块编译打包时会把资源打包到HAR中。在编译构建HAP时DevEco Studio会从HAP模块及依赖的模块中收集资源文件如果不同模块下的资源文件出现重名冲突时DevEco Studio会按照以下优先级进行覆盖优先级由高到低
AppScope仅API9的Stage模型支持。HAP包自身模块。依赖的HAR模块如果依赖的多个HAR之间有资源冲突会按照依赖顺序进行覆盖依赖顺序在前的优先级较高。
2.3.6 HAR工程编译
开发及引用静态共享包API 9-开发及引用共享包-应用/服务开发-DevEco Studio使用指南-工具 | 华为开发者联盟 (huawei.com)
2.3.6.1 创建库模块
鼠标移到工程目录顶部单击右键选择New Module在工程中添加模块。在Choose Your Ability Template界面中选择Static Library并单击Nex。 3. 在Configure New Module界面中设置新添加的模块信息设置完成后单击Finish完成创建。
Module name新增模块的名称。Language开发语言。Device type支持的设备类型。Enable native是否创建一个用于调用C代码的模块 创建完成后会在工程目录中生成库模块及相关文件。
库模块的工程结构如下图所示 相关字段的描述如下其余字段与Entry或Feature模块相关字段相同可参考工程介绍。
libs用于存放.so文件。src main cpp types用于存放C API描述文件子目录按照so维度进行划分。src main cpp types liblibrary index.d.ts描述C接口的方法名、入参、返回参数等信息。src main cpp types liblibrary oh-package.json5描述so三方包声明文件入口和so包名信息。src main cpp CMakeLists.txtCMake配置文件提供CMake构建脚本。src main cpp hello.cpp共享包C代码源文件。index.ets共享包导出声明的入口。
2.3.6.2 编译库模块
开发完库模块后选中模块名然后通过DevEco Studio菜单栏的Build Make Module ${libraryName}进行编译构建生成HAR。HAR可用于工程其它模块的引用或将HAR上传至ohpm仓库供其他开发者下载使用。若部分源码文件不需要打包至HAR中可通过创建.ohpmignore文件配置打包时要忽略的文件/文件夹。 编译构建的HAR可在模块下的build目录下获取包格式为*.har。 在编译构建HAR时请注意以下事项
在编译构建HAR的过程中不会将模块中的C代码直接打包进.har文件中而是将C代码编译成动态依赖库.so文件放置在.har文件中的libs目录下。在编译构建HAR的过程中会生成资源文件ResourceTable.txt以便编辑器可以对HAR中的资源文件进行联想。因此如果不使用DevEco Studio对HAR进行构建则DevEco Studio的编辑器会无法联想HAR中的资源。
2.3.6.3 发布HAR
文档中心
1. 在库模块中与src文件夹同一级目录下添加如下文件 新建README.md文件在README.md文件中必须包含包的介绍和引用方式还可以根据包的内容添加更详细介绍。新建CHANGELOG.md文件填写HAR的版本更新记录。添加LICENSE文件LICENSE许可文件。 重新编译库模块生成*.har文件。利用工具ssh-keygen生成公、私钥可执行以下命令.
四、引用HAR的ArkUI组件、接口、资源
文档中心
引用HAR前需要先配置对HAR的依赖配置方式可参考引用HAR文件和资源。
4.1 配置app 工程 HAR 依赖
引用三方HAR包括从仓库进行安装、从本地文件夹和本地压缩包中进行安装三种方式。
4.1.1 引用ohpm仓中的HAR首先需要设置三方HAR的仓库信息。DevEco Studio默认仓库地址为OpenHarmony三方库中心仓如果您需要设置自定义仓库请在DevEco Studio的Terminal窗口执行如下命令执行命令前请确保将DevEco Studio中ohpm安装bin目录配置在“环境变量-系统变量-PATH”中第一次配置环境变量后需重启DevEco Studio
ohpm config set registry your_registry1,your_registry2
说明ohpm支持多个仓库地址采用英文逗号分隔。
然后通过如下两种方式设置三方包依赖信息
方式一在Terminal窗口中执行如下命令安装三方包DevEco Studio会自动在工程的oh-package.json5中自动添加三方包依赖。
ohpm install ohos/lottie
方式二在工程的oh-package.json5中设置三方包依赖配置示例如下
dependencies: {ohos/lottie: ^2.0.0
}
依赖设置完成后需要执行ohpm install命令安装依赖包依赖包会存储在工程的oh_modules目录下。
ohpm install
4.2 引用本地HAR包
引用本地HAR包有如下两种方式
方式一在Terminal窗口中执行如下命令进行安装并会在oh-package.json5中自动添加依赖。
ohpm install ./package.har
方式二在工程的oh-package.json5中设置三方包依赖配置示例如下
dependencies: {package: file:./package.har
}
依赖设置完成后需要执行ohpm install命令安装依赖包依赖包会存储在工程的oh_modules目录下。
ohpm install
在引用共享包时请注意以下事项
当前只支持在模块和工程下的oh-package.json5文件中声明dependencies依赖才会被当做依赖使用并在编译构建过程中进行相应的处理。 4.3 引用HAR的ArkUI组件
HAR的依赖配置成功后可以引用HAR的ArkUI组件。ArkUI组件的导入方式与ts的导入方式一致通过import引入HAR导出的ArkUI组件示例如下所示
// entry/src/main/ets/pages/Index.ets
import { MainPage } from libraryEntry
Component
struct Index {State message: string Hello Worldbuild() {Row() {// 引用HAR的ArkUI组件MainPage()Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)}.width(100%)}.height(100%)}
}
4.4 引用HAR的ts类和方法
通过import引用HAR导出的ts类和方法示例如下所示
// entry/src/main/ets/pages/Index.ets
import { Log } from library
import { func } from libraryEntry
Component
struct Index {build() {Row() {Column() {Button(Button).onClick((){// 引用HAR的类和方法Log.info(har msg);func();})}.width(100%)}.height(100%)}
}
4.5 引用HAR的native方法
通过import引用HAR导出的native方法示例如下所示
// entry/src/main/ets/pages/Index.ets
import { nativeAdd } from libraryEntry
Component
struct Index {State message: string Hello Worldbuild() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Button(nativeAdd(1, 2)).onClick(() {this.message result: nativeAdd(1, 2);})}.width(100%)}.height(100%)}
}
4.6 引用HAR的资源
通过$r引用HAR中的资源例如在HAR模块的src/main/resources里添加字符串资源在string.json中定义namehello_har和图片资源icon_har.png然后在Entry模块中引用该字符串和图片资源的示例如下所示
// entry/src/main/ets/pages/Index.ets
Entry
Component
struct Index {build() {Row() {Column() {// 引用HAR的字符串资源Text($r(app.string.hello_har)).fontSize(50).fontWeight(FontWeight.Bold)// 引用HAR的图片资源Image($r(app.media.icon_har))}.width(100%)}.height(100%)}
} /** * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ ┃ * ┃ ━ ┃ * ████━████ ┃ * ┃ ┃ * ┃ ┻ ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃ * ┃ ┃ * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ 神兽保佑,代码无bug * ┃ ┃ * ┃ ┃ * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * * author chenxi * date 2024年6月8日10:12:53 */ 参考HAR-共享包-应用程序包基础知识-开发基础知识-入门 | 华为开发者联盟 (huawei.com)