You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 14/15下Kivy+Buildozer打包应用崩溃:SDLActivity中触发pthread_mutex_lock已销毁互斥量错误

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.specrequirements行:

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. 排查第三方库的资源冲突

你当前的依赖里包含ffpyplayerjnius,这两个库可能会抢占SDL2的线程资源导致崩溃。建议先做最小依赖测试:临时从requirements中移除ffpyplayerjnius,只保留核心依赖:

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

火山引擎 最新活动