From 6069ca5f19bef35bfbcdc13a2e8c8879212be7f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E5=A5=87?= Date: Wed, 12 Oct 2022 18:52:26 +0800 Subject: [PATCH] add minizip-ng MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蔡奇 --- minizip-ng/BUILD.gn | 195 +++++++++++++++++++++++++++++++ minizip-ng/README.OpenSource | 11 ++ minizip-ng/README_zh.md | 17 +++ minizip-ng/bundle.json | 33 ++++++ minizip-ng/docs/pic/results.png | Bin 0 -> 55835 bytes minizip-ng/docs/rom_integrate.md | 108 +++++++++++++++++ 6 files changed, 364 insertions(+) create mode 100644 minizip-ng/BUILD.gn create mode 100644 minizip-ng/README.OpenSource create mode 100644 minizip-ng/README_zh.md create mode 100644 minizip-ng/bundle.json create mode 100644 minizip-ng/docs/pic/results.png create mode 100644 minizip-ng/docs/rom_integrate.md diff --git a/minizip-ng/BUILD.gn b/minizip-ng/BUILD.gn new file mode 100644 index 00000000..71b8ebb1 --- /dev/null +++ b/minizip-ng/BUILD.gn @@ -0,0 +1,195 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") + +declare_args() { + enable_minizip_test = false +} + +config("libminizip_config") { + include_dirs = [ + "//third_party/openssl/include", + "//third_party/openssl/include/openssl/", + "//third_party/minizip-ng/minizip-ng", + "//third_party/bzip2", + "//third_party/zlib", + "//third_party/iconv/", + "//third_party/iconv/libiconv", + "//third_party/xz/xz/", + "//third_party/xz/xz/src/liblzma/api/", + "//third_party/zstd/zstd", + "//third_party/zstd/zstd/lib/" + ] + + cflags = [ + "-fPIC", + "-Wall", + "-Wextra", + "-frtti", + "-fexceptions", + "-std=gnu99", + "-Wno-error=missing-braces", + "-Wno-error=visibility", + "-Wno-error=unused-function", + "-Wno-error=unused-variable", + "-Wno-error=undef", + "-Wno-error=deprecated-declarations", + "-Wno-error=sign-compare", + "-Wno-error=parentheses-equality", + "-Wno-incompatible-pointer-types", + "-Wno-error=unused-parameter", + "-Wno-error=header-hygiene", + "-Wno-error=implicit-function-declaration", + "-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", + ] +} + +ohos_shared_library("minizip_shared") { + sources = [ + "//third_party/minizip-ng/minizip-ng/mz_compat.c", + "//third_party/minizip-ng/minizip-ng/mz_crypt.c", + "//third_party/minizip-ng/minizip-ng/mz_crypt_openssl.c", + "//third_party/minizip-ng/minizip-ng/mz_os.c", + "//third_party/minizip-ng/minizip-ng/mz_os_posix.c", + "//third_party/minizip-ng/minizip-ng/mz_strm.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_buf.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_bzip.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_mem.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_os_posix.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_pkcrypt.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_split.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_wzaes.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_zlib.c", + "//third_party/minizip-ng/minizip-ng/mz_zip.c", + "//third_party/minizip-ng/minizip-ng/mz_zip_rw.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_lzma.c", + "//third_party/minizip-ng/minizip-ng/mz_strm_zstd.c", + ] + + configs = [ + ":libminizip_config" + ] + + deps = [ + "//third_party/openssl:libcrypto_shared", + "//third_party/zlib:libz_shared", + "//third_party/bzip2:libbz2", + "//third_party/iconv:iconv", + "//third_party/zstd:zstd_shared", + "//third_party/xz:libxz", + ] + + part_name = "minizip" +} + +ohos_executable("minizip") { + sources = [ + "./minizip-ng/minizip.c", + ] + + cflags = [ + "-DHAVE_BZIP2", + "-DHAVE_ICONV", + "-DHAVE_INTTYPES_H", + "-DHAVE_LZMA", + "-DHAVE_PKCRYPT", + "-DHAVE_STDINT_H", + "-DHAVE_WZAES", + "-DHAVE_ZLIB", + "-DHAVE_ZSTD", + "-DLZMA_API_STATIC", + "-DMZ_ZIP_SIGNING", + "-D_POSIX_C_SOURCE=200112L", + ] + + deps = [ + "//third_party/minizip-ng:minizip_shared", + ] + + part_name = "minizip" +} + +ohos_executable("minigzip") { + sources = [ + "./minizip-ng/minigzip.c", + ] + + public_configs = [ ":libminizip_config" ] + + deps = [ + "//third_party/minizip-ng:minizip_shared", + ] + + part_name = "minizip" +} + +config ("minizip_config") { + include_dirs = [ + "//third_party/minizip-ng/minizip-ng", + "//third_party/minizip-ng/minizip-ng/test", + ] + + cflags = [ + "-DHAVE_COMPAT", + "-DHAVE_BZIP2", + "-DHAVE_INTTYPES_H", + "-DHAVE_PKCRYPT", + "-DHAVE_STDINT_H", + "-DHAVE_WZAES", + "-DHAVE_ZLIB", + "-DHAVE_LZMA", + "-DHAVE_ZSTD", + "-DMZ_ZIP_SIGNING", + "-DZLIB_COMPAT", + "-D_POSIX_C_SOURCE=200112L" + ] +} + +ohos_executable("minizip_test") { + sources = [ + "./minizip-ng/test/test.c" + ] + + public_configs = [ ":minizip_config" ] + + deps = [ + "//third_party/minizip-ng:minizip_shared", + ] + + part_name = "minizip" +} + + +group ("samples") { + if(enable_minizip_test) { + deps = [ + ":minizip", + ":minigzip", + ":minizip_test", + ] + } else { + deps = [] + } +} diff --git a/minizip-ng/README.OpenSource b/minizip-ng/README.OpenSource new file mode 100644 index 00000000..c96ef5a5 --- /dev/null +++ b/minizip-ng/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "minizip-ng", + "License": "zlib", + "License File": "COPYRIGHT", + "Version Number": "3.0.4", + "Owner": "caiqi14@huawei.com", + "Upstream URL": "https://github.com/zlib-ng/minizip-ng", + "Description": "minizip-ng is a zip manipulation library written in C that is supported on Windows, macOS, and Linux." + } +] \ No newline at end of file diff --git a/minizip-ng/README_zh.md b/minizip-ng/README_zh.md new file mode 100644 index 00000000..14ffe46e --- /dev/null +++ b/minizip-ng/README_zh.md @@ -0,0 +1,17 @@ +# minizip-ng 三方库说明 +## 功能简介 +minizip是一个用C编写的zip文件操作库。 +## 使用约束 + +- IDE版本:DevEco Studio 3.0 Beta4 +- ROM版本:OpenHarmony3.2 Beta1 +- API版本:9 +- 三方库版本:3.0.4 +- 当前适配的功能:完成了创建和解压BZIP2、LZMA、XZ和ZSTD格式的zip文件 +- [License : zlib](https://github.com/zlib-ng/minizip-ng/tree/3.0.4/LICENSE) + +## 集成方式 + ++ [系统Rom包集成](docs/rom_integrate.md) + + diff --git a/minizip-ng/bundle.json b/minizip-ng/bundle.json new file mode 100644 index 00000000..c86c812e --- /dev/null +++ b/minizip-ng/bundle.json @@ -0,0 +1,33 @@ +{ + "name": "@ohos/minizip", + "description": "minizip-ng is a zip manipulation library written in C that is supported on Windows, macOS, and Linux.", + "version": "3.1", + "license": "zip", + "publishAs": "code-segment", + "segment": { + "destPath": "third_party/minizip-ng" + }, + "dirs": {}, + "scripts": {}, + "readmePath": { + "en": "README" + }, + "component": { + "name": "minizip", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": [], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": ["//third_party/minizip-ng:minizip_shared","//third_party/minizip-ng:samples"], + "inner_kits": [], + "test": [] + } + } +} \ No newline at end of file diff --git a/minizip-ng/docs/pic/results.png b/minizip-ng/docs/pic/results.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee6b6d75392e0effb99cfa512ed60873649f94a GIT binary patch literal 55835 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 literal 0 HcmV?d00001 diff --git a/minizip-ng/docs/rom_integrate.md b/minizip-ng/docs/rom_integrate.md new file mode 100644 index 00000000..9a95619a --- /dev/null +++ b/minizip-ng/docs/rom_integrate.md @@ -0,0 +1,108 @@ +# minizip-ng如何集成到系统Rom +## 准备源码工程 +本库是基于OpenHarmony-v3.2-Beta1版本,在润和RK3568开发板上验证的。如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +## 准备系统Rom源码 +源码获取方法请参照:[OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) +## 增加构建脚本及配置文件 +- 下载本仓库代码 + ``` + 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 # 三方库组件定义文件 + ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` +- 将本仓库文件夹拷贝到third_party下 + ``` + cp ~/tpc_c_cplusplus/minizipi-ng ~/openharmony/third_party/ -rf + ``` +## 准备三方库源码 +- 将源码下载到minizip-ng目录并将其解压出来。 +``` +cd ~/OpenHarmony/third_party/minizip-ng # 进入到minizip目录 +git clone -b 3.0.4 https://github.com/zlib-ng/minizip-ng.git # 下载三方库 +``` +## 系统Rom中引入三方库测试程序 +准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md)。 +我们默认三方库是属于OpenHarmony的thirdparty子系统,如果需要自己定义子系统参考文档[如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) +在OpenHarmony源码的vendor/hihope/rk356/config.json文件,新增需要编译的组件,如下: +``` +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "minizip", + "features": [] + } + ] +} +``` +## 系统Rom中引入三方库测试程序 +在OpenHarmony源码的vendor/hihope/rk356/config.json文件,对应组件的features中打开编译选项,如下: +``` +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "minizip", + "features": ["enable_minizip_test=true"] + } + ] +} +``` +## 编译工程 +在OpenHarmony源码根目录下 +``` +cd ~/openharmony +``` +- 选择产品 +``` +hb set # 该命令会列出所有可选平台,这里我们选择rk3568 +``` +- 运行编译 +``` +hb build --target-cpu arm64 # 编译64位系统使用:arm64, 编译32位系统使用:arm +``` +- 生成文件的路径,可执行文件和库文件都在out/rk3568/thirdparty/minizip目录下,同时也打包到了镜像中 +## 运行效果 +将编译生成的库和测试文件放到板子上运行,为避免每次将文件推入设备都烧录整个镜像,我们使用hdc_std工具将文件推到开发板上 +- 首先将hdc_std工具编译出来 + ``` + hb set # 首先,源码根目录下使用hb set 选择产品ohos-sdk + hb build # 然后,编译。最后,工具编译出来在out/sdk/ohos-sdk/windows/toolchains/hdc_std.exe + ``` +- 将工具拷贝到Windows,可以为工具目录配置环境变量,也可以在工具所在目录打开windows命令行 +- 将原生库测试需要的所有文件打包成minizip.tar,并拷贝到windows下 +- 将文件推送到开发板,在windows命令行进行如下操作 + ``` + hdc_std shell mount -o remount,rw / # 修改系统权限为可读写 + hdc_std file send minizip.tar / # 将文件包推入开发板 + hdc_std shell # 进入开发板 + tar xvf minizip.tar # 解压 + cd minizip # 进入minizip目录 + mv libminizip_shared.z.so /system/lib64/ # 64位系统需要将库文件拷贝到系统lib64目录, 32位系统则是lib目录 + ``` +- 运行测试程序 + 程序安装完后,由于测试用例较多,我们准备了1个测试文件 test.c,测试了该库常用的zip文件压缩和解压缩功能,并和期望结果做对比,内容一致,如图: + ![results](pic/results.png) +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96) +- [标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md) +- [如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) \ No newline at end of file -- Gitee