Python代码打包为APK后访问MySQL时应用崩溃,寻求解决方案
Kivy打包APK连接MySQL崩溃(Android12)
问题概述
- 本地笔记本可正常访问MySQL数据库
- 基于Kivy开发的Python代码打包为APK后,在Android12系统的一加手机上点击数据库连接按钮时应用直接崩溃
- 已完成配置:代码中填写电脑IP作为数据库host,为MySQL用户授予全部权限,buildozer.spec中配置了网络权限,关闭了防火墙,但问题仍存在
排查与解决步骤
1. 适配Android12明文流量限制
Android12默认禁止应用使用明文网络请求,而MySQL默认采用明文传输(未配置SSL时),这会导致系统拦截请求引发崩溃。需在buildozer.spec中添加配置:
android.add_manifest_replacement = android:usesCleartextTraffic="true"
重新打包APK后测试。
2. 更换兼容的MySQL驱动
部分MySQL驱动(如mysql-connector-python)在Android环境下存在兼容性问题,建议改用pymysql:
- 在
buildozer.spec的requirements字段添加:requirements = python3,kivy,pymysql - 代码中替换驱动调用:
import pymysql try: conn = pymysql.connect( host='你的电脑IP', user='数据库用户名', password='数据库密码', database='目标数据库名', port=3306 ) # 连接成功后的逻辑 except Exception as e: # 捕获异常并处理 print(str(e))
3. 避免UI线程阻塞
Kivy的UI线程不能执行耗时操作,数据库连接属于耗时任务,直接在按钮点击事件中执行会触发ANR或崩溃。需将连接操作放到子线程中,更新UI时切回主线程:
from kivy.clock import mainthread from threading import Thread def _connect_db(): try: conn = pymysql.connect(...) _update_ui("连接成功") except Exception as e: _update_ui(f"连接失败:{str(e)}") @mainthread def _update_ui(msg): # 这里更新UI组件,比如修改标签文本 pass # 按钮点击事件绑定 def on_connect_click(self): Thread(target=_connect_db).start()
4. 确认网络可达性
- 确保手机和电脑处于同一Wi-Fi网络
- 用手机工具测试电脑IP的3306端口是否可访问(如使用telnet命令:
telnet 你的电脑IP 3306) - 确认MySQL配置文件中
bind-address设置为0.0.0.0(允许所有IP访问),而非仅本地127.0.0.1
5. 分析崩溃日志
查看调试文件中的崩溃堆栈信息,定位具体异常类型:
- 若出现
NetworkOnMainThreadException:对应上述线程阻塞问题 - 若出现
UnknownHostException:对应网络可达性问题 - 若出现
AccessDeniedException:检查MySQL用户权限配置(需确保用户允许从手机IP访问,如GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'password';)
内容的提问来源于stack exchange,提问作者kush patel
相关产品推荐
相关产品推荐

