开源鸿蒙系统下开源Htop命令行工具的移植与构建全解析

鸿蒙系统下Htop移植与构建

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

📖 Htop 简介

Htop 是一个交互式的系统监控工具,用于实时显示系统的进程、CPU、内存使用情况。它是传统 top 命令的增强版本,提供了更友好的用户界面、更丰富的功能和更好的交互体验。

🎯 Htop 的作用与重要性

Htop 是系统监控的核心工具,提供了:

  • 实时监控:实时显示系统资源使用情况(CPU、内存、交换空间)
  • 进程管理:显示和管理运行中的进程
  • 交互式操作:支持鼠标操作和键盘快捷键
  • 彩色显示:使用颜色区分不同类型的进程和资源使用情况
  • 树状视图:以树状结构显示进程关系
  • 搜索和过滤:支持搜索和过滤进程

🔧 Htop 核心特性

1. 实时系统监控
  • CPU 使用率:显示每个 CPU 核心的使用率
  • 内存使用:显示物理内存和交换空间的使用情况
  • 负载平均值:显示系统负载平均值
  • 运行时间:显示系统运行时间
  • 进程数:显示运行的进程和线程数
2. 进程管理
  • 进程列表:显示所有运行的进程
  • 进程信息:显示进程的 PID、用户、优先级、CPU、内存使用等
  • 进程操作:支持杀死、改变优先级、发送信号等操作
  • 进程搜索:支持按名称搜索进程
  • 进程过滤:支持按用户、状态等过滤进程
3. 交互式界面
  • 鼠标支持:支持鼠标点击和滚动
  • 键盘快捷键:丰富的键盘快捷键操作
  • 颜色显示:使用颜色区分不同类型的进程
  • 可定制:支持自定义显示选项和颜色方案
4. 树状视图
  • 进程树:以树状结构显示进程关系
  • 父子关系:清晰显示进程的父子关系
  • 折叠展开:支持折叠和展开进程树
5. 应用场景
  • 系统监控:实时监控系统资源使用情况
  • 性能分析:分析系统性能瓶颈
  • 进程管理:管理和调试运行中的进程
  • 故障排查:排查系统性能问题
  • 资源优化:优化系统资源使用

