如何解决Buildozer打包的Kivy应用在安卓端启动后闪退问题
问题原因和解决方案
核心触发原因
- pywhatkit是面向桌面端开发的第三方库,内部依赖大量桌面端专属的系统API(比如默认浏览器调用、键鼠控制组件等),没有适配安卓运行环境,即便在spec中添加了依赖,运行时调用对应接口也会直接触发崩溃。
- 你将
kit.playonyt()方法直接写在了Kivy的UI主线程回调on_touch_down中,该方法会先发起网络请求查询YouTube资源链接,安卓系统不允许主线程执行耗时操作,哪怕网络请求没超时,后续尝试调用系统打开链接的逻辑也和桌面端完全不兼容,直接触发闪退。
修复步骤
- 先注释掉main.py中所有和pywhatkit相关的导入、调用代码,重新打包测试,确认应用可以正常运行,排除其他配置问题。
- 替换
playonyt功能的实现:安卓端要打开YouTube链接,不要用pywhatkit,改用pyjnius调用安卓原生Intent实现,修改示例如下:
from kivy.app import App from kivy.uix.widget import Widget from kivy.graphics import Color, Ellipse, Line # 导入pyjnius相关组件 from jnius import autoclass Intent = autoclass('android.content.Intent') Uri = autoclass('android.net.Uri') PythonActivity = autoclass('org.kivy.android.PythonActivity') def playonyt_android(keyword): # 构造打开YouTube搜索结果的Intent intent = Intent(Intent.ACTION_VIEW, Uri.parse(f"https://www.youtube.com/results?search_query={keyword}")) PythonActivity.mActivity.startActivity(intent) class MyPaintWidget(Widget): def on_touch_down(self, touch): with self.canvas: Color(1, 1, 0) d = 30. Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d)) touch.ud['line'] = Line(points=(touch.x, touch.y)) # 替换为适配安卓的调用 playonyt_android("O Re Piya") def on_touch_move(self, touch): touch.ud['line'].points += [touch.x, touch.y] class MyPaintApp(App): def build(self): return MyPaintWidget() if __name__ == '__main__': MyPaintApp().run()
- 修改Buildozer.spec的requirements配置,添加pyjnius依赖:
requirements = python3,kivy,pyjnius,requests,Pillow,urllib3
- 如果你需要排查其他第三方库的兼容性问题,可以通过adb查看运行日志:开启手机USB调试后连接电脑,执行
adb logcat -s python:D即可看到应用运行时的Python报错信息,精准定位崩溃点。 - 注意:不是所有PyPI上的Python库都可以直接打包到安卓应用中,仅纯Python实现、无桌面端系统API依赖的库可以直接引入;带有C扩展的库需要python-for-android存在对应的编译配方才能正常打包使用。
内容的提问来源于stack exchange,提问作者Zk code
相关产品推荐
相关产品推荐

