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
相关产品推荐
相关产品推荐

