ITPub博客

首页 > 应用开发 > IT综合 > OpenHarmony平台libzip移植实践:交叉编译与HNP打包深度解析

OpenHarmony平台libzip移植实践:交叉编译与HNP打包深度解析

投稿 IT综合 作者:bhluo 时间:2025-12-08 10:17:39 0 删除 编辑

# OpenHarmony平台libzip移植实践:交叉编译与HNP打包深度解析


## 一、OpenHarmony交叉编译环境构建


### 1.1 OpenHarmony SDK环境配置


```bash

# 下载并配置OpenHarmony NDK

# 获取最新OpenHarmony SDK

wget https://repo.huaweicloud.com/harmonyos/compiler/ohos-sdk/ohos-sdk-linux-3.2.11.9.tar.gz

tar -xzf ohos-sdk-linux-3.2.11.9.tar.gz -C /opt/


# 设置环境变量

export OHOS_SDK=/opt/ohos-sdk/linux

export OHOS_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin

export OHOS_SYSROOT=${OHOS_SDK}/native/sysroot

export PATH=${OHOS_TOOLCHAIN}:$PATH


# 验证工具链

aarch64-linux-ohos-clang --version

llvm-ranlib --version


# 创建交叉编译配置文件

cat > ${OHOS_SDK}/ohos_config.cmake << EOF

# OpenHarmony 工具链配置

set(OHOS_ARCH "arm64-v8a")

set(OHOS_PLATFORM "ohos")

set(OHOS_SDK_ROOT "\${CMAKE_CURRENT_LIST_DIR}")

set(CMAKE_SYSTEM_NAME Generic)

set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER \${OHOS_SDK_ROOT}/native/llvm/bin/aarch64-linux-ohos-clang)

set(CMAKE_CXX_COMPILER \${OHOS_SDK_ROOT}/native/llvm/bin/aarch64-linux-ohos-clang++)

set(CMAKE_AR \${OHOS_SDK_ROOT}/native/llvm/bin/llvm-ar)

set(CMAKE_RANLIB \${OHOS_SDK_ROOT}/native/llvm/bin/llvm-ranlib)

set(CMAKE_STRIP \${OHOS_SDK_ROOT}/native/llvm/bin/llvm-strip)


# 系统根目录

set(CMAKE_SYSROOT \${OHOS_SDK_ROOT}/native/sysroot)

set(CMAKE_FIND_ROOT_PATH \${CMAKE_SYSROOT})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)


# 编译标志

set(CMAKE_C_FLAGS "--target=aarch64-linux-ohos -march=armv8-a")

set(CMAKE_CXX_FLAGS "\${CMAKE_C_FLAGS} -std=c++17")

set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld -Wl,--gc-sections")

EOF

```


### 1.2 构建系统基础组件


```python

# build.py - OpenHarmony构建脚本框架

#!/usr/bin/env python3

"""

OpenHarmony libzip构建自动化脚本

"""


import os

import sys

import shutil

import subprocess

from pathlib import Path


class OpenHarmonyBuilder:

    def __init__(self, config_path="build_config.json"):

        self.project_root = Path(__file__).parent.absolute()

        self.config = self.load_config(config_path)

        self.setup_environment()

    

    def load_config(self, config_path):

        """加载构建配置"""

        import json

        config_file = self.project_root / config_path

        

        default_config = {

            "sdk_path": "/opt/ohos-sdk/linux",

            "target_arch": "arm64-v8a",

            "api_level": 9,

            "build_type": "Release",

            "install_prefix": "./output/ohos",

            "dependencies": {

                "zlib": "1.2.13",

                "openssl": "3.0.8",

                "bzip2": "1.0.8"

            }

        }

        

        if config_file.exists():

            with open(config_file, 'r') as f:

                user_config = json.load(f)

                default_config.update(user_config)

        

        return default_config

    

    def setup_environment(self):

        """设置交叉编译环境"""

        os.environ['OHOS_SDK'] = self.config['sdk_path']

        os.environ['OHOS_TOOLCHAIN'] = f"{self.config['sdk_path']}/native/llvm/bin"

        os.environ['OHOS_SYSROOT'] = f"{self.config['sdk_path']}/native/sysroot"

        

        # 添加到PATH

        toolchain_path = os.environ['OHOS_TOOLCHAIN']

        if toolchain_path not in os.environ['PATH']:

            os.environ['PATH'] = f"{toolchain_path}:{os.environ['PATH']}"

        

        print(f"环境配置完成:")

        print(f"  SDK路径: {self.config['sdk_path']}")

        print(f"  目标架构: {self.config['target_arch']}")

    

    def run_cmd(self, cmd, cwd=None):

        """执行命令并检查结果"""

        print(f"执行: {cmd}")

        result = subprocess.run(

            cmd,

            shell=True,

            cwd=cwd or self.project_root,

            capture_output=True,

            text=True

        )

        

        if result.returncode != 0:

            print(f"错误: {result.stderr}")

            raise RuntimeError(f"命令执行失败: {cmd}")

        

        return result.stdout


# 主构建流程

if __name__ == "__main__":

    builder = OpenHarmonyBuilder()

    print("OpenHarmony构建环境就绪")

```


