Kivy应用在Android设备启动触发SIGSEGV错误求助
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x40 in tid 10919 (SDLThread), pid 10882 (org.test.myapp)
当前logcat最后一行显示上述崩溃,即使回退到之前确认能正常运行的初始版本,在自己的设备上依然报错,但在朋友的Android 10设备上运行正常。怀疑是32位与64位本地库兼容问题,以下是Buildozer配置片段:
requirements = android,python3,kivy,kivymd,certifi,pillow,camera4kivy,gestures4kivy,numpy,keras,opencv-python,requests,urllib3,chardet,idna,beautifulsoup4
# change the major version of python used by the app osx.python_version = 3 # Kivy version to use osx.kivy_version = 1.9.1
# (list) Permissions android.permissions = INTERNET,CAMERA,RECORD_AUDIO,WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE # (list) features (adds uses-feature -tags to manifest) #android.features = android.hardware.usb.host # (int) Target Android API, should be as high as possible. android.api = 31
# (list) The Android archs to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64 # In past, was `android.arch` as we weren't supporting builds for multiple archs at the same time. android.archs = arm64-v8a, armeabi-v7a p4a.hook = camerax_provider/gradle_options.py
已回退到最基础版本、重置Kivy代码和Buildozer配置,但错误依旧,询问是否是自己手机的问题。
可能的原因与解决方案
多架构编译导致的库冲突
你当前配置android.archs = arm64-v8a, armeabi-v7a,同时编译两种架构的包。像opencv-python、numpy这类带本地扩展的库,很可能存在32位与64位版本不兼容的情况,或者你的设备对混合架构的支持有问题。试试只编译单一架构:android.archs = arm64-v8a如果你的设备是旧款32位机型,就改为
armeabi-v7a,重新打包测试。老旧依赖库不兼容高版本Android
朋友的设备是Android 10,而你的目标API是31(对应Android 12),推测你的设备系统版本更高。高版本Android对权限、系统API的限制更严格,而你配置的osx.kivy_version=1.9.1是非常老旧的版本,根本不支持Android 12+。
建议把Kivy版本更新到支持高版本Android的稳定版(比如2.2.1),同时确保kivymd、camera4kivy等依赖也用兼容的新版本。构建缓存残留引发冲突
就算回退了代码,Buildozer/Python-for-Android的本地缓存可能还残留旧的编译产物,导致冲突。执行以下操作清理:- 删除项目根目录下的
.buildozer文件夹 - 删除
bin目录下的旧APK - 重新执行
buildozer android debug deploy run
- 删除项目根目录下的
设备本身的小概率问题
排除上述因素后,如果还是崩溃,可能是你的设备存在特定硬件或系统bug。可以试试:- 重启设备,清除应用缓存和数据后重装
- 在其他同版本Android的设备上测试,确认是不是你的设备独有问题
总结:大概率不是手机本身的问题,更可能是多架构编译冲突、老旧依赖库不兼容,或者构建缓存残留导致的。优先尝试单一架构编译、更新依赖版本、清理构建缓存这几个方案。
内容的提问来源于stack exchange,提问作者Vanilla Ice

