Buildozer打包KivyMD应用为APK后启动崩溃求助
排查KivyMD应用Android打包后崩溃的问题
第一步:获取崩溃日志(关键)
没有日志很难精准定位问题,用adb命令过滤设备上的Python相关日志:
adb logcat | grep python
这会直接显示应用崩溃时的错误堆栈,是解决问题的核心依据。
针对你的代码和配置的具体修复方案
1. 升级过时的Kivy版本
你的buildozer.spec中osx.kivy_version = 1.9.1是极其老旧的版本(KivyMD至少需要Kivy 2.0+才能兼容),这会直接导致运行时兼容性崩溃。修改buildozer.spec的依赖配置:
# 删除osx相关的无关配置,替换为Android所需的依赖 requirements = python3,kivy==2.2.1,kivymd==1.2.0,plyer,android
2. 统一权限配置
你在main.py中请求了CAMERA权限,但buildozer.spec里只声明了存储权限,权限不匹配会触发安全限制。更新buildozer.spec的权限列表:
android.permissions = CAMERA, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE
同时,将权限请求移至on_start方法内,避免在应用初始化阶段过早触发:
# 删除main.py开头的全局权限请求代码,仅保留on_start中的逻辑 def on_start(self, **kwargs): if platform == "android": from android.permissions import request_permissions, Permission request_permissions([Permission.CAMERA, Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE])
3. 补全屏幕类定义
代码中添加了MenuUtama、MenuEnkripsi等Screen子类,但未看到这些类的定义。要么在main.py中直接定义基础类:
# 在main.py中补充屏幕类定义 class MenuUtama(Screen): pass class MenuEnkripsi(Screen): pass class MenuDekripsi(Screen): pass class BantuanPengguna(Screen): pass class TentangAplikasi(Screen): pass
要么确保这些类已从其他文件正确导入,且导入的文件被包含在打包范围内。
4. 移除Android环境下的强制窗口尺寸
在Android上硬编码Window.size = (414, 896)会破坏系统的自适应布局,引发渲染错误。改为仅在桌面测试时设置:
if platform != "android": Window.size = (414, 896)
5. 验证依赖与文件完整性
- 确认
functions.py存在于项目根目录,且未被排除在打包外(你的source.include_exts已包含py文件,只需确保文件存在)。 - 检查
screens/目录下的所有kv文件路径正确,无缺失。 - 确保
buildozer.spec中已添加plyer依赖(你用到了filechooser功能)。
总结排查流程
- 先通过adb logcat获取具体崩溃错误信息。
- 升级Kivy/KivyMD版本到兼容范围。
- 统一权限配置与请求时机。
- 补全缺失的屏幕类定义。
- 移除Android环境下的强制窗口尺寸设置。
内容的提问来源于stack exchange,提问作者Fakhri
相关产品推荐
相关产品推荐

