You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:10:40