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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:15:42