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

Kivy开发的Android应用崩溃无法启动及数据拉取问题排查求助

Kivy开发的Android应用崩溃无法启动及数据拉取问题排查求助

各位大佬好!我用Kivy开发了一款用于拉取股票基本面数据的Android应用,编译打包完成后无论怎么尝试都无法正常启动。折腾了好多种方法,结果错误一个接一个,到现在还是毫无进展。

我把应用的核心代码main.py贴在下面,同时也准备了应用崩溃的日志以及buildozer.spec配置文件(需要的话可以补充完整内容),麻烦大家帮我排查下问题出在哪里,应该怎么修改才能让应用正常启动并运行?

我目前已经尝试过的操作:

  • 配置了Kivy的GL后端为angle_sdl2来适配Android环境
  • 调整了网络请求的超时时间和请求头
  • 减少了拉取的公司数据量以适配移动端性能

main.py 代码

import requests
from bs4 import BeautifulSoup
from kivy.app import App
from kivy.clock import Clock, mainthread
from kivy.core.window import Window
from kivy.metrics import dp
from kivy.properties import NumericProperty, StringProperty, BooleanProperty, ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from kivy.uix.progressbar import ProgressBar
from kivy.uix.scrollview import ScrollView
import logging
import os
from functools import partial

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

os.environ['KIVY_GL_BACKEND'] = 'angle_sdl2'

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"
}

class DataLoader:
    def __init__(self):
        self.companies = []
        self.additional_info = []

    def fetch_all_data(self, app):
        try:
            url = "https://smart-lab.ru/q/shares_fundamental/order_by_market_cap/desc/"
            logger.info("Начало загрузки данных с сайта")
            response = requests.get(url, headers=headers, timeout=30)
            if response.status_code != 200:
                app.show_error(f"Ошибка HTTP: {response.status_code}")
                return
            soup = BeautifulSoup(response.text, "html.parser")
            data = soup.find_all("tr")[1:21] # Уменьшил количество компаний для мобильных
            for i, row in enumerate(data):
                self.process_company(row, i, app, len(data))
            logger.info("Данные успешно загружены")
            Clock.schedule_once(partial(app.update_ui, self.companies, self.additional_info))
        except Exception as e:
            logger.error(f"Ошибка при загрузке данных: {str(e)}")
            app.show_error(f"Ошибка сети: {str(e)}")

    def process_company(self, row, index, app, total_companies):
        try:
            name = row.find("a").text
            share_url = "https://smart-lab.ru" + row.find_all("td")[1].find("a").get("href")
            share_cost = self.get_share_price(share_url)
            cap_tion = row.find_all("td")[5].text
            company_data = {
                "num": index + 1,
                "name": name,
                "capitalization": cap_tion,
                "share_price": share_cost
            }
            additional = self.get_additional_info(row, share_cost)
            Clock.schedule_once(partial(app.add_company, company_data, additional))
            progress = (index + 1) / total_companies * 100
            app.update_progress(progress)
            app.update_status(f"Обработано {index + 1}/{total_companies}: {name[:20]}...")
        except Exception as e:
            logger.error(f"Ошибка обработки компании: {str(e)}")
            company_data = {
                "num": index + 1,
                "name": name,
                "capitalization": "N/A",
                "share_price": "N/A"
            }
            Clock.schedule_once(partial(app.add_company, company_data, {}))

    def get_share_price(self, url):
        try:
            response = requests.get(url, headers=headers, timeout=30)
            if response.status_code != 200:
                return "N/A"
            sp = BeautifulSoup(response.text, "html.parser")
            price = sp.find("div", class_="nocenter page-title").find("div", class_="temp_micex_info").find("span", class_="last")
            return price.text + "₽" if price else "N/A"
        except Exception as e:
            logger.error(f"Ошибка получения цены акции: {str(e)}")
            return "N/A"

    def get_additional_info(self, row, share_price):
        try:
            company_cost = row.find_all("td")[6].text
            net_profit = row.find_all("td")[8].text
            revenue = row.find_all("td")[7].text
            cost = share_price[:-1] if share_price != "N/A" else "0"
            dived = row.find_all("td")[9].text
            if share_price == "N/A":
                colvo = "N/A"
                div_per_share = "N/A"
            else:
                try:
                    div_per_share = dived + " == " + str(round(float(dived[:-1]) * 0.01 * float(cost), 2)) + "₽"
                    if " " in company_cost:
                        cap_tion = company_cost.replace(" ", "")
                        colvo = (float(cap_tion) * 1000000000 / float(cost)) / 1000000
                    else:
                        colvo = float(company_cost) * 1000000000 / float(cost) / 1000000
                except:
                    colvo = "N/A"
                    div_per_share = "N/A"
            return {
                "Капитализация в млрд руб": row.find_all("td")[5].text,
                "Стоимость компании": company_cost,
                "Чистая прибыль в млрд руб": net_profit,
                "Выручка в млрд руб": revenue,
                "Дивиденды на акцию": div_per_share,
                "P/E": row.find_all("td")[12].text,
                "P/S": row.find_all("td")[13].text,
                "P/B, раз": row.find_all("td")[14].text
            }
        except Exception as e:
            logger.error(f"Ошибка получения дополнительной информации: {str(e)}")
            return {}

另外,buildozer.spec文件我也准备好了,里面已经配置了requirements = python3,kivy,requests,beautifulsoup4等依赖,以及Android的INTERNET权限,需要查看具体配置的话可以随时贴出来;应用崩溃的日志内容我也有,需要的话也可以提供。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:09:52