通过开源鸿蒙终端工具Termony完成LZ4 命令行工具构建过程深度解读

作者:CodexBai日期:2025/11/24

本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 LZ4 1.10.0 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。

📖 LZ4 简介

LZ4 是一个极速的无损压缩算法,专注于压缩和解压速度。它提供了非常高的压缩和解压速度,同时保持合理的压缩比。LZ4 广泛应用于需要快速压缩的场景,如实时数据传输、日志压缩、数据库备份等。

🎯 LZ4 的作用与重要性

LZ4 是一个高性能压缩工具,提供了:

  • 极速压缩:提供非常高的压缩和解压速度,适合实时场景
  • 合理压缩比:在保持高速的同时,提供合理的压缩比
  • 低资源占用:压缩和解压过程占用内存和 CPU 资源较少
  • 跨平台支持:支持多种操作系统和架构
  • 库和工具:提供 C 库和命令行工具,便于集成和使用

🔧 LZ4 核心特性

1. 命令行工具
  • lz4 - 主压缩/解压工具
  • lz4cat - 解压并输出到标准输出(类似 zcat
  • unlz4 - 解压工具(lz4 -d 的别名)
2. 压缩模式
  • 快速模式:默认模式,平衡速度和压缩比
  • 高压缩模式-9 选项,更高的压缩比但速度较慢
  • 超快速模式-1 选项,最快速度但压缩比较低
3. 库文件
  • liblz4.so - 共享库,提供压缩/解压 API
  • 头文件lz4.hlz4hc.hlz4frame.h
  • pkg-configliblz4.pc 用于依赖发现

🚀 构建入口与环境

  • 📝 执行命令OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh
  • 🔧 入口脚本create-hnp.sh
    • 检查必需的环境变量 OHOS_ARCHOHOS_ABI
    • 导出 LC_CTYPETOOL_HOMEOHOS_SDK_HOME
    • 执行 make -C build-hnp
  • 📦 顶层构建build-hnp/Makefile
    • PKGS 变量定义需要构建的包列表(包含 lz4
    • 通过 check-pkgs 机制自动检测 PKGS 变化并触发重新构建
    • 自动合并 external-hnp 目录下的外部 HNP 包
    • base.hnp 依赖所有包的 .stamp 和外部 HNP 包
    • 总目标 all: copy,打包 base.hnp 并拷贝到 entry/hnp/$(OHOS_ABI)

⚙️ LZ4 包的构建配置

  • 📁 包目录build-hnp/lz4/Makefile
  • ⚙️ CMake 配置参数
    • -DCMAKE_INSTALL_PREFIX=$(PREFIX) 安装前缀(默认 PREFIX=/data/app/base.org/base_1.0
    • -DCMAKE_SYSTEM_NAME=Linux 系统名称
    • -DCMAKE_SYSTEM_PROCESSOR=$(OHOS_ARCH) 目标架构
    • -DBUILD_SHARED_LIBS=ON 构建共享库
    • -DBUILD_STATIC_LIBS=OFF 不构建静态库
    • -DCMAKE_BUILD_TYPE=RelWithDebInfo 构建类型
  • 🔨 构建流程
    1. 下载源码包
    2. 解包并进入源码目录
    3. 使用 CMake 配置构建系统
    4. 编译库和命令行工具
    5. 安装到临时前缀后复制至 ../sysroot
    6. 执行 ELF strip 减小体积
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 通过 PKG_CONFIG_LIBDIR 指向 sysroot.pc 目录,确保依赖发现
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 GitHub Releases 下载 lz4-1.10.0.tar.gz
    • 完成解包并进入 temp/lz4-1.10.0 目录
    • 包含 programs/(命令行工具)和 lib/(库)源码
    • 下载规则支持多镜像回退:wgetcurl,自动尝试备用镜像
  • ⚙️ CMake 配置阶段
    • 使用 CMake 配置构建系统
    • 检测 Clang 编译器和编译标志(-Wall-Wextra 等)
    • 配置共享库构建,禁用静态库
  • 🔨 编译与安装
    • 同时构建 liblz4.so 和 CLI 可执行文件 lz4
    • 创建符号链接:lz4cat -> lz4unlz4 -> lz4
    • 安装库文件、头文件、pkg-config 文件
    • 执行 ELF strip 减小体积
    • 在打包前移除 man 目录以缩减体积
  • 📦 打包
    • 合并外部 HNP 包(如果存在)
    • 顶层执行 zip -r base.hnp sysroot 并拷贝到 entry/hnp/arm64-v8a/
    • 所有 LZ4 工具和库文件已成功打包到 base.hnp

✅ 产物验证

📦 检查打包文件

1ls build-hnp/base.hnp  # 应存在
2ls entry/hnp/arm64-v8a/*.hnp  # 应包含 base.hnp  base-public.hnp
3

🔍 检查命令行工具

1# 检查 LZ4 工具
2ls -lh build-hnp/sysroot/bin/lz4*
3file build-hnp/sysroot/bin/lz4
4
5# 验证工具是否存在
6test -f build-hnp/sysroot/bin/lz4 && echo "lz4: OK" || echo "lz4: MISSING"
7test -L build-hnp/sysroot/bin/lz4cat && echo "lz4cat: OK" || echo "lz4cat: MISSING"
8test -L build-hnp/sysroot/bin/unlz4 && echo "unlz4: OK" || echo "unlz4: MISSING"
9

✅ 构建验证结果

  • ✅ LZ4 主程序已成功安装:lz4 (228K)
  • ✅ 符号链接已正确创建:lz4cat -> lz4unlz4 -> lz4

📚 检查库文件

1# 检查 LZ4 
2ls -lh build-hnp/sysroot/lib/liblz4*
3file build-hnp/sysroot/lib/liblz4.so.1.10.0
4
5# 检查 pkg-config 文件
6ls -lh build-hnp/sysroot/lib/pkgconfig/liblz4.pc
7

✅ 构建验证结果

  • ✅ LZ4 库已成功安装:liblz4.so.1.10.0 (159K)
  • ✅ 符号链接已正确创建:liblz4.so -> liblz4.so.1liblz4.so.1 -> liblz4.so.1.10.0

📝 检查头文件

1# 检查头文件
2ls -lh build-hnp/sysroot/include/lz4*
3
4# 检查主要头文件
5test -f build-hnp/sysroot/include/lz4.h && echo "lz4.h: OK" || echo "lz4.h: MISSING"
6test -f build-hnp/sysroot/include/lz4hc.h && echo "lz4hc.h: OK" || echo "lz4hc.h: MISSING"
7test -f build-hnp/sysroot/include/lz4frame.h && echo "lz4frame.h: OK" || echo "lz4frame.h: MISSING"
8

💻 终端中执行的示例命令

🔧 LZ4 基本使用

1. 压缩文件
1# 基本压缩
2lz4 file.txt
3
4# 压缩并指定输出文件名
5lz4 file.txt compressed.lz4
6
7# 压缩并保留原文件
8lz4 -k file.txt
9
10# 高压缩比模式(-9)
11lz4 -9 file.txt compressed.lz4
12
13# 超快速模式(-1)
14lz4 -1 file.txt compressed.lz4
15
16# 压缩并显示详细信息
17lz4 -v file.txt compressed.lz4
18
19# 压缩并显示进度
20lz4 --progress file.txt compressed.lz4
21

2. 解压文件
1# 基本解压
2lz4 -d compressed.lz4
3
4# 解压并指定输出文件名
5lz4 -d compressed.lz4 output.txt
6
7# 解压并保留原文件
8lz4 -d -k compressed.lz4
9
10# 使用 unlz4 命令(等同于 lz4 -d)
11unlz4 compressed.lz4
12
13# 解压并显示详细信息
14lz4 -d -v compressed.lz4
15
16# 强制覆盖已存在的文件
17lz4 -d -f compressed.lz4
18

3. 查看压缩文件信息
1# 测试压缩文件完整性
2lz4 -t compressed.lz4
3
4# 显示压缩文件信息
5lz4 -l compressed.lz4
6
7# 显示详细统计信息
8lz4 -l -v compressed.lz4
9

4. 流式压缩/解压
1# 压缩标准输入到标准输出
2echo "Hello, LZ4!" | lz4 > compressed.lz4
3
4# 解压标准输入到标准输出
5cat compressed.lz4 | lz4 -d
6
7# 使用 lz4cat 解压并输出(类似 zcat)
8lz4cat compressed.lz4
9
10# 管道压缩
11cat file.txt | lz4 > compressed.lz4
12
13# 管道解压
14cat compressed.lz4 | lz4 -d > output.txt
15
5. 批量压缩/解压
1# 压缩多个文件
2lz4 file1.txt file2.txt file3.txt
3
4# 递归压缩目录(需要配合其他工具)
5find . -type f -name "*.txt" -exec lz4 {} {}.lz4 \;
6
7# 批量解压
8for file in *.lz4; do lz4 -d "$file"; done
9
6. 压缩级别和性能
1# 级别 1(最快,压缩比最低)
2lz4 -1 file.txt
3
4# 级别 3(默认,平衡速度和压缩比)
5lz4 file.txt
6
7# 级别 9(最慢,压缩比最高)
8lz4 -9 file.txt
9
10# 级别 12(最高压缩比)
11lz4 -12 file.txt
12
7. 实际应用示例
1# 压缩日志文件
2lz4 -k access.log
3
4# 压缩数据库备份
5lz4 -9 database_backup.sql
6
7# 压缩大文件并显示进度
8lz4 --progress large_file.dat
9
10# 解压并直接查看内容
11lz4cat log.lz4 | head -20
12
13# 压缩并传输
14tar czf - directory/ | lz4 > archive.tar.gz.lz4
15
16# 解压并提取
17lz4 -d archive.tar.gz.lz4 | tar xzf -
18
8. 性能测试
1# 创建测试文件
2dd if=/dev/zero of=test.dat bs=1M count=100
3
4# 测试压缩速度
5time lz4 test.dat test.lz4
6
7# 测试解压速度
8time lz4 -d test.lz4 test_out.dat
9
10# 比较压缩比
11ls -lh test.dat test.lz4
12

🧪 功能验证脚本

1#!/bin/bash
2# LZ4 工具验证脚本
3
4LZ4_BIN="build-hnp/sysroot/bin"
5
6echo "=== LZ4 工具验证 ==="
7
8# 检查主程序
9if [ -f "$LZ4_BIN/lz4" ]; then
10    echo "✓ lz4: 存在"
11    file "$LZ4_BIN/lz4"
12    echo "文件大小: $(ls -lh "$LZ4_BIN/lz4" | awk '{print $5}')"
13else
14    echo "✗ lz4: 缺失"
15fi
16
17echo ""
18
19# 检查符号链接
20for tool in lz4cat unlz4; do
21    if [ -L "$LZ4_BIN/$tool" ]; then
22        echo "✓ $tool: 存在(符号链接 -> $(readlink "$LZ4_BIN/$tool"))"
23    else
24        echo "✗ $tool: 缺失"
25    fi
26done
27
28echo ""
29echo "=== 库文件验证 ==="
30if [ -f "build-hnp/sysroot/lib/liblz4.so.1.10.0" ]; then
31    echo "✓ liblz4.so.1.10.0: 存在"
32    ls -lh build-hnp/sysroot/lib/liblz4.so*
33else
34    echo "✗ liblz4.so.1.10.0: 缺失"
35fi
36
37echo ""
38echo "=== 测试压缩/解压(如果可执行)==="
39echo "注意:这些是交叉编译的二进制文件,需要在目标设备上运行"
40

🐛 常见问题与解决方案

❌ 问题 1:CMake 工具链问题

  • 🔍 症状:CMake 配置失败,找不到编译器或工具链
  • 🔎 原因:CMake 未正确检测到交叉编译工具链
  • ✅ 解决方法
    • 确保 OHOS_SDK_HOME 环境变量正确设置
    • 确保 CMake 能够找到交叉编译器
    • 检查 CMAKE_SYSTEM_NAMECMAKE_SYSTEM_PROCESSOR 设置
    • 位置:build-hnp/lz4/Makefile:7

❌ 问题 2:共享库构建失败

  • 🔍 症状:编译时出现共享库链接错误
  • 🔎 原因:缺少共享库依赖或链接选项不正确
  • ✅ 解决方法
    • 确保 BUILD_SHARED_LIBS=ON 设置正确
    • 检查交叉工具链是否支持共享库
    • 确保所有依赖库都已正确构建
    • 位置:build-hnp/lz4/Makefile:7

❌ 问题 3:文档体积过大

  • 🔍 症状:HNP 包体积较大,包含不必要的文档
  • 🔎 原因:man 手册页等文档文件占用空间
  • ✅ 解决方法
    • 在打包前移除 man 目录以缩减体积
    • 如需保留文档,可调整顶层裁剪步骤
    • 位置:顶层 Makefile 的打包规则

❌ 问题 4:符号链接未创建

  • 🔍 症状lz4catunlz4 符号链接不存在
  • 🔎 原因:安装过程中符号链接创建失败
  • ✅ 解决方法
    • 检查安装过程是否正常完成
    • 手动创建符号链接:ln -s lz4 lz4catln -s lz4 unlz4
    • 位置:build-hnp/lz4/Makefile(CMake 自动创建)

🔄 重建与扩展

  • 🔧 重建单包
1make -C build-hnp rebuild-lz4  # 触发子包重新编译并刷新 .stamp  
  • 🧹 清理
1make -C build-hnp clean  # 清理 sysroot、所有 .stamp  PKGS_MARKER  
  • 📦 扩展:LZ4 是压缩栈的重要组成部分,与 zlibzstdxz 等共同构建,提升上层工具兼容性
  • 🔄 自动重建机制
    • 修改 PKGS 后,check-pkgs 会自动检测变化并触发重新构建
    • 新增外部 HNP 包到 external-hnp 目录后,会自动合并到 base.hnp

💡 实践建议

  • 🔧 压缩级别选择:根据实际需求选择合适的压缩级别,平衡速度和压缩比
  • 🛡️ 性能优化:LZ4 专注于速度,适合实时压缩场景;如需更高压缩比,可考虑 zstd
  • 📦 库集成:使用 liblz4.so 和头文件在应用程序中集成 LZ4 压缩功能
  • 🔗 压缩栈配合:与 zlibzstdxz 共同构建,配合 libarchive 提供归档/解压的统一接口

📝 结论与建议

  • ✅ 本次已在 aarch64 环境下完成 LZ4 1.10.0 的交叉编译与打包,所有工具和库文件已安装到 sysroot 并纳入 HNP 包。
  • 💡 为保证构建稳定
    • 固定可靠的上游镜像,避免下载阶段随机失败(已实现自动回退机制)
    • 对大型包启用构建缓存(可在 Makefrag 中开启 USE_CCACHE
    • 使用 CMake 构建系统,确保跨平台兼容性
    • 移除不必要的文档以减小包体积
    • 利用 check-pkgs 机制自动检测包列表变化,无需手动清理

📚 以上为 LZ4 构建的深度解读与实践记录。


通过开源鸿蒙终端工具Termony完成LZ4 命令行工具构建过程深度解读》 是转载文章,点击查看原文


相关推荐


🌐 阿里云 Linux 服务器 Let's Encrypt 免费 SSL 证书完整部署指南
纯粹的热爱2025/11/23

🌐 阿里云 Linux 服务器 Let's Encrypt 免费 SSL 证书完整部署指南 适用系统:Alibaba Cloud Linux 3(兼容 CentOS/RHEL) Web 服务器:Nginx 更新时间:2025 年 11 月 作者:DevOps Guide ✅ 一、前提条件 在开始前,请确保满足以下条件: 要求说明1. 阿里云 ECS 实例已创建,操作系统为 Alibaba Cloud Linux 32. 域名已解析


前端可视化家庭账单:用 ECharts 实现支出统计与趋势分析
fruge3652025/11/21

前端可视化家庭账单:用 ECharts 实现支出统计与趋势分析 在家庭财务管理中,直观地看懂钱花到了哪里、花得是否稳定,是提高消费意识与优化预算的关键。本文以 ECharts 为核心,构建一个可视化的家庭账单分析:包括支出分类统计、月度趋势分析、交互筛选与性能优化建议,帮助你在浏览器端快速落地一个实用的可视化面板。 适用场景 需要按类别统计支出占比并快速定位高频支出项需要观察月度支出变化趋势并识别异常波动希望在不引入后端的前提下,完成本地或前端的数据分析与展示 数据模型设计 为后续统计与可视化,


分布式专题——56 微服务日志采集与分析系统实战
失散132025/11/19

1 为什么要使用 ELK 随着企业信息化进程加速,日志数据呈现量急剧增加、来源多样、格式复杂的特点,传统日志管理方式已难以满足需求,这是引入ELK的核心背景; ELK(ElasticSearch、Logstash、Kibana)的由三个组件构成,各自承担关键功能,形成高效的日志管理方案: Elasticsearch:提供强大的分布式搜索能力,支撑日志的快速检索; Logstash:具备灵活的数据采集与处理功能,负责日志的收集和预处理; Kibana:提供直观的数据可视化界面,将


如果让我从头再来学习并发编程
桦说编程2025/11/18

大学时,我学习了一本国外的教科书,书名叫做《计算机网络——自顶向下方法》,这本书改变了我看待学习的角度。学习的顺序不是一成不变的,常规的路线通常从底层学习,这本书从应用层面入手,逐步讲解到底层,以一种对常规学习路线相反的方向学习,在我看来恰恰学习计算机网络最轻松上手的路径。很多时候我们追求一步到位,鞭辟入里的理解,反而忽略对于初学者,最佳的学习路线往往是兴趣与试错、感性和求索交织的,认识是逐渐深刻的。 知之者往往陷入知识的诅咒,知道的内容很难遗忘,甚至忘记了自己也是从不理解到懂的。有些书籍和文章


Python 的内置函数 setattr
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 setattr Python 的内置函数 setattr() 用于动态设置对象的属性值。该函数接受三个参数:对象、属性名称字符串和属性值。当我们需要在运行时为对象添加或修改属性时,setattr() 提供了灵活的操作方式。 基本语法: setattr(object, attribute_name, value) 详细说明: 参数解析: object:需要设置属性的目标对象attribute_name:字符串形式的属性名


Bash 的 chown 命令
hubenchang05152025/11/16

#Bash 的 chown 命令 chown [OPTION]... [OWNER][:[GROUP]] FILE... 功能 修改文件的所有者和所属组。 类型 可执行文件(/usr/bin/chown),属于 coreutils。 参数 OPTION 选项: -c, --changes - 仅对发生变化的文件打印详细信息 -f, --silent, --quiet - 忽略大部分错误信息 -v, --verbose - 打印详细信息 --dereference - 影响符号链接引用的源文


【软件测试】《集成测试全攻略:Mock/Stub 原理 + Postman/JUnit/TestNG 实战》
云知谷2025/11/15

集成测试:一场“团队协作”的精彩大戏! 想象一下,你正在筹备一场超级英雄电影的首映礼!每个超级英雄(比如钢铁侠、美国队长、雷神)都是独立的组件,他们各自的能力(功能)都经过了严格测试(单元测试),证明他们“单兵作战”很强。 但是!电影上映时,他们必须一起合作——钢铁侠开战甲,美国队长指挥战术,雷神召唤闪电,才能打败灭霸(系统级问题)。如果他们配合不好(比如钢铁侠的战甲和美国队长的盾牌不兼容,或者雷神的闪电把战甲炸了),那电影就砸了! 这时候,集成测试(Integration Testing


DeepSeek-OCR实战(01):基础运行环境搭建-Ubuntu
paopao_wu2025/11/13

DeepSeek-OCR实战是一个系列文章,包含了从基础运行环境搭建到应用接入全过程。本章为:基础运行环境搭建,操作系统采用 Ubuntu Server 24 环境版本ubuntu-24.04.3 Serverrelease 10.0Cuda11.8显卡 RTX 2080 Ti 22G驱动 NVIDIA-Linux-x86_64-580.105.08conda25.9.1git2.47.3 1.操作系统基础安装 安装 Ubuntu 24 Server 版本后(全部默认安装),查看一下磁盘


圆桌论坛精华实录 | AI是重构运维逻辑的颠覆性革命?博睿数据与行业大咖亲授“AI+可观测性”的破局之道
Bonree博睿数据2025/11/12

全文约6500字  阅读时间约15分钟。 当前,人工智能正处于高速发展阶段,以前所未有的深度与广度重塑商业规则,推动企业数字化转型从规模化扩张迈入精细化深耕。面对这场汹涌而来的智能变革,运维领域正面临一道核心命题:AI究竟是提升效率的辅助工具,还是重构运维逻辑的颠覆性革命? 国内金融、制造等关键行业已步入数字化深水区,却普遍陷入运维复杂度激增、故障定位滞后、数据价值难以转化等行业焦虑。如何让AI技术真正落地运维场景?如何通过可观测性打通全链路数据孤岛?如何平衡技术创新与业务实用价值?


对于数据结构:堆的超详细保姆级解析——下(堆排序以及TOP-K问题)
ShineWinsu2025/11/10

开篇介绍: hello 大家,我们又见面了,在上一篇博客中,我们共同探索了如何实现堆这么一个数据结构,相信大家经过上篇博客的学习,对堆的了解程度以及掌握程度,都有了极大的水平提升。 那么堆,有什么用呢?首先,作为一个数据结构,它肯定具有存储数据的功能,这是毋庸置疑的,但是呢,我们知道,堆有大堆和小堆之分,那么那么,这一个知识点,蕴含着什么秘密呢? 诶,不错,就是我们标题所说的——堆排序,我们之前学过了冒泡排序以及qsort函数排序,但是呢说实话,这两种排序方式,效率都不高,说难听一点就是在

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读