buildozer打包详解:细说那些我踩过的坑

Buildozer 是一款用于将 Python/Kivy 应用打包为 Android APK 的工具,同时也支持其他框架(如 Pywebview)的打包流程。

环境配置(Windows + WSL2)

Windows环境,官方建议在 WSL2 环境下使用 Buildozer,以下是具体步骤:

  1. Microsoft Store 中安装 WSL2Ubuntu ,可参考以下教程: 超详细 Windows10/Windows11 子系统(WSL2)安装 Ubuntu20.04(带桌面环境)

  2. 在 WSL2 中安装 Buildozer 环境:

bash 复制代码
# 安装依赖包
sudo apt update
sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev automake

# 安装 buildozer
pip3 install --user buildozer

# 将用户目录添加至 PATH 环境变量
echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc
source ~/.bashrc

💡提示:

  1. 依赖列表参考自官方文档,不同 Ubuntu 版本可能略有差异:Installation | Buildozer 1.5.1.dev0 documentation
  2. 建议使用普通用户执行 pip3 install --user buildozer,避免因 root 权限引发配置文件初始化告警。

可选:创建专用用户

为 Buildozer 项目创建独立用户有助于隔离权限:

bash 复制代码
# 创建用户 builder
sudo useradd -m -s /bin/bash -c "Buildozer专用用户" builder
sudo passwd builder  # 设置密码,例如 build123

# 将项目目录(如 /usr/myapp)所有权赋予 builder
sudo chown -R builder:builder /usr/myapp

# 切换至新用户
su - builder

完成上述配置后,即可开始使用 Buildozer。


快速开始

初始化 Buildozer

在项目根目录执行:

bash 复制代码
buildozer init

该命令会生成 buildozer.spec 配置文件。

配置应用

根据项目需求编辑 buildozer.spec。若使用 Pywebview 框架,可参考官方示例:pywebview/examples/todos/buildozer.spec

构建 APK

bash 复制代码
# 首次构建(下载依赖耗时较长)
buildozer -v android debug

# 后续构建
buildozer android debug

Buildozer 的优势在于构建过程自动化,但调试构建错误往往较为繁琐。


常见构建错误与解决

0. 网络问题

构建过程中可能需要访问 Google 服务,请确保网络通畅。若使用 WSL,建议采用 NAT 模式以便 Windows 与 WSL 间网络互通。

1. Cython (cython) not found

Cython 是编译 Python 扩展模块的必需工具,安装即可:

bash 复制代码
pip3 install --user cython

2. long 类型报错

错误示例如下:

原因 :Python 3 移除了 long 类型,相关 Cython 文件需适配为 int

解决 :手动修改构建缓存目录下相关文件中的 long 引用。常见文件路径如下(示例为 armeabi-v7a 架构):

  • .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/pyjnius-sdl2/armeabi-v7a__ndk_target_21/pyjnius/jnius/jnius_utils.pxi
  • .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/pyjnius-sdl2/armeabi-v7a__ndk_target_21/pyjnius/jnius/jnius_conversion.pxi
  • .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/kivy/armeabi-v7a__ndk_target_21/kivy/kivy/weakproxy.pyx
  • .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/kivy/armeabi-v7a__ndk_target_21/kivy/kivy/graphics/opengl.pyx
  • .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/kivy/armeabi-v7a__ndk_target_21/kivy/kivy/graphics/context_instructions.pyx

若构建多平台 APK,需在对应架构目录(如 arm64-v8a)下同步修改。

3. SyntaxError: Missing parentheses in call to 'print'

该错误源于 Python 2 与 Python 3 的 print 语法不兼容。

解决 :在 buildozer.spec 中配置跳过语法检查,并排除测试目录:

shell 复制代码
[app]
android.skip_check = True
source.exclude_dirs = tests, pyjnius/tests

4. AndroidManifest 标签兼容性错误

解决 :注释 buildozer.spec 中的相关主题配置:

shell 复制代码
# android.apptheme = @android:style/Theme.Material.NoActionBar

5. fatal: destination path 'external/jpeg' already exists

重复构建时缓存冲突导致,清理后重新构建即可:

bash 复制代码
buildozer android clean
buildozer android debug

6. Android 版本不匹配

需确保 buildozer.spec 中的 NDK、SDK、API 版本一致。可参考如下配置并咨询文档或 AI 工具进行调整:

shell 复制代码
android.permissions = INTERNET
android.arch = arm64-v8a, armeabi-v7a
android.ndk = 25
android.sdk = 28
android.minapi = 21
android.api = 29
android.ndk_api = 21

构建成功后的注意事项

即使 APK 打包成功,仍可能因兼容性或代码问题导致闪退。此时可将生成的 Java 代码导入 Android Studio 进一步调试。代码路径通常为:

复制代码
\\wsl.localhost\Ubuntu-22.04\{项目目录}\.buildozer\android\platform\build-arm64-v8a\dists\{项目java代码目录}

结语

最后成功界面示例:

以上是使用 Buildozer 打包 Android APK 过程中的常见问题与解决方案,希望对你有帮助。如果内容对你有用,欢迎点赞、收藏与关注!

相关推荐
爬山算法4 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
lili-felicity6 分钟前
CANN模型量化详解:从FP32到INT8的精度与性能平衡
人工智能·python
数据知道9 分钟前
PostgreSQL实战:详解如何用Python优雅地从PG中存取处理JSON
python·postgresql·json
WeiXiao_Hyy22 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
ZH154558913122 分钟前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
玄同76522 分钟前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
User_芊芊君子28 分钟前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
苏渡苇28 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
白日做梦Q38 分钟前
Anchor-free检测器全解析:CenterNet vs FCOS
python·深度学习·神经网络·目标检测·机器学习
long31639 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法