From 4f252d4ff2aea68f3a3a6612eadc828a25d4eacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E5=A5=87?= Date: Tue, 18 Oct 2022 15:31:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=89=E6=96=B9=E5=BA=93mi?= =?UTF-8?q?nizip-ng=E7=9A=84CMake=E5=8C=96=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蔡奇 --- minizip-ng/CMakeLists.txt | 112 ++++++++++++++++++++++ minizip-ng/README_zh.md | 4 +- minizip-ng/docs/hap_integrate.md | 140 ++++++++++++++++++++++++++++ minizip-ng/docs/pic/ets_results.png | Bin 0 -> 23937 bytes minizip-ng/docs/pic/install.png | Bin 0 -> 20161 bytes minizip-ng/docs/rom_integrate.md | 5 +- 6 files changed, 258 insertions(+), 3 deletions(-) create mode 100644 minizip-ng/CMakeLists.txt create mode 100644 minizip-ng/docs/hap_integrate.md create mode 100644 minizip-ng/docs/pic/ets_results.png create mode 100644 minizip-ng/docs/pic/install.png diff --git a/minizip-ng/CMakeLists.txt b/minizip-ng/CMakeLists.txt new file mode 100644 index 00000000..80106e9c --- /dev/null +++ b/minizip-ng/CMakeLists.txt @@ -0,0 +1,112 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.4.1) +project(minizip-ng) + +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../libiconv/ libiconv_binary_dir) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../openssl openssl_binary_dir) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../bzip2 bzip2_binary_dir) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../zstd zstd_binary_dir) + +set(MINIZIP_SOURCE_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/../libiconv/libiconv/ + ${CMAKE_CURRENT_SOURCE_DIR}/../libiconv/libiconv/lib/ + ${CMAKE_CURRENT_SOURCE_DIR}/../libiconv/libiconv/libcharset/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/crypto/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/include/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/include/openssl/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/crypto/modes/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/crypto/ec/curve448/ + ${CMAKE_CURRENT_SOURCE_DIR}/../openssl/openssl/crypto/ec/curve448/arch_32/ + ${CMAKE_CURRENT_SOURCE_DIR}/../bzip2/bzip2/ + ${CMAKE_CURRENT_SOURCE_DIR}/../zlib/zlib/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/liblzma/api/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/dos/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/lz/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/lzma/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/common/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/liblzma/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/liblzma/common/ + ${CMAKE_CURRENT_SOURCE_DIR}/../xz/xz/src/liblzma/check/ + ${CMAKE_CURRENT_SOURCE_DIR}/../zstd/zstd/ + ${CMAKE_CURRENT_SOURCE_DIR}/../zstd/zstd/lib/ + ${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/ + ) + +set(MINIZIP_DEFINITIONS + -DHAVE_BZIP2 + -DHAVE_INTTYPES_H + -DHAVE_PKCRYPT + -DHAVE_STDINT_H + -DHAVE_WZAES + -DHAVE_ZLIB + -DHAVE_ZSTD + -DHAVE_LZMA + -DMZ_ZIP_SIGNING + -DHAVE_ICONV + -DLZMA_API_STATIC + -D_POSIX_C_SOURCE=200112L + -DOPENSSL_ARM64_PLATFORM + -D_GNU_SOURCE + ) + +set(MINIZIP_SOURCE + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_compat.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_crypt.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_crypt_openssl.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_os.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_os_posix.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_buf.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_bzip.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_mem.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_os_posix.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_pkcrypt.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_split.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_wzaes.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_zlib.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_zip.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_zip_rw.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_lzma.c" + "${CMAKE_CURRENT_SOURCE_DIR}/minizip-ng/mz_strm_zstd.c") + +set(MINIZIP_FLAG -fPIC + -Wno-error=implicit-function-declaration + -Wall + -Wextra + -Wno-error=missing-braces + -Wno-missing-braces + -Wno-error=visibility + -Wno-visibility + -Wno-error=unused-function + -Wno-unused-function + -Wno-error=unused-variable + -Wno-unused-variable + -Wno-error=undef + -Wno-error=deprecated-declarations + -Wno-deprecated-declarations + -Wno-error=sign-compare + -Wno-error=parentheses-equality + -Wno-parentheses-equality + -Wno-incompatible-pointer-types + -Wno-unused-command-line-argument + -Wno-error=unused-parameter + -Wno-unused-parameter + -Wno-error=header-hygiene + -frtti + -fexceptions + -std=gnu99) + +add_library(minizip_shared SHARED ${MINIZIP_SOURCE}) +target_compile_options(minizip_shared PRIVATE ${MINIZIP_FLAG}) +target_compile_definitions(minizip_shared PRIVATE ${MINIZIP_DEFINITIONS}) +target_include_directories(minizip_shared PRIVATE ${MINIZIP_SOURCE_DIR}) + +target_link_libraries(minizip_shared bzip2) +target_link_libraries(minizip_shared iconv) +target_link_libraries(minizip_shared zstd) +target_link_libraries(minizip_shared openssl) +target_link_libraries(minizip_shared z) +target_link_libraries(minizip_shared xz) \ No newline at end of file diff --git a/minizip-ng/README_zh.md b/minizip-ng/README_zh.md index 14ffe46e..9c8cdc5b 100644 --- a/minizip-ng/README_zh.md +++ b/minizip-ng/README_zh.md @@ -7,11 +7,13 @@ minizip是一个用C编写的zip文件操作库。 - ROM版本:OpenHarmony3.2 Beta1 - API版本:9 - 三方库版本:3.0.4 -- 当前适配的功能:完成了创建和解压BZIP2、LZMA、XZ和ZSTD格式的zip文件 +- 当前适配的功能:完成了 .zip 格式文件的压缩、解压缩 - [License : zlib](https://github.com/zlib-ng/minizip-ng/tree/3.0.4/LICENSE) ## 集成方式 + [系统Rom包集成](docs/rom_integrate.md) ++ [应用Hap包集成](docs/hap_integrate.md) + diff --git a/minizip-ng/docs/hap_integrate.md b/minizip-ng/docs/hap_integrate.md new file mode 100644 index 00000000..119c2c85 --- /dev/null +++ b/minizip-ng/docs/hap_integrate.md @@ -0,0 +1,140 @@ +# minizip-ng 如何集成到应用hap +## 准备应用工程 +​ 本次验证所用的开发板型号为:rk3568。其中,系统源码版本为:openharmony 3.2 Beta1。 +### 准备应用开发环境 +- 开发工具:DevEco Studio 3.0 Beta4 +- SDK版本: openharmony API 9 + +### 增加构建脚本及配置文件 + +- 下载本仓库代码 + + ``` + cd ~/ + git clone git@gitee.com:openharmony-sig/tpc_c_cplusplus.git --depth=1 # 将本仓库下载到本地 + ``` + +- 仓库代码目录结构说明 + + ``` + tpc_c_cplusplus/minizip-ng + ├── docs # 存放三方库相关文档的文件夹 + ├── BUILD.gn # 构建脚本,支持rom包集成 + ├── bundle.json # 三方库组件定义文件 + ├── CMakeLists.txt # 构建脚本,支持hap包集成 + ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将上面的minizip-ng目录及其下面所有文件放在“工程名称\entry\src\main\cpp\third_party”文件夹下。 + +### 准备三方库源码 + +使用如下命令下载三方库minizip-ng源码。 +``` +cd ~/ +git clone -b 3.0.4 https://github.com/zlib-ng/minizip-ng.git +``` + +将下载的三方库minizip-ng的源码放在“工程名称\entry\src\main\cpp\third_party\minizip-ng”文件夹,如下: + +``` +工程名称/entry/src/main/cpp/third_party/minizip-ng +├── docs # 存放三方库相关文档的文件夹 +├── BUILD.gn # 构建脚本,支持rom包集成 +├── bundle.json # 三方库组件定义文件 +├── minizip-ng # 三方库minizip-ng源码目录 +├── CMakeLists.txt # 构建脚本,支持hap包集成 +├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 +├── README_zh.md +``` + +添加其它依赖的三方库 +由于minizip-ng依赖iconv、openssl、zlib、bzip2、zstd和lzma。另外,DevEco已经支持zlib库,只需引用库即可,所以,需要在工程中和minizip-ng源码平行的目录中添加以下库代码。 + +- [工程中添加iconv代码的方法]() +- [工程中添加openssl代码的方法]() +- [工程中添加bzip2代码的方法]() +- [工程中添加zstd代码的方法]() +- [工程中添加lzma代码的方法]() + +## 应用中使用三方库 +- 接口声明: + ``` + // 操作命令描述 + interface miniOptions { + include_path?:number // 包含全路径的方式压缩或者解压 + compress_level?:number // 压缩级别 + compress_method?:number // 压缩方式 + overwrite?:number // 以覆盖方式压缩或者解压 + append?:number // 以追加方式压缩或者解压 + disk_size?:number // 磁盘大小 + follow_links?:number // 跟踪符号链接 + store_links?:number // 存储符号链接 + zip_cd?:number // 压缩中心目录 + encoding?:number // 文件使用编码方式 + verbose?:number // 打印当前压缩/解压缩操作的进度 + } + // 接口参数描述 + interface miniProperty { + path:string // 压缩生成的文件/需要被解压的文件路径 + password?:string // 密码(可选) + operate?:string // 调用的接口名称(可选) + file_extract?:string // 保存解压后文件的文件夹(可选) + option:miniOptions // 操作命令描述 + directory?:string // 文件所在路径(可选) + files?:Array // 需要被压缩的文件列表(可选) + } + export const create : () => minizipNapi; + export class minizipNapi { + compress(data:object):number; + decompress(data:object):number; + } + ``` +- 接口使用:
+ 如下代码为ets中对minizip库压缩功能的使用。分别将file1.txt文件压缩成result.zip文件和将该result.zip文件中内容解压到out目录。 + + ``` + // 压缩文件 + compress({path:this.dir + "result.zip", operate:"compress", + option:{append:1, compress_level:9 }, files:[this.dir + "file1.txt"]}); + // 解压缩文件 + decompress({path:this.dir + "result.zip", operate:"decompress", + option:{overwrite:1, compress_level:9}, directory:this.dir + "out"}); + // 生成带密码,带全路径的压缩文件 + compress({path:this.dir + "result1.zip", password:"test", operate:"compress", + option:{overwrite:1,compress_level:9}, files:[this.dir + "file1.txt"]}); + // 解压带密码,带全路径的压缩文件 + decompress({path:this.dir + "result1.zip", password:"test", operate:"decompress", + option:{overwrite:1, compress_level:9}, directory:this.dir + "out"}) + ``` +- 应用中链接三方库 + 打开“工程名称\entry\src\main\cpp\CMakeLists.txt”,添加如下字段: + + ``` + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/minizip-ng) + add_library(entry SHARED minizipNapi.cpp minizip.cpp) + target_link_libraries(entry PUBLIC libace_napi.z.so minizip_shared) + ``` +## 编译工程 +- 连接上设备后,DevEco Studio就会显示被发现设备。然后,点击“运行”,即可依次完成该应用“编译”和“安装”的过程,如图: +  ![install](pic/install.png) +## 运行效果 +安装hap应用后,在ets界面依次完成:压缩文件、解压缩文件、生成带密码和带全路径的压缩文件、解压带密码和带全路径的压缩文件操作后的结果,如下图:
+ ![ets_results](pic/ets_results.png) + +## 参考资料 +- [本文档涉及的技术补充说明](rom_integrate.md) +- [本文档引用的相关参考](rom_integrate.md) +- [相关案例参考](rom_integrate.md) + + + + + + + + + + + diff --git a/minizip-ng/docs/pic/ets_results.png b/minizip-ng/docs/pic/ets_results.png new file mode 100644 index 0000000000000000000000000000000000000000..2b22c490bf3a513efca31d6b6433992227fceefd GIT binary patch literal 23937 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 literal 0 HcmV?d00001 diff --git a/minizip-ng/docs/pic/install.png b/minizip-ng/docs/pic/install.png new file mode 100644 index 0000000000000000000000000000000000000000..58ac7e732a58239c3c256f918f4cbe5dafe1601a GIT binary patch literal 20161 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 literal 0 HcmV?d00001 diff --git a/minizip-ng/docs/rom_integrate.md b/minizip-ng/docs/rom_integrate.md index 9a95619a..523a8327 100644 --- a/minizip-ng/docs/rom_integrate.md +++ b/minizip-ng/docs/rom_integrate.md @@ -15,12 +15,13 @@ |-- docs # 存放三方库相关文档的文件夹 |-- BUILD.gn # 构建脚本,支持rom包集成 |-- bundle.json # 三方库组件定义文件 + ├── CMakeLists.txt # 构建脚本,支持hap包集成 ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 ├── README_zh.md ``` - 将本仓库文件夹拷贝到third_party下 ``` - cp ~/tpc_c_cplusplus/minizipi-ng ~/openharmony/third_party/ -rf + cp ~/tpc_c_cplusplus/minizip-ng ~/openharmony/third_party/ -rf ``` ## 准备三方库源码 - 将源码下载到minizip-ng目录并将其解压出来。 @@ -98,7 +99,7 @@ hb build --target-cpu arm64 # 编译64位系统使用:arm64, 编译32位 ``` - 运行测试程序 程序安装完后,由于测试用例较多,我们准备了1个测试文件 test.c,测试了该库常用的zip文件压缩和解压缩功能,并和期望结果做对比,内容一致,如图: - ![results](pic/results.png) +  ![results](pic/results.png) ## 参考资料 - [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) - [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) -- Gitee