## 二、依赖库的交叉编译适配


### 2.1 zlib库编译适配


```bash

#!/bin/bash

# build_zlib_ohos.sh - zlib OpenHarmony交叉编译


# 设置变量

ZLIB_VERSION="1.2.13"

SOURCE_DIR="zlib-${ZLIB_VERSION}"

BUILD_DIR="build_ohos"

INSTALL_DIR="$(pwd)/output/ohos"


# 下载源码

if [ ! -d "${SOURCE_DIR}" ]; then

    wget https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz

    tar -xzf zlib-${ZLIB_VERSION}.tar.gz

fi


# 创建构建目录

mkdir -p ${BUILD_DIR}

cd ${BUILD_DIR}


# 配置环境

export CC=aarch64-linux-ohos-clang

export CXX=aarch64-linux-ohos-clang++

export AR=llvm-ar

export RANLIB=llvm-ranlib

export STRIP=llvm-strip

export CFLAGS="--target=aarch64-linux-ohos -march=armv8-a -fPIC -O2"

export CXXFLAGS="${CFLAGS} -std=c++17"

export LDFLAGS="-fuse-ld=lld -static-libstdc++"


# 运行CMake配置

cmake ../${SOURCE_DIR} \

    -DCMAKE_SYSTEM_NAME=Generic \

    -DCMAKE_SYSTEM_PROCESSOR=aarch64 \

    -DCMAKE_C_COMPILER=${CC} \

    -DCMAKE_CXX_COMPILER=${CXX} \

    -DCMAKE_AR=${AR} \

    -DCMAKE_RANLIB=${RANLIB} \

    -DCMAKE_STRIP=${STRIP} \

    -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \

    -DCMAKE_BUILD_TYPE=Release \

    -DBUILD_SHARED_LIBS=OFF \

    -DSKIP_INSTALL_FILES=OFF


# 编译和安装

make -j$(nproc)

make install


echo "zlib编译完成,安装到: ${INSTALL_DIR}"


# 验证编译结果

file ${INSTALL_DIR}/lib/libz.a

```


### 2.2 CMake工具链文件编写


```cmake

# ohos_toolchain.cmake - OpenHarmony专用工具链配置

set(CMAKE_SYSTEM_NAME Generic)

set(CMAKE_SYSTEM_PROCESSOR aarch64)


# 编译器设置

set(CMAKE_C_COMPILER aarch64-linux-ohos-clang)

set(CMAKE_CXX_COMPILER aarch64-linux-ohos-clang++)

set(CMAKE_AR llvm-ar CACHE FILEPATH "Archiver")

set(CMAKE_RANLIB llvm-ranlib CACHE FILEPATH "Ranlib")

set(CMAKE_STRIP llvm-strip CACHE FILEPATH "Strip")

set(CMAKE_NM llvm-nm CACHE FILEPATH "Nm")


# 编译标志

set(COMMON_FLAGS "--target=aarch64-linux-ohos -march=armv8-a")

set(CMAKE_C_FLAGS "${COMMON_FLAGS} -fPIC -O2 -DOHOS_BUILD" CACHE STRING "C flags")

set(CMAKE_CXX_FLAGS "${COMMON_FLAGS} -fPIC -O2 -std=c++17 -DOHOS_BUILD" CACHE STRING "C++ flags")

set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld -static-libstdc++" CACHE STRING "Linker flags")

set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "Shared linker flags")


# 查找路径配置

set(CMAKE_FIND_ROOT_PATH "/opt/ohos-sdk/linux/native/sysroot")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)


# OpenHarmony特定定义

add_definitions(-D_OHOS_ -D__OHOS__ -D__OPENHARMONY__)


# 系统信息

set(OHOS TRUE)

set(OHOS_API_LEVEL 9)

set(OHOS_ARCH "arm64-v8a")


# 安装路径

set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install path")

```


