【问题标题】:Kivy App crashes on Android KitKat ( Kivy Launcher)Kivy App 在 Android KitKat 上崩溃(Kivy Launcher)
【发布时间】:2020-03-30 23:02:53
【问题描述】:

我的其他应用程序在Kivy Launcher 上运行良好,但这个应用程序在加载屏幕上崩溃(有时我什至看不到崩溃前的文本加载)。由于崩溃发生在加载过程中,Kivy Launcher 不会在MyApp/.kivy/logs 中创建日志。所以我没有任何日志。

我的手机是带有 Kitkat 的三星 S3。

我将文件夹Python36\Lib\site-packages\kivy\uix\recycleview(可能是罪魁祸首)复制到我手机上的应用程序文件夹中,但我的应用程序仍然崩溃。 这是应用程序(非常感谢El3phanten):

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.uix.recycleview.views import RecycleDataViewBehavior

items = [
    {"text": "white",    "selected": 'normal', "input_data": ["some","random","data"]},
    {"text": "lightblue","selected": 'normal', "input_data": [1,6,3]}
]

class MyViewClass(RecycleDataViewBehavior, BoxLayout):

    text = StringProperty("")
    index = None

    def set_state(self,state,app):
        app.root.ids.rv.data[self.index]['selected'] = state

    def refresh_view_attrs(self, rv, index, data):
        self.index = index
        return super(MyViewClass, self).refresh_view_attrs(rv, index, data)

class MyRecycleView(RecycleView):

    data = items

    def print_data(self,data):
        print([item['input_data'] for item in data if item['selected'] == 'down'])

KV = '''

<MyViewClass>:
    orientation: 'horizontal'
    CheckBox:
        on_state: root.set_state(self.state,app)
    Label:
        text: root.text

BoxLayout:
    orientation: 'vertical'
    MyRecycleView:
        id: rv
        viewclass: 'MyViewClass'
        RecycleBoxLayout:
            orientation: 'vertical'
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
    Button:
        size_hint_y: 0.1
        text: "Print data"
        on_release: rv.print_data(rv.data)

'''

class Test(App):
    def build(self):
        root = Builder.load_string(KV)
        return root


Test().run()

编辑: 我现在正在获取日志。我尝试了@KeyWeeUsr 解决方案,但仍未找到该模块。

我的 app 文件夹现在的结构是这样的:

my_app/:
   -main.py
   -android.txt
   -kivy/
      -uix/
         -recycleview/
            -__init__.py
            -datamodel.py
            -layout.py
            -views.py

这是日志:

[INFO              ] Logger: Record log in /storage/emulated/0/kivy/del/.kivy/logs/kivy_17-04-27_2.txt
[INFO              ] Kivy: v1.9.1
[INFO              ] Python: v2.7.2 (default, Mar 20 2016, 23:30:13) 
[GCC 4.8]
[INFO              ] Factory: 179 symbols loaded
[WARNING           ] stderr: /data/data/org.kivy.pygame/files/lib/python2.7/site-packages/kivy/core/image/img_pygame.py:13: RuntimeWarning: import cdrom: No module named cdrom
[WARNING           ] stderr: (ImportError: No module named cdrom)
[INFO              ] Image: Providers: img_tex, img_dds, img_gif, img_pygame, img_pil (img_ffpyplayer ignored)
[WARNING           ] stderr: Traceback (most recent call last):
[WARNING           ] stderr:   File "main.py", line 3, in <module>
[WARNING           ] stderr:     from kivy.uix.recycleview import RecycleView
[WARNING           ] stderr: ImportError: No module named recycleview

【问题讨论】:

    标签: android android-recyclerview kivy


    【解决方案1】:

    我有一个使用 RecyclerView 的应用程序,我在 Android 上运行它没有问题(通过构建一个包,而不是复制文件夹,我使用 Kivy 1.9.2dev0)

    为了了解真正导致崩溃的原因,您需要在应用运行时阅读日志。

    1. 插入您的手机并确保它通过adb devices 列出
    2. 通过adb -d install -r abc.apk安装应用程序
    3. 查看日志,msg for filter是你的包名org.test.myapp之类的东西
      • Mac 或 Linux:adb logcat | grep “msg for filter”
      • 窗口:adb logcat | FINDSTR “msg for filter"
    4. 你会得到真正的日志

    【讨论】:

    • 我想避免打包应用程序(它仍处于测试阶段,我发现能够直接在手机上编辑文件很方便)。请查看我的问题底部的日志。
    • 我刚刚使用 buildozer 打包了应用程序,但我仍然收到相同的错误“ImportError: No module named recycleview”。不确定这是否是原因,但您使用 python 3.6 吗?
    【解决方案2】:

    在 android 上运行的 Kivy 应用程序(甚至是启动器)应该使用 adb logcat 进行调试,因为应用程序的真实输出因此即使所有崩溃、库加载失败等等都存在于 logcat 中。

    .kivy 文件中可用的日志是纯 Kivy 日志,不包含任何有关 APK 是如何启动、窗口是如何被拆除或加载是否有问题的信息,例如Python 解释器本身。 → 没有 logcat,没有明确的解决方案。

    无论如何,有一种方法可以制作自定义 Kivy 启动器:

    但是需要应用第二个更改,因为它需要启动器。

    但是,您可以尝试将文件夹正确放置在您的应用文件夹中,即:

    my_app
    |
    |- main.py
    |
    |- kivy/uix/recycleview (multiple folders, not ONE)
    

    或在此处粘贴日志。

    【讨论】:

    • 谢谢你,我必须告诉你,我对 python 和 Kivy 很陌生,我在链接上读到的大部分内容对我来说都是中文的。我将有一个更接近并尝试了解如何制作自定义 kivy 启动器。我尝试了您的解决方案(将文件夹 kivy/uix/recycleview 放在我的应用程序文件夹中,而不是像我所做的那样直接放置在 recycleview 文件夹中,但是应用程序仍然崩溃并显示“没有名为 recycleview 的模块”。
    【解决方案3】:

    对于日志,我使用应用程序LogCat(它需要root访问权限)

    我无法让 Kivy Launcher 工作,因为该版本仍在 1.9.1 中

    我最终不得不使用 Buildozer 来打包应用程序(我必须使用 ubuntu 17.04 创建一个 dual boot,然后安装 python 3.6、kivybuildozer

    我不得不像这样修改 buildozer.spec 文件:

    # comma seperated e.g. requirements = sqlite3,kivy
    requirements = kivy==master
    

    不要修改这一行(即使它很诱人!):

    # Kivy version to use
    osx.kivy_version = 1.9.1
    

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 2016-07-28
      • 1970-01-01
      • 2021-08-02
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2017-02-14
      相关资源
      最近更新 更多