如何将urllib代码转换为Kivy UrlRequest?APK生成遇异常
解决方案:替换urllib为Kivy UrlRequest并优化APK运行效果
一、将urllib同步请求改为UrlRequest异步请求
Kivy的UrlRequest是异步网络请求工具,不会阻塞UI线程,更适配移动端场景。以下是修改后的完整代码:
from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import Screen, ScreenManager from kivy.network.urlrequest import UrlRequest # 导入UrlRequest import json gui = ''' WindowManager: MainMenu: <MainMenu>: BoxLayout: orientation: 'vertical' Label: id: sample text: 'Sample' Button: text: 'Run' on_release: root.run() Button: text: 'Exit' on_release: app.stop() ''' class MyApp(App): def build(self): return Builder.load_string(gui) class WindowManager(ScreenManager): pass class MainMenu(Screen): def run(self): headers = { 'X-Cosmos-Token': 'XXX', 'Content-Type': 'application/json', 'User-Agent': 'Cosmos-API-Request' } base_url = 'https://api.cosmos.bluesoft.com.br/gtins/7896051020158.json' # 发起异步请求,指定成功/失败回调 UrlRequest( url=base_url, on_success=self.on_request_success, on_error=self.on_request_error, req_headers=headers, method='GET' ) def on_request_success(self, req, result): # 处理返回结果 try: # 自动解析JSON,若返回字符串则手动解析 data_content = json.loads(result) if isinstance(result, str) else result self.ids.sample.text = data_content['description'] except KeyError: self.ids.sample.text = '未找到description字段' except Exception as e: self.ids.sample.text = f'解析失败: {str(e)}' def on_request_error(self, req, error): # 处理请求错误 self.ids.sample.text = f'请求失败: {str(error)}' if __name__ == '__main__': MyApp().run()
关键修改点:
- 导入
kivy.network.urlrequest.UrlRequest - 移除所有
urllib相关导入 - 将同步的
urlopen改为异步UrlRequest,通过on_success和on_error回调处理结果 - 增加异常捕获,避免因API返回格式变化导致崩溃
二、APK运行效果优化方案
1. 配置网络权限
在buildozer.spec中添加网络权限,否则APK无法发起HTTPS请求:
android.permissions = INTERNET
2. 解决HTTPS证书问题
若遇到证书验证失败,可在buildozer.spec中添加系统证书:
android.add_assets = /etc/ssl/certs/ca-certificates.crt
或者在UrlRequest中临时关闭验证(仅调试用,不建议生产环境):
UrlRequest(..., verify=False)
3. 优化Buildozer配置
- 使用最新SDK/NDK版本,提升兼容性:
android.api = 33 android.ndk = 25b - 开启AAPT2优化资源打包:
android.use_aapt2 = True - 减小APK体积(可选):
android.enable_androidx = True android.arch = arm64-v8a # 仅打包64位架构,适配现代设备
4. 调试APK错误
通过ADB查看Python日志,定位具体问题:
adb logcat | grep python
内容的提问来源于stack exchange,提问作者Athos
相关产品推荐
相关产品推荐

