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

Kivy应用在Android 13启动后崩溃(Google Colab构建)

问题:KivyMD应用在Android 13启动崩溃,PC端运行正常

报错信息

Traceback (most recent call last):
 File "kivy/properties.pyx", line 961, in kivy.properties.ObservableDict.__getattr__
KeyError: '_left_container'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/content/.buildozer/android/app/main.py", line 98, in <module>
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/app.py", line 955, in run
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/app.py", line 925, in _run_prepare
  File "/content/.buildozer/android/app/main.py", line 75, in build
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 407, in load_string
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 662, in _apply_rule
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 662, in _apply_rule
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 660, in _apply_rule
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/uix/widget.py", line 470, in apply_class_lang_rules
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 540, in apply
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 659, in _apply_rule
  File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivymd/uix/list/list.py", line 1206, in add_widget
  File "kivy/properties.pyx", line 964, in kivy.properties.ObservableDict.__getattr__
AttributeError: 'super' object has no attribute '__getattr__'. Did you mean: '__setattr__'?
Python for android ended.

相关代码

main.py

import requests
import json
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.toast import toast

KV = """
<CB@TwoLineAvatarIconListItem>:
    IconLeftWidget:
        id: i1
        icon: "pencil"
    IconRightWidget:
        icon: "pencil" #this is a transparent png image of 188 bytes
        MDCheckbox:
            id: x54
            on_active:
                app.save_checked(*args,root.text,root.secondary_text,root.ids.i1.icon,root)

BoxLayout:
    size_hint:[.8, .9]
    ScrollView:
        MDList:
            id: scroll
            CB:
                text: "box"
                secondary_text: "1"
                icon: "pencil"
            CB:
                text: "garbage"
                secondary_text: "2"
                icon: "pencil"
            CB:
                text: "car"
                secondary_text: "3"
                icon: "pencil"

    MDRaisedButton:
        id: cm
        text: "Save"
        on_release: app.send()
"""


class MainApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.data = []

    def build(self):
        return Builder.load_string(KV)

    def save_checked(self, checkbox, value, a, b, c, w):
        # a - text
        # b - secondary_text
        # value - state(True/False) on and off
        # c - icon
        # checkbox and w idk, just kivy args
        if value:
            print(checkbox, value, a, b, c, w)
            self.data.append(b)
        else:
            self.data.remove(b)

    def send(self):
        #send data with requests
        pass


MainApp().run()

buildozer.spec

requirements = python3,kivy==2.2.0,kivymd,urllib3, requests, chardet, certifi, idna,
osx.python_version = 3
osx.kivy_version = 1.9.1
android.permissions = android.permission.INTERNET
android.api = 33
android.minapi = 21

解决方案

1. 统一Kivy与KivyMD版本,解决兼容性问题

PC端使用Kivy 2.1.0,安卓构建时指定2.2.0,版本差异导致控件结构不兼容。修改buildozer.spec的依赖配置,统一版本并确保KivyMD与Kivy兼容:

requirements = python3,kivy==2.1.0,kivymd==1.1.1,requests
android.permissions = android.permission.INTERNET
android.api = 33
android.minapi = 21

(移除多余的依赖项,requests会自动拉取所需的依赖库)

2. 修正Kv语言中列表项的控件结构

TwoLineAvatarIconListItem内置了左右容器,直接添加IconLeftWidget/IconRightWidget作为子部件会触发容器查找错误。改为通过left_widget和right_widget属性指定部件,同时移除不必要的IconRightWidget嵌套:

<CB@TwoLineAvatarIconListItem>:
    left_widget: IconLeftWidget(icon=root.icon)
    right_widget: MDCheckbox(
        id: x54
        on_active: app.save_checked(*args, root.text, root.secondary_text, root.icon, root)
    )

BoxLayout:
    size_hint: .8, .9
    ScrollView:
        MDList:
            id: scroll
            CB:
                text: "box"
                secondary_text: "1"
                icon: "pencil"
            CB:
                text: "garbage"
                secondary_text: "2"
                icon: "pencil"
            CB:
                text: "car"
                secondary_text: "3"
                icon: "pencil"

    MDRaisedButton:
        id: cm
        text: "Save"
        on_release: app.send()

3. 修复数据操作的潜在异常

原代码中self.data.remove(b)会在元素不存在时抛出错误,添加存在性判断:

def save_checked(self, checkbox, value, a, b, c, w):
    if value:
        if b not in self.data:
            self.data.append(b)
    else:
        if b in self.data:
            self.data.remove(b)

4. 重新构建APK

在Google Colab中重新执行Buildozer构建命令,确保依赖安装正确后生成新的APK安装包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:45:08