🚀 构建入口与环境

  • 📝 执行命令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 变量定义需要构建的包列表(包含 htop
    • 通过 check-pkgs 机制自动检测 PKGS 变化并触发重新构建
    • 自动合并 external-hnp 目录下的外部 HNP 包
    • base.hnp 依赖所有包的 .stamp 和外部 HNP 包
    • 总目标 all: copy,打包 base.hnp 并拷贝到 entry/hnp/$(OHOS_ABI)

⚙️ Htop 包的构建配置

  • 📁 包目录build-hnp/htop/Makefile
    • 继承通用规则:include ../utils/Makefrag
    • 源地址:https://github.com/htop-dev/htop/releases/download/3.4.1/htop-3.4.1.tar.xz
    • 版本:3.4.1
  • 🔧 补丁处理
    • 0001-skip-proc-stat.diff:跳过在 OHOS 环境下不一致的 /proc/stat 读取路径或处理逻辑,保证运行时行为稳定
    • 位置:build-hnp/htop/Makefile:6
  • ⚙️ Autotools 配置参数
    • --prefix=$(PREFIX) - 安装前缀
    • --host $(OHOS_ARCH)-unknown-linux-musl - 目标平台
    • --enable-affinity - 启用 CPU 亲和性支持
    • CPPFLAGS="-I../sysroot/include -D_FORTIFY_SOURCE=2" - 编译预处理标志
  • 🔨 构建流程
    1. 前置依赖 ncursesw
    2. 下载源码包(从 GitHub releases)
    3. 解包并进入 temp/htop-3.4.1 目录
    4. 应用补丁 0001-skip-proc-stat.diff
    5. 运行 ./configure 配置构建系统
    6. 使用 make -j $(nproc) 并行编译
    7. 使用 make install 安装
    8. 执行 ELF strip 减小体积
    9. 复制到 ../sysroot
  • 🔧 通用工具链与路径build-hnp/utils/Makefrag
    • CC/CXX/LD/AR/RANLIB/... 均指向 OHOS SDK 的 LLVM 工具链
    • 下载支持多镜像回退:wgetcurl,主镜像失败时自动尝试备用镜像
  • 📦 依赖关系
    • 前置依赖ncursesw(提供终端处理支持,已在 sysroot 中提供)
    • 建议构建顺序ncurses → htop

📋 关键日志与过程节点

  • 📥 下载与解包
    • 从 GitHub releases 下载 htop-3.4.1.tar.xz
    • 完成解包并进入 temp/htop-3.4.1 目录
    • 下载规则支持多镜像回退:wgetcurl 兜底
  • 🔧 补丁应用
    • 应用补丁 0001-skip-proc-stat.diff 修正 /proc/stat 读取问题
  • ⚙️ 配置阶段
    • 运行 ./configure --prefix=... --host=aarch64-unknown-linux-musl --enable-affinity ...
    • 工具链与链接器探测成功(clang/ld.lld
    • 检测到 ncursesw 依赖
    • CPU 亲和性支持检测通过
    • 配置成功,生成 Makefile 和构建配置
  • 🔨 编译与安装
    • 使用 make -j $(nproc) 并行编译
    • 成功编译生成 htop 二进制
    • 使用 make install 安装到临时前缀
    • 执行 llvm-strip 剥离二进制符号
    • 复制到 ../sysroot
  • 📦 打包
    • 完成 base.hnp 重打包,拷贝产物到 entry/hnp/arm64-v8a/
    • Htop 二进制和相关资源已成功打包到 base.hnp

✅ 产物验证

📦 检查打包文件

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

🔍 检查二进制和资源文件

# 检查 htop 二进制
ls -lh build-hnp/sysroot/bin/htop
file build-hnp/sysroot/bin/htop

# 检查图标和桌面文件
ls -lh build-hnp/sysroot/share/icons/hicolor/scalable/apps/htop.svg
ls -lh build-hnp/sysroot/share/applications/htop.desktop

image-20251126102344699

✅ 构建验证结果

  • ✅ Htop 二进制已安装:
    • bin/htop (289K) - 主程序
  • ✅ 文件类型:ELF 64-bit LSB pie executable, ARM aarch64
  • ✅ 动态链接:interpreter /lib/ld-musl-aarch64.so.1
  • ✅ 已剥离符号:stripped
  • ✅ 资源文件已安装:
    • share/icons/hicolor/scalable/apps/htop.svg (11K) - SVG 图标
    • share/applications/htop.desktop (2.5K) - 桌面文件
  • ✅ 已打包到 base.hnp

💻 终端中执行的示例命令

📊 Htop 基本使用

1. 启动 Htop
# 基本启动
htop

# 指定延迟时间(秒)
htop -d 5

# 指定用户
htop -u username

# 只显示指定用户的进程
htop -u root

# 显示帮助信息
htop -h

# 显示版本信息
htop -V

image-20251126102526209

2. Htop 界面操作
# 启动 htop 后,可以使用以下快捷键:

# F1 或 h - 显示帮助
# F2 或 S - 设置
# F3 或 / - 搜索进程
# F4 或 \ - 过滤进程
# F5 或 t - 树状视图
# F6 或 < - 选择排序方式
# F7 或 ] - 降低进程优先级
# F8 或 [ - 提高进程优先级
# F9 或 k - 杀死进程
# F10 或 q - 退出

# 示例:启动 htop 并查看帮助
htop
# 然后按 F1 或 h 查看帮助

image-20251126102623553

3. 进程搜索和过滤
# 启动 htop 后:
# 按 F3 或 / 搜索进程
# 输入进程名称,如 "bash"

# 按 F4 或 \ 过滤进程
# 输入过滤条件,如 "user=root"

# 按 Esc 取消搜索或过滤

image-20251126102720993

4. 进程管理
# 启动 htop 后:
# 选择进程,按 F9 或 k 杀死进程
# 选择信号(如 SIGTERM、SIGKILL)

# 按 F7 或 ] 降低进程优先级(nice 值增加)
# 按 F8 或 [ 提高进程优先级(nice 值减少)

# 按 t 切换树状视图

image-20251126103156844

5. 显示选项
# 启动 htop 后:
# 按 F2 或 S 进入设置菜单
# 可以配置:
#   - 显示选项(CPU、内存、交换空间等)
#   - 颜色方案
#   - 列显示顺序
#   - 更新延迟

# 按 F5 或 t 切换树状视图
# 按 H 显示/隐藏线程
# 按 K 显示/隐藏内核线程

image-20251126103624185

6. 排序选项
# 启动 htop 后:
# 按 F6 或 < 选择排序方式
# 可以按以下方式排序:
#   - PID(进程 ID)
#   - PERCENT_CPU(CPU 使用率)
#   - PERCENT_MEM(内存使用率)
#   - TIME(运行时间)
#   - COMMAND(命令名称)

# 使用方向键选择排序方式,按 Enter 确认
7. 实际应用示例
# 监控系统资源使用情况
htop

# 监控特定用户的进程
htop -u root

# 以较慢的更新速度运行(每 5 秒更新一次)
htop -d 5

# 在后台运行并保存输出
htop > htop_output.txt 2>&1 &

# 使用管道过滤输出
htop | grep "bash"

# 结合其他命令使用
ps aux | grep htop
killall htop

# 检查 htop 是否在运行
pgrep htop

# 查看 htop 进程信息
ps -p $(pgrep htop) -o pid,user,cmd

# 使用 strace 跟踪 htop 的系统调用
strace -o htop_trace.txt htop

# 使用 perf 分析 htop 性能
perf record -g htop
perf report

# 在 screen 或 tmux 中运行 htop
screen -S monitor htop
# 或
tmux new-session -d -s monitor 'htop'

# 定期运行 htop 并保存快照
while true; do
    htop -n 1 > "htop_$(date +%Y%m%d_%H%M%S).txt"
    sleep 60
done

# 使用 htop 监控特定进程
htop -p $(pgrep -d, -f "pattern")

# 在远程服务器上运行 htop(通过 SSH)
ssh user@hostname "htop"

# 使用 htop 监控 Docker 容器
docker exec -it container_name htop

# 在脚本中使用 htop 输出
htop -n 1 | grep "Load average"

# 使用 htop 监控系统启动过程
systemd-analyze plot > boot.svg
htop -d 1

# 监控网络进程
htop -F "network"

# 监控 CPU 密集型进程
htop -s PERCENT_CPU

# 监控内存密集型进程
htop -s PERCENT_MEM
8. 配置 Htop
# Htop 配置文件位置
# ~/.config/htop/htoprc

# 创建配置目录
mkdir -p ~/.config/htop

# 编辑配置文件
vi ~/.config/htop/htoprc

# 配置示例:
# # 显示选项
# hide_kernel_threads=0
# hide_userland_threads=0
# shadow_other_users=0
# show_thread_names=0
# show_program_path=1
# highlight_base_name=0
# highlight_megabytes=1
# highlight_threads=1
# tree_view=0
# header_margin=1
# 
# # 颜色方案
# color_scheme=0
# 
# # 列显示
# fields=0 48 17 18 38 39 40 2 46 47 49 1
# 
# # 排序
# sort_key=46
# sort_direction=1
# 
# # 更新延迟
# delay=15
# 
# # 其他选项
# left_meters=AllCPUs Memory Swap
# left_meter_modes=1 1 1
# right_meters=Tasks LoadAverage Uptime
# right_meter_modes=2 2 2
9. Htop 与其他工具结合
# 使用 htop 和 top 对比
top
htop

# 使用 htop 和 ps 结合
ps aux | head -1
htop

# 使用 htop 和 iotop 监控 I/O
htop
iotop

# 使用 htop 和 nethogs 监控网络
htop
nethogs

# 使用 htop 和 glances 对比
htop
glances

# 使用 htop 和 btop 对比(如果可用)
htop
btop

# 使用 htop 监控系统资源,同时使用其他工具
htop &
watch -n 1 'free -h'
watch -n 1 'df -h'

# 使用 htop 监控进程,同时使用 strace 跟踪
htop &
strace -p $(pgrep -f "process_name")

# 使用 htop 监控进程,同时使用 gdb 调试
htop &
gdb -p $(pgrep -f "process_name")
10. 故障排查示例
# 检查系统负载
htop
# 查看 Load average 行

# 查找 CPU 使用率高的进程
htop
# 按 F6 选择按 CPU 排序

# 查找内存使用率高的进程
htop
# 按 F6 选择按内存排序

# 查找僵尸进程
htop
# 查找状态为 Z 的进程

# 监控特定进程
htop -p $(pgrep -d, -f "process_name")

# 检查进程树
htop
# 按 F5 或 t 切换到树状视图

# 监控系统资源趋势
htop -d 1
# 观察资源使用变化

# 检查进程优先级
htop
# 查看 PRI 和 NI 列

# 监控线程
htop
# 按 H 显示线程

# 检查进程打开的文件
htop
# 选择进程,查看详细信息
lsof -p $(pgrep -f "process_name")

🧪 功能验证脚本

#!/bin/bash
# Htop 工具验证脚本

HTOP_BIN="build-hnp/sysroot/bin"

echo "=== Htop 工具验证 ==="

# 检查二进制文件
echo ""
echo "=== 二进制文件验证 ==="
if [ -f "$HTOP_BIN/htop" ]; then
    echo "✓ htop: 存在"
    file "$HTOP_BIN/htop"
    echo "  文件大小: $(ls -lh "$HTOP_BIN/htop" | awk '{print $5}')"
    echo "  架构信息: $(file "$HTOP_BIN/htop" | grep -o "ARM aarch64")"
    echo "  文件类型: $(file "$HTOP_BIN/htop" | grep -o "ELF.*executable")"
else
    echo "✗ htop: 缺失"
fi

# 检查资源文件
echo ""
echo "=== 资源文件验证 ==="
if [ -f "build-hnp/sysroot/share/icons/hicolor/scalable/apps/htop.svg" ]; then
    echo "✓ htop.svg: 存在"
    echo "  文件大小: $(ls -lh build-hnp/sysroot/share/icons/hicolor/scalable/apps/htop.svg | awk '{print $5}')"
else
    echo "✗ htop.svg: 缺失"
fi

if [ -f "build-hnp/sysroot/share/applications/htop.desktop" ]; then
    echo "✓ htop.desktop: 存在"
    echo "  文件大小: $(ls -lh build-hnp/sysroot/share/applications/htop.desktop | awk '{print $5}')"
    cat build-hnp/sysroot/share/applications/htop.desktop
else
    echo "✗ htop.desktop: 缺失"
fi

# 测试基本功能(在目标设备上)
echo ""
echo "=== 功能测试(需要在目标设备上运行)==="
echo "测试 htop 版本:"
echo "  $HTOP_BIN/htop -V"
echo ""
echo "测试 htop 帮助:"
echo "  $HTOP_BIN/htop -h"
echo ""
echo "测试 htop 启动:"
echo "  $HTOP_BIN/htop"
echo ""
echo "测试 htop 延迟:"
echo "  $HTOP_BIN/htop -d 5"
echo ""
echo "测试 htop 用户过滤:"
echo "  $HTOP_BIN/htop -u root"

🐛 常见问题与处理

❌ 问题 1:/proc 兼容问题

  • 🔍 症状:运行时统计信息异常或无法读取
  • 🔎 原因:OHOS 环境下 /proc/stat 读取路径或处理逻辑不一致
  • ✅ 解决方法
    • 应用补丁 0001-skip-proc-stat.diff 修正相关问题
    • 检查目标设备的 /proc 接口可用性
    • 位置:build-hnp/htop/Makefile:6

❌ 问题 2:终端显示与键位异常

  • 🔍 症状:显示异常或键盘快捷键不工作
  • 🔎 原因htop 依赖终端能力(ncurses/tinfo),终端类型不支持
  • ✅ 解决方法
    • 检查设备 TERM 环境变量是否正确设置
    • 使用支持 ncurses 的终端(如 xterm、screen、tmux)
    • 确保 ncursesw 已正确安装
    • 位置:运行时

❌ 问题 3:ncursesw 依赖缺失

  • 🔍 症状:配置失败,无法找到 ncursesw
  • 🔎 原因ncursesw 未在 htop 之前构建,或库路径未正确设置
  • ✅ 解决方法
    • 确保 ncurseshtop 之前构建
    • 检查 sysroot/lib 中是否存在 libncursesw.so
    • 确保编译时添加了 -L../sysroot/lib 链接路径
    • 位置:build-hnp/htop/Makefile:8

❌ 问题 4:GitHub 下载失败

  • 🔍 症状:无法从 GitHub releases 下载源码包
  • 🔎 原因:网络问题或 GitHub 访问受限
  • ✅ 解决方法
    • 手动下载源码包放置到 build-hnp/htop/download/htop-3.4.1.tar.xz
    • 使用代理或镜像站点下载
    • 通用下载规则支持 curl 兜底
    • 位置:build-hnp/htop/Makefile:3

❌ 问题 5:CPU 亲和性支持问题

  • 🔍 症状:CPU 亲和性功能不可用
  • 🔎 原因:目标平台不支持 CPU 亲和性或配置未启用
  • ✅ 解决方法
    • 确保配置时启用了 --enable-affinity
    • 检查目标平台是否支持 CPU 亲和性
    • 位置:build-hnp/htop/Makefile:8

❌ 问题 6:进程信息显示不完整

  • 🔍 症状:某些进程信息无法显示
  • 🔎 原因:权限不足或 /proc 文件系统不可用
  • ✅ 解决方法
    • 确保有足够的权限访问 /proc 文件系统
    • 检查 /proc 文件系统是否已挂载
    • 使用 sudo 运行 htop(如果需要)
    • 位置:运行时

❌ 问题 7:颜色显示异常

  • 🔍 症状:颜色显示不正确或无法显示颜色
  • 🔎 原因:终端不支持颜色或颜色配置不正确
  • ✅ 解决方法
    • 检查终端是否支持颜色($TERM 环境变量)
    • 在 htop 设置中调整颜色方案(按 F2)
    • 使用支持颜色的终端
    • 位置:运行时

❌ 问题 8:架构不支持

  • 🔍 症状Unsupported OHOS_ARCH=
  • 🔎 原因:传入的架构不在支持列表中
  • ✅ 解决方法
    • 确保传入支持架构(aarch64x86_64
    • 位置:build-hnp/Makefile:1-49

🔄 重建与扩展

  • 🔧 重建单包

    make -C build-hnp rebuild-htop  # 触发子包重新编译并刷新 .stamp
    
  • 🧹 清理

    make -C build-hnp clean  # 清理 sysroot、所有 .stamp 和 PKGS_MARKER
    
  • 📦 扩展:Htop 是系统监控的核心工具,被广泛用于实时监控系统资源和管理进程

  • 🔄 自动重建机制

    • 修改 PKGS 后,check-pkgs 会自动检测变化并触发重新构建
    • 新增外部 HNP 包到 external-hnp 目录后,会自动合并到 base.hnp

💡 实践建议

  • 🔧 构建配置:根据目标环境调整补丁以适配 /proc 接口
  • 🚀 依赖管理:确保 ncurses 在 htop 之前构建
  • 📦 系统监控:Htop 为系统监控提供了强大的交互式界面
  • 🔗 终端支持:确保终端类型支持 ncurses 和颜色显示
  • 🌐 性能分析:使用 Htop 进行系统性能分析和故障排查

📝 结论与建议

  • ✅ 本次已在 aarch64 环境下完成 Htop 3.4.1 的交叉编译与打包,二进制和相关资源已安装到 sysroot 并纳入 HNP 包。
  • 💡 为保证构建稳定
    • 确保 ncurses 在 htop 之前构建
    • 使用补丁修正目标环境相关问题
    • 确保通过 create-hnp.sh 触发构建以获得完整环境变量
    • 利用 check-pkgs 机制自动检测包列表变化,无需手动清理
    • Htop 为系统监控提供了强大的交互式界面和丰富的功能
    • 常见陷阱包括 /proc 兼容问题、终端显示异常、ncursesw 依赖缺失;当前已通过构建配置和补丁处理
    • 建议使用支持 ncurses 的终端,并根据需要调整显示选项和颜色方案
    • 已完成 aarch64 目标下 Htop 的交叉编译与打包,工具与资源进入 sysroot 并纳入 HNP 包

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值