## 三、libzip源码适配与交叉编译


### 3.1 libzip源码获取与补丁应用


```bash

#!/bin/bash

# prepare_libzip_ohos.sh - libzip源码准备与补丁


LIBZIP_VERSION="1.9.2"

LIBZIP_SRC="libzip-${LIBZIP_VERSION}"

PATCH_DIR="patches"


# 下载源码

if [ ! -d "${LIBZIP_SRC}" ]; then

    wget https://libzip.org/download/libzip-${LIBZIP_VERSION}.tar.gz

    tar -xzf libzip-${LIBZIP_VERSION}.tar.gz

fi


# 创建补丁目录

mkdir -p ${PATCH_DIR}


# 生成OpenHarmony适配补丁

cat > ${PATCH_DIR}/ohos_support.patch << 'EOF'

diff --git a/CMakeLists.txt b/CMakeLists.txt

index 1234567..abcdefg 100644

--- a/CMakeLists.txt

+++ b/CMakeLists.txt

@@ -45,6 +45,12 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Android")

   set(ANDROID TRUE)

 endif()

 

+# OpenHarmony平台检测

+if(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND DEFINED OHOS)

+  set(OPENHARMONY TRUE)

+  add_definitions(-DOPENHARMONY)

+endif()

+

 # 编译器检查

 include(CheckCSourceCompiles)

 include(CheckFunctionExists)

@@ -120,6 +126,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows")

   set(HAVE__STRTOI64 1)

 endif()<"www.8w.fsjdpx.com">

 

+# OpenHarmony特定配置

+if(OPENHARMONY)

+  set(HAVE_ARC4RANDOM 0)

+  set(HAVE_GETRANDOM 0)

+endif()

 

 # 依赖检查

 find_package(ZLIB REQUIRED)

diff --git a/lib/zip_random.c b/lib/zip_random.c

index abcdefg..hijklmn 100644

--- a/lib/zip_random.c

+++ b/lib/zip_random.c

@@ -35,6 +35,10 @@

 #include <unistd.h>

 #endif

 

+#ifdef OPENHARMONY

+#include <stdlib.h>

+#endif

+

 #include "zipint.h"

 

 

@@ -62,6 +66,12 @@ _zip_random(zip_uint32_t *value) {

     return 0;

 }

 

+#ifdef OPENHARMONY

+    // OpenHarmony使用rand作为随机源

+    *value = (zip_uint32_t)rand();

+    return 0;

+#endif

+

 #if defined(HAVE_ARC4RANDOM)

     *value = arc4random();

     return 0;

EOF


# 应用补丁

cd ${LIBZIP_SRC}

patch -p1 < ../${PATCH_DIR}/ohos_support.patch


echo "libzip源码适配完成"

```


### 3.2 libzip交叉编译配置


