# Android-qnn
**Repository Path**: jackroing/android-qnn
## Basic Information
- **Project Name**: Android-qnn
- **Description**: 安卓上运行QNN后端
- **Primary Language**: C++
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-24
- **Last Updated**: 2026-02-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Android - ONNX Runtime QNN
## 基于 ONNX Runtime 和高通 QNN 的优化 YOLOv10 物体检测
**在 Snapdragon 移动平台上使用 ONNX Runtime 和 QNN 执行提供高效的 AI 推理**
[](LICENSE)
[](PLATFORMS.md)
[](https://github.com/microsoft/onnxruntime)
## 📋 目录
- [概述](#概述)
- [支持的芯片组](#支持的芯片组)
- [硬件要求](#硬件要求)
- [软件要求](#软件要求)
- [环境搭建](#环境搭建)
- [构建说明](#构建说明)
- [设备配置](#设备配置)
- [测试与验证](#测试与验证)
- [故障排除](#故障排除)
- [性能基准](#性能基准)
```shell
.
├── android # Android 工具链,包含 NDK、SDK、CMD Tool等
├── android_lib # Android 库,包含 ONNX Runtime QNN 库
├── Android.mk # Android 构建配置,用于编译项目
├── build # C++构建输出目录
├── build.sh # Android 构建脚本,用于编译项目
├── CMakeLists.txt # C++ 构建配置,用于编译项目
├── gen_raw.py # 生成测试用原始数据脚本
├── includes # 包含ORT头文件目录
├── libs # 包含ORT库文件目录
├── main.cpp # 测试用例
├── models # 包含模型文件目录
├── obj # 包含Android编译输出目录
├── platform.png # Android 平台QNN验证
├── qnn # 包含 QNN SDK v2.43
├── README.md # 项目说明文档
└── res.png # 测试用例输出示例图
```
## 概述
本项目展示了基于 ONNX Runtime 和高通神经处理 SDK (QNN) 在 Snapdragon 移动平台上运行的优化 YOLOv10 物体检测。该解决方案利用 Hexagon DSP 实现加速推理,提供高效的边缘 AI 功能。
### 主要特性
- 🚀 使用 QNN 执行提供程序优化的 YOLOv10 推理
- ⚡ 在 Snapdragon 平台上的低延迟处理
- 🧠 高效使用 Hexagon DSP 进行神经网络加速
- 📦 基于 ONNX 的模型兼容性
- 📱 准备就绪的 Android 部署
## 支持的芯片组
| Snapdragon 代次 | 架构 | Hexagon 版本 |
|----------------------|--------------|-----------------|
| 8 Gen 1 | SM8450 | v69 |
| 8 Gen 2 | SM8550 | v73 |
| 8 Gen 3 | SM8650 | v75 |
| 8 Elite | SM8750 | v79 |
> **注意:** 根据目标设备架构选择适当的 Hexagon 版本。
## 硬件要求
### 开发环境
- ✅ Linux 开发主机 (推荐 Ubuntu 20.04 LTS 或更高版本)
- ✅ 最小 8GB 内存 (推荐 16GB)
- ✅ 50GB 可用磁盘空间用于 SDK 和构建产物
- ✅ 稳定的互联网连接用于下载依赖项
### 目标设备
- ✅ 搭载 Snapdragon 8 Gen 1/2/3/Elite 芯片组的 Android 设备
- ✅ Android 10+ (API 级别 29+)
- ✅ 已启用开发者选项和 USB 调试
- ✅ USB Type-C 数据线用于设备连接
## 软件要求
### 主机系统依赖
- [Android SDK](https://developer.android.com/studio#command-tools) 包含 Build Tools 36.0.0-rc1
- [Android NDK](https://developer.android.com/ndk/downloads) r29 (29.0.14206865)
- [OpenJDK 21](https://openjdk.org/projects/jdk/21/) (JDK 和 JRE)
- [ADB (Android Debug Bridge)](https://developer.android.com/tools/adb) 工具
- [QNN SDK](https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk) v2.43
- [ONNX Runtime](https://github.com/microsoft/onnxruntime) 包含 QNN 执行提供程序
### 目标设备依赖
- 设备上安装的 QNN 运行时库
- 适当的 Hexagon DSP 固件
## 环境搭建
### 1. 安装主机依赖
> **注意:** `sdkmanager` 工具位于 `android/Sdk/cmdline-tools/latest/bin/`
```bash
# 安装系统包
sudo apt update
sudo apt install adb openjdk-21-jdk openjdk-21-jre
# 安装 Android 构建工具
sdkmanager "build-tools;36.0.0-rc1"
sdkmanager "ndk;29.0.14206865"
sdkmanager "platforms;android-Baklava"
```
### 2. 配置环境变量
将以下内容添加到 `~/.bashrc` 文件并执行 `source ~/.bashrc` 以应用更改:
```bash
# Android 编译环境配置
export ANDROID_HOME=/usr/local/android/Sdk
export ANDROID_NDK=/usr/local/android/Sdk/ndk/29.0.14206865
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
# QNN 环境配置
source /opt/qcom/aistack/qairt/2.43.0.260128/bin/envsetup.sh
export ADSP_LIBRARY_PATH=/opt/qcom/aistack/qairt/2.43.0.260128/lib/hexagon-v73/unsigned/
# 常规环境变量
export PATH=$ANDROID_NDK:$ANDROID_HOME/cmdline-tools/latest/bin:$JAVA_HOME/bin:$PATH
export LD_LIBRARY_PATH=/opt/qcom/aistack/qairt/2.43.0.260128/lib/aarch64-android/:$LD_LIBRARY_PATH
```
### 3. 验证安装
```bash
# 检查 Android SDK 安装
adb version
ndk-build --version
# 检查 Java 安装
java -version
javac -version
```
## 构建说明
### 1. 项目编译
```bash
# 使用构建脚本构建项目
bash build.sh
# 或使用 CMake 手动构建
mkdir build && cd build
cmake ..
cmake --build .
```
### 2. 预期输出
成功编译后,你应该在 `obj/yolo_qnn_demo/main` 处获得可执行文件。
## 设备配置
### 1. 启用开发者选项
- 导航至 设置 > 关于手机
- 连续点击“版本号”7次以启用开发者选项
- 返回 设置 > 开发者选项
- 启用“USB 调试”
### 2. 连接设备
```bash
# 验证设备连接
adb devices
# 应显示连接的设备
List of devices attached
device
```
## 测试与验证
### 1. 部署应用程序到设备
```bash
# 将编译后的二进制文件推送到设备
adb -s push obj/yolo_qnn_demo /data/local/tmp/
# 设置可执行权限
adb -s shell chmod +x /data/local/tmp/yolo_qnn_demo/main
```
### 2. 验证 QNN 环境
在 Android 设备 shell 中执行:
```bash
# 进入设备 shell
adb -s shell
# 设置 QNN 环境 (根据设备调整 hexagon 版本)
source /opt/qcom/aistack/qairt/2.43.0.260128/bin/envsetup.sh
export ADSP_LIBRARY_PATH=/opt/qcom/aistack/qairt/2.43.0.260128/lib/hexagon-v73/unsigned/
# 验证 QNN 平台
qnn-platform-validator --backend all --coreVersion --libVersion --testBackend
```
✅ **预期结果:** QNN 环境验证应成功通过。

### 3. 运行 YOLOv10 推理
```bash
# 导航到应用程序目录
cd /data/local/tmp/yolo_qnn_demo
# 执行推理
./main --qnn ./models/yolov10_qnn_onnx/model.onnx ./test.raw
```
> **注意:** `test.raw` 文件由 `gen_raw.py` 生成并包含原始图像数据。实际检测结果可能因输入数据而异。
✅ **预期结果:** 应用程序应成功运行并显示检测结果。

## 故障排除
### 常见问题
| 问题 | 解决方案 |
|-------|----------|
| ADB 未检测到设备 | 确保已启用 USB 调试且数据线连接正常 |
| 缺少 QNN 库 | 验证 QNN SDK 安装和环境变量 |
| Hexagon 版本不匹配 | 调整 `ADSP_LIBRARY_PATH` 以匹配设备的 Hexagon 版本 |
| 权限被拒绝 | 使用 `chmod +x` 确保正确的文件权限 |
| 模型加载失败 | 验证模型文件是否存在且具有正确的 ONNX 格式 |
### 调试技巧
1. **检查 ADB 连接**:
```bash
adb devices -l
adb logcat &
```
2. **验证库依赖**:
```bash
adb shell ldd /data/local/tmp/yolo_qnn_demo/main
```
3. **监控性能**:
```bash
adb shell top -p $(pidof yolo_qnn_demo)
```
## 性能基准
### 不同平台的预期性能
| 平台 | 推理时间 | 功耗 | 注释 |
|----------|----------------|-------------------|--------|
| Snapdragon 8 Gen 1 | ~15ms | 中等 | Hexagon v69 |
| Snapdragon 8 Gen 2 | ~12ms | 低 | Hexagon v73,效率提升 |
| Snapdragon 8 Gen 3 | ~10ms | 低 | Hexagon v75,最新优化 |
| Snapdragon 8 Elite | ~8ms | 很低 | Hexagon v79,高级功能 |
> **注意:** 实际性能可能因模型复杂度、输入分辨率和设备热状态条件而异。
## 贡献
我们欢迎对此项目的贡献!请阅读我们的 [贡献指南](CONTRIBUTING.md) 了解行为准则和提交拉取请求的流程详情。
## 许可证
此项目根据 Apache 许可证 2.0 版授权 - 详见 [LICENSE](LICENSE) 文件。
## 致谢
- 高通技术公司提供 QNN SDK
- 微软提供 ONNX Runtime
**为边缘 AI 社区倾心打造 ❤️**