Android 14/15下Kivy+Buildozer打包应用崩溃:SDLActivity中触发pthread_mutex_lock已销毁互斥量错误
我之前在适配Android 14/15的Kivy应用时也碰到过几乎一模一样的原生层崩溃问题,这种没有Python回溯的SDL线程崩溃确实头疼。结合你的环境配置和尝试过的操作,给你几个针对性的修复方向:
1. 调整SDL2版本,避开兼容性坑
你当前指定的sdl2==2.28.5在Android 14+的HWUI线程调度模型下,存在互斥量释放后被重复调用的已知兼容性问题。建议你尝试两个版本:
- 降级到SDL2==2.26.5:这个版本在新旧Android系统上的稳定性都经过验证
- 升级到SDL2==2.30.5:官方修复了不少Android平台的线程安全问题
修改buildozer.spec的requirements行:
requirements = python3==3.9.9,kivy==2.3.0,cython==0.29.33,ffpyplayer,jnius,sdl2==2.30.5,sdl2_ttf,sdl2_image,sdl2_mixer
改完后一定要执行buildozer android clean && buildozer android debug做完全干净的重建。
2. 更新NDK版本适配Android 14/15
你用的NDK r25c发布于2022年,对Android 14(API 34)和15(API 35)的线程安全机制支持不够完善。建议升级到NDK r27b(官方推荐适配API 35的版本),修改buildozer.spec:
android.ndk = 27b android.ndk_api = 23
你用的是最新版python-for-android,完全兼容r27b版本。
3. 强制禁用HWUI硬件加速
Android 14+的HWUI渲染线程和SDL2的线程模型存在资源竞争冲突,你可以强制让SDL使用自身的渲染线程,绕过系统HWUI:
- 方法一:在
buildozer.spec中添加Manifest配置:android.extra_manifest_application_arguments = android:hardwareAccelerated="false" - 方法二:在
main.py的最开头添加环境变量设置(必须在Kivy导入前执行):import os os.environ["SDL_ANDROID_USE_HWUI"] = "0" os.environ["SDL_VIDEO_DRIVER"] = "android" # 之后再导入Kivy相关模块 from kivy.config import Config # ... 你的其他配置代码
4. 排查第三方库的资源冲突
你当前的依赖里包含ffpyplayer和jnius,这两个库可能会抢占SDL2的线程资源导致崩溃。建议先做最小依赖测试:临时从requirements中移除ffpyplayer和jnius,只保留核心依赖:
requirements = python3==3.9.9,kivy==2.3.0,cython==0.29.33,sdl2==2.30.5,sdl2_ttf,sdl2_image,sdl2_mixer
如果重建后应用能正常启动,再逐个加回库排查,找到冲突的根源。
如果以上方法都没能解决问题,建议你创建一个只有空白Kivy窗口的最小可复现项目,测试是否是Kivy核心在Android 14/15上的兼容性问题。同时也可以去Kivy或python-for-android的GitHub Issues页面看看,是否有其他用户提交了类似问题,或者提交新Issue带上你的完整崩溃日志和配置信息。
内容来源于stack exchange




