开源鸿蒙化跨平台的用户空间 USB 设备访问库libusb过程实录和问题处理
本文详细记录了在aarch64架构下构建libusb 1.0.29库的完整过程。通过OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh命令触发构建,包含镜像获取、Autotools构建链路、产物验证等关键步骤。重点介绍了libusb的跨平台特性、核心功能(设备管理、数据传输等)以及构建中的常见问题处理方案,如GitHub下载超时、工具链配
本文记录在 aarch64 目标下使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 libusb 1.0.29 的完整过程,涵盖镜像获取与回退、Autotools 构建链路、产物验证与常见问题处理,便于复现与维护。
📖 Libusb 简介
libusb 是一个用 C 语言编写的、跨平台的用户空间 USB 设备访问库。它提供了一个统一的 API 来访问 USB 设备,无需编写内核驱动程序。libusb 支持 Linux、macOS、Windows、Android 等多种操作系统,被广泛用于 USB 设备通信、固件更新、设备调试等场景。libusb 1.0.29 是稳定版本,提供了可靠的 USB 设备访问能力。
🎯 Libusb 的作用与重要性
libusb 是 USB 设备访问的核心库,提供了:
- 用户空间访问:无需编写内核驱动程序即可访问 USB 设备
- 跨平台支持:统一的 API 支持多种操作系统
- 设备枚举:枚举和发现 USB 设备
- 数据传输:支持控制传输、批量传输、中断传输、等时传输
- 设备控制:打开/关闭设备、配置接口、声明接口
- 热插拔支持:支持 USB 设备的热插拔检测
- 广泛使用:被众多 USB 工具和应用程序使用(如 usbutils、hdc、Android ADB 等)
- 开发友好:简洁的 API 设计,易于集成到应用程序中
🔧 Libusb 核心特性
1. 设备管理
- 设备枚举:枚举系统中所有 USB 设备
- 设备描述符:获取设备、配置、接口、端点描述符
- 设备打开/关闭:打开和关闭 USB 设备句柄
- 设备查找:根据 VID/PID 查找特定设备
2. 数据传输
- 控制传输:USB 控制传输(用于设备配置和状态查询)
- 批量传输:USB 批量传输(用于大量数据传输)
- 中断传输:USB 中断传输(用于实时数据传输)
- 等时传输:USB 等时传输(用于流媒体传输)
3. 接口管理
- 接口声明:声明和释放接口
- 接口配置:设置和获取接口配置
- 端点管理:管理端点的数据传输
4. 平台支持
- Linux:使用 usbfs 或 libudev 后端
- macOS:使用 IOKit 后端
- Windows:使用 WinUSB 后端
- Android:支持 Android USB 主机模式
5. 高级功能
- 热插拔回调:注册热插拔事件回调
- 超时控制:设置数据传输超时
- 错误处理:详细的错误码和错误信息
- 线程安全:支持多线程访问(需要额外配置)
6. 应用场景
- USB 设备通信:与 USB 设备进行数据通信
- 固件更新:更新 USB 设备的固件
- 设备调试:调试和测试 USB 设备
- USB 工具开发:开发 USB 相关的工具和应用程序
- 嵌入式开发:在嵌入式系统中访问 USB 设备
🚀 构建入口与顶层组织
- 📝 执行命令:
OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh - 🔧 入口脚本:
create-hnp.sh导出 SDK 路径并触发顶层构建 - 顶层 Makefile:
build-hnp/Makefile已将libusb纳入PKGS,base.hnp依赖所有包完成标记STAMP并完成打包与拷贝到entry/hnp/$(OHOS_ABI)
⚙️ 包配置与工具链
- 包 Makefile:
build-hnp/libusb/Makefile- 源地址:
https://github.com/libusb/libusb/releases/download/v1.0.29/libusb-1.0.29.tar.bz2 - 下载策略:使用通用下载规则,支持镜像回退(
wget → curl) - 配置参数:
--prefix=$(PREFIX):安装前缀--disable-static:禁用静态库--enable-shared:启用共享库--disable-udev:禁用 udev 支持(目标环境精简,无libudev)--host $(OHOS_ARCH)-unknown-linux-musl:交叉编译目标
- 安装后处理:为兼容依赖
libusb头路径的项目(如 hdc),添加符号链接include/libusb -> include/libusb-1.0 - 使用通用 Autotools 宏构建(下载→解包→
configure→make→install→strip→复制至../sysroot)
- 源地址:
- 工具链:
aarch64-unknown-linux-ohos-clang与 LLVMar/ranlib/strip - 依赖:无特殊依赖(使用 usbfs 后端,无需 udev)
📋 关键执行与日志
- 下载与解包:
- 从 GitHub Releases 获取归档,解包至
temp/libusb-1.0.29并创建build目录
- 从 GitHub Releases 获取归档,解包至
- 配置与编译:
- 使用 Autotools 配置系统,配置交叉编译参数
- 禁用 udev 支持,使用纯 usbfs 后端
- 编译 libusb 共享库
- 安装与复制:
- 安装到临时前缀
build/data/app/base.org/base_1.0后 strip 二进制文件 - 创建符号链接
include/libusb -> include/libusb-1.0以兼容 hdc 等工具 - 复制到
../sysroot并记录文件列表(file.lst)
- 安装到临时前缀
✅ 产物验证
📦 检查打包文件
ls build-hnp/base.hnp # 应存在
ls entry/hnp/arm64-v8a/*.hnp # 应包含 base.hnp 与 base-public.hnp
🔍 检查 Libusb 库和头文件
# 检查共享库
ls -lh build-hnp/sysroot/lib/libusb*
file build-hnp/sysroot/lib/libusb-1.0.so.0
# 检查头文件
ls -lh build-hnp/sysroot/include/libusb*
ls -lh build-hnp/sysroot/include/libusb-1.0/
# 检查 pkg-config 文件
ls -lh build-hnp/sysroot/lib/pkgconfig/libusb-1.0.pc
cat build-hnp/sysroot/lib/pkgconfig/libusb-1.0.pc
✅ 构建验证结果:
- ✅ Libusb 共享库已安装:
libusb-1.0.so.0.5.0(104K) - 主共享库libusb-1.0.so.0- 版本符号链接libusb-1.0.so- 开发符号链接
- ✅ 文件类型:ELF 64-bit LSB shared object, ARM aarch64
- ✅ 动态链接:
dynamically linked - ✅ 已剥离符号:
stripped - ✅ 头文件已安装:
include/libusb-1.0/libusb.h(85K) - 主头文件include/libusb- 符号链接到libusb-1.0(兼容 hdc 等工具)
- ✅ pkg-config 文件已安装:
libusb-1.0.pc- pkg-config 配置文件
- ✅ HNP 包产物:
entry/hnp/arm64-v8a/base.hnp与base-public.hnp - ✅ 已打包到
base.hnp中
🐛 常见问题与处理
❌ 问题 1:GitHub Releases 下载超时
- 🔍 症状:连接
github.com超时或读取失败 - 🔎 原因:GitHub 访问不稳定或网络问题
- ✅ 解决方法:
- 使用通用下载规则,支持镜像回退(
wget → curl) - 延长超时时间
- 清理坏归档后重试
- 位置:
build-hnp/libusb/Makefile:3(使用通用下载规则)
- 使用通用下载规则,支持镜像回退(
❌ 问题 2:交叉工具链问题
- 🔍 症状:configure 或编译时出现工具链错误
- 🔎 原因:交叉工具链配置不正确或环境变量未设置
- ✅ 解决方法:
- 使用 OHOS SDK 的 LLVM,确保
--host与三元组一致(aarch64-unknown-linux-musl) - 确保通过
create-hnp.sh触发构建以获得完整环境变量 - 位置:
build-hnp/libusb/Makefile:6
- 使用 OHOS SDK 的 LLVM,确保
❌ 问题 3:udev 依赖问题
- 🔍 症状:configure 时提示找不到 udev 或 libudev
- 🔎 原因:目标环境精简,无
libudev - ✅ 解决方法:
- 使用
--disable-udev禁用 udev 支持 - 使用纯 usbfs 后端(适用于 Linux 系统)
- 位置:
build-hnp/libusb/Makefile:6
- 使用
❌ 问题 4:头文件路径问题
- 🔍 症状:编译时提示找不到
libusb.h,或 hdc 等工具无法找到头文件 - 🔎 原因:头文件路径不匹配(某些工具期望
include/libusb而不是include/libusb-1.0) - ✅ 解决方法:
- 创建符号链接
include/libusb -> include/libusb-1.0 - 使用
AFTER_INSTALL钩子在安装后创建符号链接 - 位置:
build-hnp/libusb/Makefile:7
- 创建符号链接
❌ 问题 5:权限问题
- 🔍 症状:运行时提示权限不足,无法访问 USB 设备
- 🔎 原因:Linux 系统需要适当的权限才能访问 USB 设备
- ✅ 解决方法:
- 确保程序以 root 权限运行(不推荐)
- 配置 udev 规则(如果使用 udev 后端)
- 使用 usbfs 后端时,确保
/proc/bus/usb可访问 - 在 OpenHarmony 中可能需要特殊权限配置
❌ 问题 6:设备未找到
- 🔍 症状:
libusb_open_device_with_vid_pid返回 NULL - 🔎 原因:设备未连接、VID/PID 错误、或设备被其他程序占用
- ✅ 解决方法:
- 检查设备是否已连接
- 使用
libusb_get_device_list枚举设备,确认 VID/PID - 检查是否有其他程序占用设备
- 确保设备驱动未加载(libusb 需要独占访问)
❌ 问题 7:接口声明失败
- 🔍 症状:
libusb_claim_interface返回错误 - 🔎 原因:接口已被其他程序占用、接口号错误、或设备不支持该接口
- ✅ 解决方法:
- 检查接口号是否正确
- 确保没有其他程序占用接口
- 使用
libusb_get_config_descriptor检查可用接口 - 尝试使用
LIBUSB_CLAIM_INTERFACE_BIND_KERNEL_DRIVER标志
❌ 问题 8:传输超时
- 🔍 症状:数据传输操作超时
- 🔎 原因:设备未响应、端点地址错误、或超时时间设置过短
- ✅ 解决方法:
- 检查端点地址是否正确
- 增加超时时间
- 检查设备是否正常工作
- 使用
libusb_get_endpoint_descriptor检查端点配置
❌ 问题 9:热插拔不支持
- 🔍 症状:
libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)返回 0 - 🔎 原因:平台不支持热插拔或后端不支持
- ✅ 解决方法:
- 检查平台是否支持热插拔
- 使用轮询方式检测设备插拔
- 使用
libusb_get_device_list定期检查设备列表变化
❌ 问题 10:符号链接问题
- 🔍 症状:hdc 等工具无法找到
libusb.h - 🔎 原因:符号链接未正确创建或指向错误
- ✅ 解决方法:
- 检查符号链接:
ls -l /data/app/base.org/base_1.0/include/libusb - 确保符号链接指向
libusb-1.0 - 重新创建符号链接:
ln -sf libusb-1.0 /data/app/base.org/base_1.0/include/libusb - 位置:
build-hnp/libusb/Makefile:7
- 检查符号链接:
🔄 重建与清理
-
🔧 重建单包:
rm -rf build-hnp/libusb/temp build-hnp/libusb/build build-hnp/libusb/.stamp OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a make -C build-hnp/libusb -
🧹 清理:
make -C build-hnp clean # 清理 sysroot、所有 .stamp 和 PKGS_MARKER -
📦 扩展:libusb 是 USB 设备访问的核心库,适合用于 USB 设备通信、固件更新、设备调试等场景
-
🔄 自动重建机制:
- 修改
PKGS后,check-pkgs会自动检测变化并触发重新构建 - 新增外部 HNP 包到
external-hnp目录后,会自动合并到base.hnp
- 修改
💡 实践建议
- 🔧 构建配置:使用 Autotools 构建系统,配置清晰,依赖明确
- 🚀 使用场景:libusb 适合用于 USB 设备通信、固件更新、设备调试、USB 工具开发等场景
- 📦 依赖管理:libusb 无特殊依赖(使用 usbfs 后端,无需 udev)
- 🔗 开发建议:使用 pkg-config 获取编译和链接标志,简化构建过程
- 🌐 平台建议:在 OpenHarmony 中使用 usbfs 后端,无需 udev 支持
- 🔒 安全建议:注意 USB 设备访问权限,避免未授权访问
📝 结论与建议
- ✅ libusb 1.0.29 在 aarch64 目标下完成交叉构建,库与头文件安装到
sysroot并纳入 HNP 打包。 - 💡 为保证构建稳定:
- 使用 Autotools 构建系统,配置清晰
- 无特殊依赖,构建过程简单
- 使用多镜像回退策略确保下载成功
- 确保通过
create-hnp.sh触发构建以获得完整环境变量 - 禁用 udev 支持,使用纯 usbfs 后端适配精简环境
- 创建符号链接
include/libusb -> include/libusb-1.0以兼容 hdc 等工具 - 利用
check-pkgs机制自动检测包列表变化,无需手动清理 - libusb 为 USB 设备访问提供了统一的跨平台 API
- 常见陷阱包括 GitHub 下载超时、交叉工具链问题、udev 依赖问题、头文件路径问题;当前已通过构建配置处理
- 建议与
hdc、usbutils一同使用,完善 USB 工具生态 - 构建过程简洁,Autotools 交叉参数清晰,产物安装路径明确
- 产物开箱即用,适合在设备上进行 USB 设备通信和开发
📚 以上为 libusb 构建的深度解读与实践记录。libusb 是 USB 设备访问的核心库,被广泛用于 USB 设备通信、固件更新、设备调试等场景,为开发者提供了统一的跨平台 USB 设备访问能力。
更多推荐




所有评论(0)