```cmake

# libzip_ohos.cmake - OpenHarmony专用构建配置

# 加载OpenHarmony工具链

include(${CMAKE_CURRENT_LIST_DIR}/ohos_toolchain.cmake)


# 项目设置

project(libzip C CXX)

set(LIBZIP_VERSION "1.9.2")


# 查找依赖库

find_package(ZLIB REQUIRED)

find_package(BZip2 REQUIRED)

find_package(OpenSSL REQUIRED)


# 配置选项

option(BUILD_SHARED_LIBS "Build shared libraries" OFF)

option(BUILD_TOOLS "Build zip tools" ON)

option(BUILD_EXAMPLES "Build examples" OFF)

option(BUILD_DOC "Build documentation" OFF)

option(BUILD_REGRESS "Build regression tests" OFF)


# OpenHarmony特定设置

if(OHOS)

    add_definitions(-D_OHOS_ -D__OHOS__)

    set(CMAKE_POSITION_INDEPENDENT_CODE ON)

    

    # 关闭OpenHarmony不支持的功能

    set(HAVE_ARC4RANDOM OFF)

    set(HAVE_GETRANDOM OFF)

    set(HAVE_CRYPTO OFF)

    

    # 修改默认加密后端

    set(WITH_COMMONCRYPTO OFF)

    set(WITH_GNUTLS OFF)

    set(WITH_MBEDTLS OFF)

    set(WITH_OPENSSL ON)

endif()


# 包含目录

include_directories(

    ${CMAKE_CURRENT_SOURCE_DIR}

    ${CMAKE_CURRENT_BINARY_DIR}

    ${ZLIB_INCLUDE_DIRS}

    ${OPENSSL_INCLUDE_DIR}

)


# 源文件

file(GLOB LIBZIP_SOURCES

    lib/*.c

    lib/*.h

)


file(GLOB LIBZIP_HEADERS

    zip.h

    zipconf.h

)


# 创建目标

if(BUILD_SHARED_LIBS)

    add_library(zip SHARED ${LIBZIP_SOURCES})

else()

    add_library(zip STATIC ${LIBZIP_SOURCES})

endif()


# 链接库

target_link_libraries(zip

    ${ZLIB_LIBRARIES}

    ${BZIP2_LIBRARIES}

    OpenSSL::SSL

    OpenSSL::Crypto

)


# 编译属性设置

target_compile_features(zip PRIVATE c_std_99)

set_target_properties(zip PROPERTIES

    VERSION ${LIBZIP_VERSION}

    SOVERSION 1

    OUTPUT_NAME "zip"

)


# 安装配置

install(TARGETS zip

    ARCHIVE DESTINATION lib

    LIBRARY DESTINATION lib

    RUNTIME DESTINATION bin

)


install(FILES ${LIBZIP_HEADERS}

    DESTINATION include

)


# 构建工具(可选)

if(BUILD_TOOLS)

    add_executable(zipcmp src/zipcmp.c)

    target_link_libraries(zipcmp zip)

    

    add_executable(zipmerge src/zipmerge.c)

    target_link_libraries(zipmerge zip)

    

    install(TARGETS zipcmp zipmerge

        DESTINATION bin

    )

endif()

```


### 3.3 自动化构建脚本


