Paddle Lite 源码编译指南:Linux x86 环境下通过 Android NDK 交叉编译构建 Android 预测库

发布时间:2026/9/17 21:33:14
Paddle Lite 源码编译指南:Linux x86 环境下通过 Android NDK 交叉编译构建 Android 预测库 Paddle Lite 源码编译指南Linux x86 环境下通过 Android NDK 交叉编译构建 Android 预测库【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite导读本文面向「本机为 x86 架构 Linux 操作系统目标硬件为 Android 设备」的开发者完整讲解如何从 Paddle Lite 源码出发借助 Android NDK 交叉编译工具链构建 Android 版本的推理编译包。读完本文你将掌握lite/tools/build_android.sh的全部核心编译参数与命令行用法、环境准备细节、编译产物目录结构以及如何为 OpenCL GPU、华为麒麟 NPU、联发科 APU、芯原 TIM-VX、Android NNAPI 等异构硬件定制编译包从而在自己的 Android 应用程序中集成 Paddle Lite 推理能力。适用版本说明本文介绍的编译方法适用于 Paddle Lite v2.6 及以上版本v2.3 及之前版本请参考 release/v2.3 源码编译方法。编译前通常不需要自行构建编译包优先推荐下载 Paddle Lite 官方发布的预编译包只有当官方编译包未覆盖你的场景或需要修改 Paddle Lite 源码时才需要按照本文从源码构建。一、场景与已验证的软硬件配置在开始编译之前先明确本场景的软硬件边界。Paddle Lite 在该场景下已验证的配置如下---本机环境目标硬件环境操作系统LinuxAndroid 4.1 及以上芯片版本为 ARM v7 时Android 5.0 及以上芯片版本为 ARM v8 时芯片层x86 架构arm64-v8a / armeabi-v7a CPUHuawei Kirin NPUMediaTek APUOpenCL几点补充说明OpenCL 是面向异构硬件平台的编译库Paddle Lite 支持在 Android 系统上运行基于 OpenCL 的程序。查询以上芯片支持的具体型号以及对应手机型号可参考支持硬件列表章节。二、准备编译环境2.1 推荐环境版本C 环境gcc、g 8.2.0CMake 3.10Android NDK r17c注意从 ndk-r18 开始NDK 交叉编译工具仅支持 Clang不再支持 GCCgit、make、wget、python、adbJava 环境OpenJDK 1.8.0Gradle 4.1.2Android SDK 212.2 环境安装命令以 Ubuntu 为例以下命令以 Ubuntu 为例其它 Linux 发行版安装步骤类似执行时注意需要 root 用户权限。# 1. 安装 gcc g git make wget python unzip adb curl 等基础软件 apt update apt-get install -y --no-install-recommends \ gcc g git make wget python unzip adb curl # 2. 安装 jdk apt-get install -y default-jdk # 3. 安装 CMake以下命令以 3.10.3 版本为例其他版本步骤类似。 wget -c https://mms-res.cdn.bcebos.com/cmake-3.10.3-Linux-x86_64.tar.gz \ tar xzf cmake-3.10.3-Linux-x86_64.tar.gz \ mv cmake-3.10.3-Linux-x86_64 /opt/cmake-3.10 ln -s /opt/cmake-3.10/bin/cmake /usr/bin/cmake \ ln -s /opt/cmake-3.10/bin/ccmake /usr/bin/ccmake # 4. 下载 linux-x86_64 版本的 Android NDK以下命令以 r17c 版本为例其他版本步骤类似。 cd /tmp curl -O https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip cd /opt unzip /tmp/android-ndk-r17c-linux-x86_64.zip # 5. 添加环境变量 NDK_ROOT 指向 Android NDK 的安装路径 echo export NDK_ROOT/opt/android-ndk-r17c ~/.bashrc source ~/.bashrc # 6. (可选) 删除 debug 编译参数减小二进制体积 # 用编辑器打开 $ANDROID_NDK/build/cmake/android.toolchain.cmake 删除 -g 这行 # 或者打开 $ANDROID_NDK/build/cmake/android-legacy.toolchain.cmake (Android NDK r23c及以上版本) 执行同样的操作其中第 6 步涉及的工具链文件内容形如list(APPEND ANDROID_COMPILER_FLAGS -g -DANDROID ... )删除其中的-g参数可以去除调试信息、显著减小最终二进制体积相关背景可参考 NDK 官方 issue #243。2.3 环境变量的作用编译脚本 lite/tools/build_android.sh 会通过环境变量NDK_ROOT定位 Android NDK 的安装路径。从脚本源码可见它还会从NDK_ROOT中解析出 NDK 版本号NDK_NAME$(echo $NDK_ROOT | egrep -o android-ndk-r[0-9]{2}) NDK_VERSION$(echo $NDK_NAME | egrep -o [0-9]{2}) if [ $NDK_VERSION -gt 17 ]; then TOOLCHAINclang fi即当检测到 NDK 版本高于 r17 时脚本会自动将工具链切换为 clang因为 r18 及以上 NDK 不再提供 GCC 交叉编译器。因此请务必保证NDK_ROOT正确指向 NDK 的安装根目录包含android-ndk-rXX目录名否则编译会在 CMake 配置阶段失败。三、了解基础编译参数Paddle Lite 仓库中的 lite/tools/build_android.sh 脚本用于构建 Android 版本的编译包。通过修改脚本中的变量或通过命令行参数传入见下文编译步骤可满足不同场景的构建需求。常用的基础编译参数如下表参数说明可选范围默认值arch目标硬件的 ARM 架构版本armv8 / armv7armv8toolchainC 语言的编译器工具链gcc / clanggccandroid_stl链接到的 Android C STL 类型c_static / c_sharedc_staticwith_java是否包含 Java 编译包目标应用程序是 Java 语言时需配置为 ONOFF / ONONwith_static_lib是否发布 C 静态库OFF / ONOFFwith_cv是否将 cv 函数加入编译包中OFF / ONOFFwith_log是否在执行过程打印日志OFF / ONONwith_exception是否开启 C 异常OFF / ONOFFwith_extra是否编译完整算子见支持算子一节OFF / ONOFFwith_profile是否打开执行耗时分析OFF / ONOFFwith_precision_profile是否打开逐层精度结果分析OFF / ONOFFwith_arm82_fp16是否开启半精度算子OFF / ONOFFandroid_api_levelAndroid API 等级1627armv7:16 / armv8:213.1 Android API Level 与最低 Android 版本对照Paddle Lite 支持的最低安卓版本是 Android 4.1芯片版本为 ARM v7 时或 Android 5.0芯片版本为 ARM v8 时。可通过--android_api_level选项设定具体数值该数值不应低于下表的最低 Android API LevelARM ABIarmv7armv8支持的最低 Android API 等级1621支持的最低 Android 版本4.15.0脚本中的set_android_api_level函数实现了该校验逻辑当未显式指定时使用架构对应的默认值显式指定且不低于最低值时会以-DANDROID_NATIVE_API_LEVELlevel传入 CMake若低于最低值则直接报错退出参见 lite/tools/build_android.sh 中set_android_api_level的实现。3.2 参数间的联动约束源码级提示阅读 lite/tools/build_android.sh 的main函数可以确认以下参数联动规则这些在使用时容易踩坑with_arm82_fp16ON时强制使用 clang armv8半精度算子FP16 kernels的编译依赖 clang 工具链与 armv8 架构脚本会强制将TOOLCHAIN设为clang、ARCH设为armv8。with_exceptionON且 armv7 gcc 会报错只有 clang 为 32 位 ARM 提供 C 异常处理支持脚本会直接抛出Error: only clang provide C exception handling support for 32-bit ARM.并退出。with_stripON会强制开启with_extra按输入模型裁剪库时依赖完整算子集脚本内部将WITH_EXTRA置为ON。with_arm8_sve2ON要求 NDK r23 且 arch 为 armv8对应脚本中的WITH_ARM8_SVE2变量。四、编译步骤4.1 完整编译流程运行编译脚本之前请先检查系统环境变量NDK_ROOT指向正确的 Android NDK 安装路径。之后即可下载并构建 Paddle Lite 编译包# 1. 检查环境变量 NDK_ROOT 指向正确的 Android NDK 安装路径 echo $NDK_ROOT # 2. 下载 Paddle Lite 源码并切换到发布分支如 release/v2.10 git clone https://github.com/PaddlePaddle/Paddle-Lite.git cd Paddle-Lite git checkout release/v2.10 # (可选) 删除 third-party 目录编译脚本会自动从国内 CDN 下载第三方库文件 # rm -rf third-party # 3. 编译 Paddle Lite Android 预测库 ./lite/tools/build_android.sh4.2 常见问题第三方库下载缓慢编译过程中如出现源码编译耗时过长通常是第三方库下载过慢或失败导致。请在完成 Paddle Lite 源码下载后删除本地仓库根目录下的third-party目录编译脚本会自动下载存储于国内 CDN 的第三方依赖文件压缩包从而节省从 GitHub repo 同步第三方库的时间。从脚本源码看这一机制体现在 lite/tools/build_android.sh 的prepare_thirdparty函数中脚本会优先从https://paddlelite-data.bj.bcebos.com/third_party_libs/下载第三方库压缩包并解压到仓库根目录的third-party下只有本地已有该目录时才退化为git submodule update --init --recursive。因此删除third-party目录后使用国内 CDN 下载通常更快、更稳定。4.3 tiny_publish 与 full_publish两种发布模式通过阅读 lite/tools/build_android.sh 的主函数可以看到脚本支持两种构建模式默认模式不传任何参数或仅传参数走make_tiny_publish_so分支只编译light_api轻量 API库即上表中描述的默认产物是官方推荐的方式。full_publish模式./lite/tools/build_android.sh full_publish走make_full_publish_so分支同时编译light_api和full/cxx_api两类库产物中还会包含paddle_api.h等完整 C 接口头文件适用于需要完整 C API如多模型、多线程管理等高级用法的场景。此外还可在任意模式下追加help查看脚本内置的完整参数说明./lite/tools/build_android.sh help。4.4 常用自定义编译示例结合脚本main函数中解析的参数以下是几个高频定制场景的完整命令# 编译 armv7 架构、clang 工具链、c_shared STL 的编译包不包含 Java 库 ./lite/tools/build_android.sh --archarmv7 --toolchainclang --android_stlc_shared --with_javaOFF # 编译包含完整算子的编译包OCR、NLP 等序列模型需要 ./lite/tools/build_android.sh --with_extraON # 编译开启 FP16 半精度算子自动强制 clang armv8 ./lite/tools/build_android.sh --with_arm82_fp16ON # 编译 full_publish 完整 C/Java 库tiny cxx 双 API ./lite/tools/build_android.sh full_publish # 编译 benchmark 二进制同时会开启 extra/exception/opencl 并关闭日志 ./lite/tools/build_android.sh --with_benchmarkON full_publish # 编译裁剪库仅保留输入模型用到的算子需先用 opt 工具得到优化模型目录 ./lite/tools/build_android.sh --with_stripON --opt_model_dirYourOptimizedModelDir其中--with_strip/--opt_model_dir对应脚本中的WITH_STRIP/OPTMODEL_DIR变量裁剪详情可参考 库裁剪说明。编译线程数可通过环境变量LITE_BUILD_THREADS调整脚本默认取readonly NUM_PROC${LITE_BUILD_THREADS:-4}。五、验证编译结果5.1 默认参数编译产物目录如果按./lite/tools/build_android.sh中的默认参数执行tiny_publish、armv8、gcc成功后会在Paddle-Lite/build.lite.android.armv8.gcc/inference_lite_lib.android.armv8生成 Paddle Lite 编译包文件目录结构如下inference_lite_lib.android.armv8/ ├── cxx C 预测库和头文件 │ ├── include C 头文件 │ │ ├── paddle_api.h │ │ ├── paddle_image_preprocess.h │ │ ├── paddle_lite_factory_helper.h │ │ ├── paddle_place.h │ │ ├── paddle_use_kernels.h │ │ ├── paddle_use_ops.h │ │ └── paddle_use_passes.h │ └── lib C 预测库 │ ├── libpaddle_api_light_bundled.a C 静态库 │ └── libpaddle_light_api_shared.so C 动态库 │ ├── java Java 预测库 │ ├── jar │ │ └── PaddlePredictor.jar Java JAR 包 │ ├── so │ │ └── libpaddle_lite_jni.so Java JNI 动态链接库 │ └── src │ └── demo C 和 Java 示例代码 ├── cxx C 预测库示例 └── java Java 预测库示例5.2 产物解读C 预测库头文件位于cxx/include其中paddle_api.h为 C 预测 API 主头文件库文件位于cxx/lib静态库libpaddle_api_light_bundled.a与动态库libpaddle_light_api_shared.so对应两种链接方式其中静态库内部已经将依赖打包bundled便于直接集成。Java 预测库java/jar/PaddlePredictor.jar为 Java 接口 JAR 包java/so/libpaddle_lite_jni.so为 JNI 动态链接库二者需同时集成到 Android 工程中。demodemo/cxx与demo/java分别提供 C 和 Java 的示例代码可在集成前快速验证编译包可用性。构建目录命名规则build.lite.android.arch.toolchain例如默认的build.lite.android.armv8.gcc编译包目录名则为inference_lite_lib.android.arch。修改 arch/toolchain 后产物路径会随之变化。六、多设备支持为异构硬件定制编译包除了 CPUarmv8/armv7之外Paddle Lite 还支持在 Android 平台上通过 OpenCL 与 NNAdapter 机制接入 GPU / NPU 等异构硬件。以下参数均可在build_android.sh中对应配置详见仓库中的 多设备支持子文档 系列。6.1 OpenCLGPUPaddle Lite 支持所有兼容 OpenCL 1.1 标准的 GPU 设备。对应编译参数参数说明可选范围默认值with_opencl是否包含 OpenCL 编译OFF / ONOFF启用方式./lite/tools/build_android.sh --with_openclON从脚本源码看当WITH_OPENCLON时脚本会调用prepare_opencl_source_code把 lite/backends/opencl 下的.clkernel 源文件通过gen_opencl_code.py统一打包为opencl_kernels_source.cc再参与编译从而将全部 OpenCL kernel 打进单个库中。OpenCL 在 Android 上的运行细节可参考 OpenCL 使用指南。6.2 NNAdapterAI 硬件统一适配框架NNAdapter 是飞桨推理 AI 硬件统一适配框架可以通过它较为便捷地适配多种硬件。开启 NNAdapter 的总开关参数为参数说明可选范围默认值with_nnadapter是否编译 NNAdapterOFF / ONOFF从仓库源码结构看NNAdapter 的硬件驱动实现位于 lite/backends/nnadapter/nnadapter/src/driver 目录其中包含android_nnapi、huawei_kirin_npu、mediatek_apu、verisilicon_timvx、amlogic_npu、google_xnnpack、rockchip_npu、intel_openvino等多个子目录每个子目录对应一种硬件的 HALHardware Abstraction Layer实现与本文编译参数一一对应。华为麒麟 NPU参数说明可选范围默认值nnadapter_with_huawei_kirin_npu是否编译华为麒麟 NPU 的 NNAdapter HAL 库OFF / ONOFFnnadapter_huawei_kirin_npu_sdk_root设置华为 HiAI DDK 目录hiai_ddk_lib_510空值联发科 APU参数说明可选范围默认值nnadapter_with_mediatek_apu是否编译联发科 APU 的 NNAdapter HAL 库OFF / ONOFFnnadapter_mediatek_apu_sdk_root设置联发科 Neuron Adapter SDK 目录apu_ddk空值芯原 TIM-VX参数说明可选范围默认值nnadapter_with_verisilicon_timvx是否编译芯原 TIM-VX 的 NNAdapter HAL 库OFF / ONOFFnnadapter_verisilicon_timvx_src_git_tag设置芯原 TIM-VX 的代码分支TIM-VX repo 分支名mainnnadapter_verisilicon_timvx_viv_sdk_url设置芯原 TIM-VX SDK 的下载链接用户自定义Android 系统http://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_android_9_armeabi_v7a_6_4_4_3_generic.tgzLinux 系统http://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm64_6_4_4_3_generic.tgznnadapter_verisilicon_timvx_viv_sdk_root设置芯原 TIM-VX 的本地路径用户自定义空值Android NNAPI参数说明可选范围默认值nnadapter_with_android_nnapi是否编译 Android NNAPI 的 NNAdapter HAL 库OFF / ONOFF6.3 NNAdapter 硬件编译示例结合 lite/tools/build_android.sh 解析的--with_nnadapter*、--nnadapter_with_*系列参数典型启用方式如下# 编译 Android NNAPI 支持无需额外 SDK ./lite/tools/build_android.sh --with_nnadapterON --nnadapter_with_android_nnapiON # 编译华为麒麟 NPU 支持需提前下载 HiAI DDK 并解压到本地目录 ./lite/tools/build_android.sh --with_nnadapterON \ --nnadapter_with_huawei_kirin_npuON \ --nnadapter_huawei_kirin_npu_sdk_rootYourHiAIDDKPath # 编译联发科 APU 支持需提前下载 APU SDK 到本地目录 ./lite/tools/build_android.sh --with_nnadapterON \ --nnadapter_with_mediatek_apuON \ --nnadapter_mediatek_apu_sdk_rootYourApuSdkPath # 编译芯原 TIM-VX 支持可指定代码分支与 SDK 下载地址 ./lite/tools/build_android.sh --with_nnadapterON \ --nnadapter_with_verisilicon_timvxON \ --nnadapter_verisilicon_timvx_src_git_tagmain \ --nnadapter_verisilicon_timvx_viv_sdk_urlYourVivSdkUrl需要说明的是脚本变量区lite/tools/build_android.sh 第 1 部分中还有NNADAPTER_WITH_AMLOGIC_NPU、NNADAPTER_WITH_GOOGLE_XNNPACK、NNADAPTER_WITH_QUALCOMM_QNN、NNADAPTER_WITH_FAKE_DEVICE等更多设备开关均可参照同样的--nnadapter_*命令行参数传入本文不再逐一展开。七、总结与后续衔接在 Linux x86 主机上为 Android 构建 Paddle Lite 预测库的完整链路为准备 NDK/CMake/Java 编译环境 → 设置NDK_ROOT→ 下载源码 → 按需组合编译参数运行build_android.sh→ 在build.lite.android.arch.toolchain/inference_lite_lib.android.arch中获取产物 → 集成到 Android 工程。编译完成后建议按如下顺序继续深入运行编译包demo目录下的 C / Java 示例验证推理流程阅读 C API 文档 与 Java API 文档 完成应用集成若需在 iOS、macOS、Windows 等其他平台交叉编译可参考 源码编译目录 下的对应文档如 linux_x86_compile_arm_linux.rst、macos_compile_ios.rst针对具体 NPU 硬件的模型部署细节可查阅 demo_guides 目录 下的对应硬件指南如 huawei_kirin_npu.md、mediatek_apu.md、verisilicon_timvx.md、android_nnapi.md。【免费下载链接】Paddle-LitePaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle-Lite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考