Kivy代码PC运行正常,Buildozer打包的APK安卓端崩溃如何解决
问题排查与解决方案
修复Android权限配置
你当前spec文件中#android.permissions = INTERNET处于注释状态,安卓系统默认不会给应用授予网络权限,一方面你基于socket开发的异常上报逻辑完全无法发送数据,另一方面如果你的应用在启动阶段就调用了socket相关接口,会直接因为缺少权限触发崩溃,甚至没有执行到你的异常捕获逻辑。将该行的注释符#删除,修改为android.permissions = INTERNET后重新打包。优先使用系统日志排查崩溃
你的异常上报逻辑无法生效大概率是崩溃发生在上报逻辑初始化完成之前,建议直接使用安卓原生日志工具定位问题:将安卓设备开启USB调试后连接电脑,安装打包好的APK,在命令行执行adb logcat -s python:D,随后启动APP即可直接看到完整的Python层报错栈。如果是底层框架崩溃,可以搜索AndroidRuntime: FATAL EXCEPTION关键字获取崩溃信息。检查业务代码的安卓兼容性
同一份spec打包的Hello World可以正常运行,说明你的打包环境没有问题,问题集中在业务代码层面:
- 不要在代码中使用硬编码的PC端路径,所有涉及文件路径的操作,统一使用
os.path模块拼接相对路径,安卓的文件系统结构和Windows完全不同,硬编码路径会直接触发文件找不到异常。 - 不要在主线程(尤其是APP初始化阶段的顶层代码)执行阻塞式socket操作,安卓系统禁止主线程执行耗时网络操作,阻塞超过5秒就会触发ANR闪退,所有网络逻辑都要放到子线程中执行。
- 检查socket相关配置是否用到了安卓不支持的参数,普通TCP/UDP通信是默认支持的,原始套接字、特殊套接字选项需要额外权限或根本不支持。
- 可选的架构适配优化
如果你使用的是安卓10及以上的64位设备,可以将spec文件中的android.arch = armeabi-v7a修改为android.arch = arm64-v8a,目前很多新安卓设备已经逐步取消了对32位应用的兼容,32位安装包可能会出现无征兆闪退问题。
内容的提问来源于stack exchange,提问作者Ayushman Rajora
相关产品推荐
相关产品推荐