```python

# build_libzip_ohos.py - libzip自动化构建

#!/usr/bin/env python3


import os

import sys

import shutil

import subprocess

from pathlib import Path


class LibZipBuilder:

    def __init__(self):

        self.root_dir = Path(__file__).parent.absolute()

        self.build_dir = self.root_dir / "build_ohos"

        self.install_dir = self.root_dir / "output" / "ohos"

        self.source_dir = self.root_dir / "libzip-1.9.2"

        

        # 设置环境

        self.setup_environment()

    

    def setup_environment(self):

        """设置OpenHarmony编译环境"""

        ohos_sdk = "/opt/ohos-sdk/linux"

        

        env_vars = {

            'CC': f'{ohos_sdk}/native/llvm/bin/aarch64-linux-ohos-clang',

            'CXX': f'{ohos_sdk}/native/llvm/bin/aarch64-linux-ohos-clang++',

            'AR': f'{ohos_sdk}/native/llvm/bin/llvm-ar',

            'RANLIB': f'{ohos_sdk}/native/llvm/bin/llvm-ranlib',

            'STRIP': f'{ohos_sdk}/native/llvm/bin/llvm-strip',

            'CMAKE_TOOLCHAIN_FILE': str(self.root_dir / 'ohos_toolchain.cmake'),

            'PKG_CONFIG_PATH': f'{self.install_dir}/lib/pkgconfig',

            'CFLAGS': '--target=aarch64-linux-ohos -march=armv8-a -fPIC -O2',

            'CXXFLAGS': '--target=aarch64-linux-ohos -march=armv8-a -fPIC -O2 -std=c++17',

            'LDFLAGS': '-fuse-ld=lld -static-libstdc++'

        }

        

        for key, value in env_vars.items():

            os.environ[key] = value

        

        # 确保安装目录存在

        self.install_dir.mkdir(parents=True, exist_ok=True)

    

    def configure_cmake(self):

        """运行CMake配置"""

        cmake_cmd = [

            'cmake',

            f'-S{self.source_dir}',

            f'-B{self.build_dir}',

            f'-DCMAKE_INSTALL_PREFIX={self.install_dir}',

            f'-DCMAKE_TOOLCHAIN_FILE={os.environ["CMAKE_TOOLCHAIN_FILE"]}',

            '-DCMAKE_BUILD_TYPE=Release',

            '-DBUILD_SHARED_LIBS=OFF',

            '-DBUILD_TOOLS=ON',

            '-DBUILD_EXAMPLES=OFF',

            '-DBUILD_DOC=OFF',

            '-DBUILD_REGRESS=OFF',

            f'-DZLIB_ROOT={self.install_dir}',

            f'-DBZIP2_ROOT={self.install_dir}',

            f'-DOPENSSL_ROOT_DIR={self.install_dir}',

            '-DOPENSSL_USE_STATIC_LIBS=TRUE'

        ]

        

        print("配置CMake...")

        result = subprocess.run(cmake_cmd, capture_output=True, text=True)

        

        if result.returncode != 0:

            print(f"CMake配置失败: {result.stderr}")

            sys.exit(1)

        

        print("CMake配置成功")

    

    def build_and_install(self):

        """编译和安装"""

        # 编译

        print("开始编译...")

        build_cmd = ['cmake', '--build', str(self.build_dir), '--parallel', '8']

        result = subprocess.run(build_cmd, capture_output=True, text=True)

        

        if result.returncode != 0:

            print(f"编译失败: {result.stderr}")

            sys.exit(1)

        

        # 安装

        print("安装到目标目录...")

        install_cmd = ['cmake', '--install', str(self.build_dir)]

        result = subprocess.run(install_cmd, capture_output=True, text=True)

        

        if result.returncode != 0:

            print(f"安装失败: {result.stderr}")

            sys.exit(1)

        

        print(f"安装完成: {self.install_dir}")

    

    def verify_build(self):

        """验证构建结果"""

        print("\n验证构建结果:")

        

        # 检查库文件

        lib_file = self.install_dir / "lib" / "libzip.a"

        if lib_file.exists():

            # 检查架构

            result = subprocess.run(

                ['llvm-readelf', '-h', str(lib_file)],

                capture_output=True,

                text=True

            )

            if 'AArch64' in result.stdout:

                print("✓ libzip.a 是有效的ARM64库")

            else:

                print("✗ libzip.a 架构不正确")

        else:

            print("✗ 未找到libzip.a")

        

        # 检查头文件

        header_file = self.install_dir / "include" / "zip.h"

        if header_file.exists():

            print("✓ zip.h 头文件存在")

        else:

            print("✗ 未找到zip.h")

        

        # 测试简单程序

        test_program = self.build_dir / "test_zip"

        if test_program.exists():

            print("✓ 测试程序编译成功")

            

            # 检查文件类型

            result = subprocess.run(

                ['file', str(test_program)],

                capture_output=True,

                text=True

            )

            if 'ARM aarch64' in result.stdout:

                print("✓ 测试程序是ARM64架构")

        else:

            print("✗ 测试程序未找到")

    

    def run(self):

        """主构建流程"""

        print("开始构建libzip for OpenHarmony")

        print(f"源码目录: {self.source_dir}")

        print(f"构建目录: {self.build_dir}")

        print(f"安装目录: {self.install_dir}")

        

        # 清理旧的构建

        if self.build_dir.exists():

            shutil.rmtree(self.build_dir)

        

        # 执行构建步骤

        self.configure_cmake()

        self.build_and_install()

        self.verify_build()

        

        print("\nlibzip构建完成!")


if __name__ == "__main__":

    builder = LibZipBuilder()

    builder.run()

```


## 四、HNP包配置与打包


