buildozer构建的KivyMD安卓APK启动崩溃,报BoundedNumericProperty类型转换错误
构建崩溃问题排查指南
核心根因
本次崩溃属于Kivy与KivyMD版本不兼容触发的内部类型校验错误
- buildozer配置中指定
kivy==master拉取的最新Kivy源码,重构了数值类属性的内部存储结构,拆分了NumericPropertyStorage和BoundedNumericPropertyStorage的实现逻辑。 - 你当前打包使用的KivyMD版本(0.104.2.dev0,2021年发布)未适配这一内部改动,在KV规则中给带边界限制的
width属性赋值时,会触发内部存储结构的类型转换失败,直接抛出TypeError。 - 之前应用能正常运行,是因为此前构建时拉取的Kivy master代码尚未包含这部分重构;Ubuntu系统升级后重新拉取源码编译时,刚好获取到了包含存储结构改动的最新提交,旧版本KivyMD无法适配,因此出现即使还原spec配置也无法解决问题的现象。
报错对应关系
直接匹配logcat中的关键信息:
触发报错:
TypeError: Cannot convert kivy.properties.NumericPropertyStorage to kivy.properties.BoundedNumericPropertyStorage
触发位置:KV规则第15行对组件width属性的赋值逻辑,属于KivyMD内置组件的标准实现
修复操作步骤
- 锁定Kivy兼容版本:将requirements中的
kivy==master替换为和当前KivyMD版本匹配的稳定发布版kivy==2.0.0,该版本与2021年发布的0.104.2版本KivyMD完全兼容,不存在内部存储结构的改动。 - 锁定KivyMD版本:将requirements中的
https://github.com/kivymd/KivyMD/archive/master.zip替换为固定版本kivymd==0.104.2,避免拉取动态更新的master分支代码引入未知不兼容改动。 - 清理构建残留:执行
buildozer android clean,删除项目目录下的.buildozer文件夹,避免旧编译缓存中残留不兼容的库文件。 - 重新执行
buildozer android debug deploy run完成构建、部署与运行验证。
冗余依赖清理提醒
当前requirements列表中存在不适配Android环境的冗余依赖,建议移除:
xclip、xsel为Linux桌面端的剪贴板功能依赖,在Android运行环境下无实际作用,还会提升构建失败的概率。- 日常打包构建尽量固定依赖的发布版本号,避免直接使用master分支作为依赖来源,这类分支处于持续迭代状态,随时可能出现不兼容的 breaking change,是打包随机崩溃的高发诱因。
内容的提问来源于stack exchange,提问作者Paolo Laurenti
相关产品推荐
相关产品推荐

