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

求助:使用Buildozer编译含Flask的Kivy应用为APK时闪退

问题:Kivy+Flask打包Android APK后闪退

以下是实现本地Flask服务器的代码:

import sys
import io
 
sys.stdout = io.StringIO()
sys.stderr = io.StringIO()
 
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from threading import Thread
from flask import Flask
 
# Flask server definition
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello, Flask Server!'
 
def run_flask_app():
    app.run(host='0.0.0.0', port=8000, threaded=True)
 
class ServerApp(App):
 
    def build(self):
        self.server_state_label = Label(text="Server is not running")
        self.start_server_button = Button(text="Start Server")
        self.start_server_button.bind(on_press=self.start_server)
 
        layout = BoxLayout(orientation="vertical")
        layout.add_widget(self.server_state_label)
        layout.add_widget(self.start_server_button)
        return layout
 
    def start_server(self, instance):
        try:
            # Start the Flask server in a thread
            server_thread = Thread(target=run_flask_app)
            server_thread.start()
            self.server_state_label.text = "Server is running"
        except Exception as e:
            self.server_state_label.text = "Error starting the server"
 
if __name__ == '__main__':
    ServerApp().run()

代码在Ubuntu、Windows及Android的Pydroid中均可正常运行,但通过Buildozer打包为APK安装后,应用仅显示加载状态随即闪退。已配置requirements = python3,flask,kivy,cython并添加INTERNET权限,纯Kivy应用打包后可正常运行。


解决方法

1. 移除stdout/stderr重定向

Android环境下重定向标准输出/错误流会干扰Kivy的初始化流程,同时阻止系统捕获错误日志,直接删除以下代码:

import sys
import io
 
sys.stdout = io.StringIO()
sys.stderr = io.StringIO()

2. 调整Flask启动参数

Flask的debug模式在Android环境下存在兼容性问题,需关闭debug并将线程设为守护线程:
修改run_flask_app函数:

def run_flask_app():
    # 关闭debug模式,避免Android下的兼容性问题
    app.run(host='0.0.0.0', port=8000, threaded=True, debug=False)

修改start_server中的线程启动代码:

server_thread = Thread(target=run_flask_app, daemon=True)

3. 完善Buildozer配置

在buildozer.spec中补充以下关键配置:

# 指定稳定的Android API级别
android.api = 33
# 指定兼容的NDK版本
android.ndk = 25b
# 添加网络状态权限(可选,辅助排查网络问题)
android.permissions = INTERNET, ACCESS_NETWORK_STATE
# 显式声明Flask的依赖库
requirements = python3,flask,kivy,cython,werkzeug,jinja2

4. 捕获详细错误日志

修改start_server函数,添加详细错误捕获,方便通过日志定位问题:

def start_server(self, instance):
    try:
        server_thread = Thread(target=run_flask_app, daemon=True)
        server_thread.start()
        self.server_state_label.text = "Server is running"
    except Exception as e:
        import traceback
        error_detail = f"Error: {str(e)}\n{traceback.format_exc()}"
        self.server_state_label.text = "Error starting server"
        # 输出到系统日志,通过adb查看
        print(error_detail)

然后通过电脑连接手机,执行adb logcat | grep python命令查看应用运行时的错误日志,精准定位闪退原因。


内容的提问来源于stack exchange,提问作者p_agon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:03:20