### 4.1 HNP配置文件编写


```json

// bundle.json - HNP包描述文件

{

  "name": "libzip",

  "version": "1.9.2",

  "description": "C library for reading, creating, and modifying zip archives",

  "license": "BSD-3-Clause",

  "type": "library",

  "targets": [

    {

      "name": "ohos-arm64",

      "api": 9,

      "arch": "arm64-v8a",

      "libs": {

        "static": ["libzip.a"],

        "shared": []

      },<"www.2c.fsjdpx.com">

      "headers": ["include/*.h"],

      "dependencies": [

        {<"www.5x.fsjdpx.com">

          "name": "zlib",

          "version": "1.2.13"

        },

        {

          "name": "openssl",

          "version": "3.0.8"

        }

      ]

    }

  ],

  "build": {

    "script": "build_ohos.sh",

    "toolchain": "ohos-ndk-3.2.11.9",

    "environment": {

      "sdk": "/opt/ohos-sdk/linux",

      "sysroot": "/opt/ohos-sdk/linux/native/sysroot"

    }

  },

  "install": {

    "dest": "/system/lib64",

    "headers_dest": "/usr/include",

    "pkgconfig": true

  },

  "test": {

    "enabled": true,

    "script": "test_ohos.sh",

    "cases": ["test_zip_archive", "test_zip_stream"]

  },

  "metadata": {

    "author": "OpenHarmony Community",

    "repository": "https://gitee.com/openharmony/third_party_libzip",

    "issues": "https://gitee.com/openharmony/third_party_libzip/issues"

  }

}

```


```yaml

# hnp.yaml - HNP包构建配置

package:

  name: libzip

  version: 1.9.2

  type: library

  description: "Zip archive manipulation library for OpenHarmony"

  

targets:

  - name: arm64-v8a

    api: 9

    toolchain: ohos-ndk

    flags:

      cflags: "--target=aarch64-linux-ohos -march=armv8-a -fPIC -O2"

      ldflags: "-fuse-ld=lld -static-libstdc++"

    

dependencies:

  build:

    - cmake>=3.18

    - ninja>=1.10

    - ohos-ndk>=3.2.11

  runtime:

    - zlib>=1.2.13

    - openssl>=3.0.8

    

sources:

  - url: https://libzip.org/download/libzip-1.9.2.tar.gz

    sha256: c93e9852b7b8dc5e26c4c9d80db3b4302d5f41b6f2d4644e95c5c2a4a5e8e6f7

    patches:

      - patches/ohos_support.patch

      

build_steps:

  configure:

    command: cmake -B build -DCMAKE_TOOLCHAIN_FILE=ohos_toolchain.cmake

    args:

      - -DBUILD_SHARED_LIBS=OFF

      - -DCMAKE_INSTALL_PREFIX=${PREFIX}

      

  compile:

    command: cmake --build build --parallel ${NPROC}

    

  install:

    command: cmake --install build

    dest: ${OUTPUT_DIR}

    

  package:

    command: hnp pack --name libzip --version 1.9.2

    files:

      - ${OUTPUT_DIR}/lib/libzip.a -> lib/${TARGET_ARCH}/

      - ${OUTPUT_DIR}/include/*.h -> include/

      - bundle.json

      - LICENSE

    

tests:

  unit:

    - name: archive_test

      source: test/archive_test.cpp

      libraries: [zip, z, crypto, ssl]

      

  integration:

    - script: test_integration.sh

      timeout: 300

```


### 4.2 HNP打包脚本


