Python3环境下Kivy Buildozer Android端UrlRequest请求失败排查
问题排查与解决方案
1. 确认AndroidManifest权限配置
Buildozer需要在buildozer.spec中声明INTERNET权限,仅添加运行时请求不足以让应用访问网络。在spec文件中找到android.permissions项,确保配置如下:
android.permissions = INTERNET
修改后执行buildozer android clean && buildozer android debug deploy run重新构建生效。
2. 定位DNS解析问题
方法一:用IP替代域名测试
将请求中的域名替换为目标服务器的公网IP(比如用https://8.8.8.8测试Google DNS),如果请求成功,说明是设备DNS解析故障。此时可:
- 检查设备Wi-Fi/移动网络的DNS设置,切换为公共DNS(如8.8.8.8或1.1.1.1)
- 在应用中通过第三方库(如
dnspython,需添加到Buildozer依赖)手动指定DNS服务器
方法二:通过日志验证DNS行为
使用adb logcat过滤DNS相关日志,确认设备是否能正常解析目标域名:
adb logcat | grep -i dns
如果没有对应域名的解析记录,说明设备网络环境存在DNS劫持或配置错误。
3. 修正Kivy UI更新逻辑
网络请求在后台线程执行,不能直接操作UI控件,必须通过Clock.schedule_once切换到主线程更新:
from kivy.clock import Clock def on_request_success(req, result): Clock.schedule_once(lambda dt: self.label.text = "请求成功") def on_request_failure(req, error): Clock.schedule_once(lambda dt: self.label.text = f"错误: {error}")
4. 验证Buildozer依赖配置
如果使用requests库,确保buildozer.spec的requirements包含:
requirements = python3,kivy,requests
同时确认构建环境已安装libssl-dev,避免HTTPS证书验证环节出现间接错误。
5. 检查设备网络环境
- 确认设备已连接有效网络(Wi-Fi/移动数据),且能正常访问其他外部网站
- 若处于企业/校园网络,可能存在防火墙或代理拦截,切换到个人网络测试
最简测试代码
用以下代码排除其他UI逻辑干扰,验证网络请求基础功能:
from kivy.app import App from kivy.uix.label import Label from kivy.network.urlrequest import UrlRequest from kivy.clock import Clock class TestApp(App): def build(self): self.label = Label(text="测试中...") UrlRequest( "https://www.google.com", on_success=self.on_success, on_failure=self.on_failure ) return self.label def on_success(self, req, result): Clock.schedule_once(lambda dt: setattr(self.label, "text", "请求成功!")) def on_failure(self, req, error): Clock.schedule_once(lambda dt: setattr(self.label, "text", f"错误: {error}")) if __name__ == "__main__": TestApp().run()
内容的提问来源于stack exchange,提问作者Inaimathi
相关产品推荐
相关产品推荐

