buildozer打包集成scipy的Kivy安卓应用编译失败解决方案
问题背景
- 开发Kivy GUI应用时需要用到微积分、积分相关计算能力,代码中已引入scipy对应模块,引入代码如下:
from scipy import integrate, special, e
- 使用buildozer将应用编译为安卓安装包后运行崩溃,核心需求为正确配置buildozer.spec引入scipy库完成安卓打包,同时了解支持微积分、积分计算的其他替代Python库。
- 编译阶段报错信息如下:
[ERROR]: Build failed: arm-linux-androideabi-gfortran not found.
命令执行失败:/usr/bin/python3 -m pythonforandroid.toolchain create --dist_name=statal --bootstrap=sdl2 --requirements=python3,kivy==2.0.0,scipy --arch arm64-v8a --arch armeabi-v7a --copy-libs --color=always --storage-dir="/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a" --ndk-api=21 --ignore-setup-py --debug
报错根因
scipy的核心计算逻辑依赖Fortran编写的底层代码,默认的buildozer/python-for-android交叉编译链不带安卓适配的gfortran编译器,编译阶段找不到对应编译程序直接终止构建。
scipy安卓打包配置步骤
- 提前安装适配安卓NDK版本的gfortran交叉编译组件,组件版本需要和本地配置的NDK版本严格匹配,安装完成后将gfortran可执行文件所在目录加入系统PATH环境变量,保证构建时可以直接调用
arm-linux-androideabi-gfortran程序。 - 修改buildozer.spec配置文件:
- 找到
requirements配置行,不要单独声明scipy,需要把scipy依赖的numpy、openblas一并加入,参考配置:requirements = python3,kivy==2.0.0,numpy,openblas,scipy - 找到
android.ndk_api配置项,确认值为21,和当前使用的gfortran组件适配的NDK API版本一致。 - 找到
android.archs配置项,首次编译建议先只保留单架构(比如arm64-v8a),等单架构编译运行正常后再添加其他架构,避免多架构并行编译出现依赖冲突。
- 找到
- 执行
buildozer android clean清理全部历史编译缓存,再执行正常打包命令即可完成构建。
微积分计算替代库推荐
如果不想处理Fortran交叉编译的复杂配置,可以选择以下无复杂原生依赖、安卓打包兼容性好的Python库:
- mpmath:纯Python实现的任意精度数学计算库,内置数值积分、微分、特殊函数等全套微积分相关计算能力,无任何原生扩展依赖,直接加入requirements即可完成打包,可覆盖绝大多数scipy.integrate、scipy.special模块的常用场景。
- sympy:开源符号计算库,支持符号积分、微分、极限、特殊函数推导与计算,纯Python实现,安卓打包零额外配置,除数值计算外还可满足符号运算需求。
- numpy:buildozer官方提供numpy的预编译包,打包成功率极高,简单的数值积分、数组计算需求可以直接通过numpy的内置接口实现,不需要额外引入其他依赖。
内容的提问来源于stack exchange,提问作者Holloway
相关产品推荐
相关产品推荐