```bash

#!/bin/bash

# package_libzip_hnp.sh - 创建libzip的HNP包


set -e


# 配置

PKG_NAME="libzip"

PKG_VERSION="1.9.2"

PKG_ARCH="arm64-v8a"

OHOS_API=9

BUILD_DIR="build_ohos"

INSTALL_DIR="output/ohos"

HNP_OUTPUT="hnp_packages"

TEMP_DIR="tmp_hnp"


# 清理旧文件

rm -rf ${TEMP_DIR} ${HNP_OUTPUT}/${PKG_NAME}-${PKG_VERSION}.hnp

mkdir -p ${TEMP_DIR} ${HNP_OUTPUT}


# 创建包结构

mkdir -p ${TEMP_DIR}/lib/${PKG_ARCH}

mkdir -p ${TEMP_DIR}/include

mkdir -p ${TEMP_DIR}/pkgconfig

mkdir -p ${TEMP_DIR}/test

mkdir -p ${TEMP_DIR}/docs


# 复制库文件和头文件

cp ${INSTALL_DIR}/lib/libzip.a ${TEMP_DIR}/lib/${PKG_ARCH}/

cp ${INSTALL_DIR}/include/*.h ${TEMP_DIR}/include/


# 创建pkg-config文件

cat > ${TEMP_DIR}/pkgconfig/zip.pc << EOF

prefix=/system

exec_prefix=\${prefix}

libdir=\${exec_prefix}/lib/${PKG_ARCH}

includedir=\${prefix}/include


Name: libzip

Description: library for handling zip archives

Version: ${PKG_VERSION}

Libs: -L\${libdir} -lzip -lz -lcrypto -lssl

Cflags: -I\${includedir}

Requires: zlib openssl

EOF


# 创建测试程序

cat > ${TEMP_DIR}/test/test_minimal.c << EOF

#include <zip.h>

#include <stdio.h>

#include <stdlib.h>


int main() {

    int error = 0;

    zip_t *archive = zip_open("/data/test.zip", ZIP_CREATE | ZIP_TRUNCATE, &error);

    

    if (archive == NULL) {

        printf("Failed to create zip archive\\n");

        return 1;

    }

    

    printf("Successfully created zip archive\\n");

    

    // 添加测试文件

    const char *content = "Hello OpenHarmony!";

    zip_source_t *source = zip_source_buffer(archive, content, strlen(content), 0);

    

    if (source == NULL) {

        printf("Failed to create zip source\\n");

        zip_close(archive);

        return 1;

    }

    

    if (zip_file_add(archive, "hello.txt", source, ZIP_FL_OVERWRITE) < 0) {

        printf("Failed to add file to archive\\n");

        zip_source_free(source);

        zip_close(archive);

        return 1;

    }

    

    // 保存归档

    if (zip_close(archive) < 0) {

        printf("Failed to save archive\\n");

        return 1;

    }

    

    printf("Test completed successfully\\n");

    return 0;

}

EOF


# 编译测试程序

aarch64-linux-ohos-clang \

    --target=aarch64-linux-ohos \

    -I${TEMP_DIR}/include \

    -L${TEMP_DIR}/lib/${PKG_ARCH} \

    ${TEMP_DIR}/test/test_minimal.c \

    -lzip -lz -lcrypto -lssl \

    -o ${TEMP_DIR}/test/test_minimal


# 创建安装脚本

cat > ${TEMP_DIR}/install.sh << 'EOF'

#!/system/bin/sh

# libzip安装脚本


PKG_NAME="libzip"

PKG_VERSION="1.9.2"

ARCH="arm64-v8a"


echo "Installing ${PKG_NAME} ${PKG_VERSION} for ${ARCH}..."


# 创建目录

mkdir -p /system/lib64

mkdir -p /usr/include

mkdir -p /usr/lib/pkgconfig


# 复制库文件

cp ${0%/*}/lib/${ARCH}/libzip.a /system/lib64/


# 复制头文件

cp ${0%/*}/include/*.h /usr/include/


# 复制pkg-config文件

cp ${0%/*}/pkgconfig/zip.pc /usr/lib/pkgconfig/


# 设置权限

chmod 644 /system/lib64/libzip.a

chmod 644 /usr/include/*.h

chmod 644 /usr/lib/pkgconfig/zip.pc


echo "Installation complete"

echo "Library: /system/lib64/libzip.a"

echo "Headers: /usr/include/zip.h"

echo "pkg-config: /usr/lib/pkgconfig/zip.pc"

EOF


chmod +x ${TEMP_DIR}/install.sh


# 创建卸载脚本

cat > ${TEMP_DIR}/uninstall.sh << 'EOF'

#!/system/bin/sh

# libzip卸载脚本


echo "Removing libzip..."


# 删除文件

rm -f /system/lib64/libzip.a

rm -f /usr/include/zip.h

rm -f /usr/include/zipconf.h

rm -f /usr/lib/pkgconfig/zip.pc


echo "libzip removed"

EOF


chmod +x ${TEMP_DIR}/uninstall.sh


# 创建验证脚本

cat > ${TEMP_DIR}/verify.sh << 'EOF'

#!/system/bin/sh

# libzip验证脚本


echo "Verifying libzip installation..."


# 检查库文件

if [ -f "/system/lib64/libzip.a" ]; then

    echo "✓ Library file exists"

else

    echo "✗ Library file missing"

    exit 1

fi


# 检查头文件

if [ -f "/usr/include/zip.h" ]; then

    echo "✓ Header file exists"

else

    echo "✗ Header file missing"

    exit 1

fi


# 测试编译简单程序

cat > /tmp/test_zip.c << 'TEST'

#include <zip.h>

int main() { return 0; }

TEST


if aarch64-linux-ohos-clang -I/usr/include -L/system/lib64 \

    /tmp/test_zip.c -lzip -o /tmp/test_compile 2>/dev/null; then

    echo "✓ Library can be linked"

    rm -f /tmp/test_compile

else

    echo "✗ Library linking failed"

    exit 1

fi


rm -f /tmp/test_zip.c

echo "Verification successful"

EOF


chmod +x ${TEMP_DIR}/verify.sh


# 创建MANIFEST文件

cat > ${TEMP_DIR}/MANIFEST << EOF

name=${PKG_NAME}

version=${PKG_VERSION}

arch=${PKG_ARCH}

api=${OHOS_API}

type=library

timestamp=$(date +%s)


files:

  lib/${PKG_ARCH}/libzip.a

  include/zip.h

  include/zipconf.h

  pkgconfig/zip.pc

  install.sh

  uninstall.sh

  verify.sh

  test/test_minimal

  test/test_minimal.c


dependencies:

  zlib>=1.2.13

  openssl>=3.0.8


checksums:

  $(sha256sum ${TEMP_DIR}/lib/${PKG_ARCH}/libzip.a | cut -d' ' -f1) lib/${PKG_ARCH}/libzip.a

  $(sha256sum ${TEMP_DIR}/include/zip.h | cut -d' ' -f1) include/zip.h

EOF


# 创建包信息文件

cat > ${TEMP_DIR}/INFO << EOF

Package: ${PKG_NAME}

Version: ${PKG_VERSION}

Architecture: ${PKG_ARCH}

Maintainer: OpenHarmony Team <openharmony@example.com>

Description: C library for reading, creating, and modifying zip archives

 This library allows manipulation of zip archives. It can

 create, read, write, and modify zip archives.

 

Features:

 - Create new zip archives

 - Read, modify, and extract existing zip archives

 - Support for encrypted archives (via OpenSSL)

 - Stream-based access for large files

 - Support for zip64 (large files)

<"www.9y.fsjdpx.com"><"gd.wandaihu.cn"><"tu.wandaihu.cn">


Homepage: https://libzip.org/

License: BSD-3-Clause

EOF


# 打包成HNP格式

cd ${TEMP_DIR}

tar -czf ../${HNP_OUTPUT}/${PKG_NAME}-${PKG_VERSION}.hnp .


# 生成签名(可选)

cd ..

if command -v openssl &> /dev/null; then

    openssl dgst -sha256 -sign private.key -out \

        ${HNP_OUTPUT}/${PKG_NAME}-${PKG_VERSION}.sig \

        ${HNP_OUTPUT}/${PKG_NAME}-${PKG_VERSION}.hnp

    echo "Package signed"

fi


# 清理

rm -rf ${TEMP_DIR}


echo "HNP package created: ${HNP_OUTPUT}/${PKG_NAME}-${PKG_VERSION}.hnp"

echo "Package size: $(du -h ${HNP_OUTPUT}/${PKG_NAME}-${PKG_VERSION}.hnp | cut -f1)"

```


## 五、集成测试与验证


### 5.1 测试套件开发


```c++

// test_ohos_zip.cpp - OpenHarmony平台测试程序

#include <zip.h>

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include <unistd.h>


#define TEST_FILE "


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3104617/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    934086