Kivy Launcher сразу падает, фильтрация logcat? - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь получить приложение, которое я сделал, для запуска на моем телефоне Android. Приложение отлично работает на моем MacBook. Я использовал только модули, предустановленные с python или kivy, но приложение вылетает сразу после того, как на загрузчике kivy появляется значок загрузки. Поэтому я немного покопался и обнаружил, что могу проверить журналы, разблокировав опции разработчика на моем телефоне и используя logcat, но проблема в том, что logcat просто выплевывает много информации, чтобы я мог ее проанализировать.

Есть ли способ отфильтровать logcat, чтобы поднять журналы специально для kivy launcher? Я проверил все, и все говорят, что вы можете отфильтровать его по имени приложения, но я пробовал несколько вариантов

adb logcat "application_or_tag_name: " ": S"

напр .: adb logcat "Kivy_Launcher: " ": S" adb logcat "kivy_launcher: " ": S" adb logcat "Kivy Launcher: " ": S"

но ни один из них, похоже, не работает. Я прочитал эти ссылки:

https://logmatic.io/blog/a-how-to-guide-to-debugging-with-android-logcat/ https://developer.android.com/studio/command-line/logcat

Мне удалось получить некоторые из журналов через Android Studio, но я не уверен, предназначены ли эти журналы для «нового приложения», которое мне пришлось создать для запуска программы, или они действительно являются журналами с моего телефона, когда Я запускаю Kivy Launcher. Вот они:

2019-03-12 01:49:32.213 4870-5048/? E/InputDispatcher: channel '8e355db org.kivy.pygame/org.renpy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-03-12 01:55:17.347 32697-32697/? E/org.kivy.pygam: Not starting debugger since process cannot load the jdwp agent.
2019-03-12 01:55:17.549 32697-32697/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 01:55:18.968 4326-5050/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.ProjectChooser[32697]#0] disconnect: not connected (req=1)
2019-03-12 01:55:18.982 32733-32733/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 01:55:19.833 4326-6594/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.PythonActivity[32733]#0] disconnect: not connected (req=1)
2019-03-12 01:55:20.873 4870-5048/? E/InputDispatcher: channel 'fda44c2 org.kivy.pygame/org.renpy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-03-12 01:59:52.134 1975-1975/? E/org.kivy.pygam: Not starting debugger since process cannot load the jdwp agent.
2019-03-12 01:59:52.325 1975-1975/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 01:59:53.379 2044-2044/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 01:59:53.421 4326-4361/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.ProjectChooser[1975]#0] disconnect: not connected (req=1)
2019-03-12 01:59:54.225 4326-7194/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.PythonActivity[2044]#0] disconnect: not connected (req=1)
2019-03-12 01:59:55.373 4870-5048/? E/InputDispatcher: channel '58b4637 org.kivy.pygame/org.renpy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-03-12 02:08:30.817 13936-4463/? E/MTPJNIInterface: scanFile - /storage/emulated/0/kivy/MyApp/StudentProgress3.py
2019-03-12 02:08:41.348 13936-4704/? E/MTPJNIInterface: scanFile - /storage/emulated/0/kivy/MyApp/main.py
2019-03-12 02:08:48.766 13936-4708/? E/MTPJNIInterface: scanFile - /storage/emulated/0/kivy/MyApp/StudentProgress3.py
2019-03-12 02:08:48.779 13936-4708/? E/MTPJNIInterface: scanFile - /storage/emulated/0/kivy/MyApp/main.py
2019-03-12 02:08:53.422 4813-4813/? E/org.kivy.pygam: Not starting debugger since process cannot load the jdwp agent.
2019-03-12 02:08:53.569 4813-4813/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 02:08:53.873 4870-4983/? E/WindowManager: win=Window{9306df u0 Splash Screen org.kivy.pygame EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true win.mViewVisibility=0 caller=com.android.server.wm.AppWindowToken.destroySurfaces:831 com.android.server.wm.AppWindowToken.destroySurfaces:812 com.android.server.wm.WindowState.onExitAnimationDone:5221 com.android.server.wm.WindowStateAnimator.onAnimationFinished:315 com.android.server.wm.WindowState.onAnimationFinished:5633 com.android.server.wm.-$$Lambda$yVRF8YoeNdTa8GR1wDStVsHu8xM.run:2 com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0:92 
2019-03-12 02:08:54.926 4326-4361/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.ProjectChooser[4813]#0] disconnect: not connected (req=1)
2019-03-12 02:08:55.012 4849-4849/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 02:08:55.864 4326-5050/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.PythonActivity[4849]#0] disconnect: not connected (req=1)
2019-03-12 02:08:56.613 4870-5048/? E/InputDispatcher: channel '5d9bd33 org.kivy.pygame/org.renpy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-03-12 02:20:58.509 7575-7575/? E/org.kivy.pygam: Not starting debugger since process cannot load the jdwp agent.
2019-03-12 02:20:58.742 7575-7575/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 02:20:59.101 4870-4983/? E/WindowManager: win=Window{40e033e u0 Splash Screen org.kivy.pygame EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true win.mViewVisibility=0 caller=com.android.server.wm.AppWindowToken.destroySurfaces:831 com.android.server.wm.AppWindowToken.destroySurfaces:812 com.android.server.wm.WindowState.onExitAnimationDone:5221 com.android.server.wm.WindowStateAnimator.onAnimationFinished:315 com.android.server.wm.WindowState.onAnimationFinished:5633 com.android.server.wm.-$$Lambda$yVRF8YoeNdTa8GR1wDStVsHu8xM.run:2 com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0:92 
2019-03-12 02:21:01.207 4326-4361/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.ProjectChooser[7575]#0] disconnect: not connected (req=1)
2019-03-12 02:21:01.316 7619-7619/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/kivy/MyApp/icon.png (No such file or directory)
2019-03-12 02:21:02.264 4326-5050/? E/BufferQueueProducer: [org.kivy.pygame/org.renpy.android.PythonActivity[7619]#0] disconnect: not connected (req=1)
2019-03-12 02:21:03.009 4870-5048/? E/InputDispatcher: channel 'ce735e org.kivy.pygame/org.renpy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

Если бы кто-нибудь мог мне помочь, я был бы благодарен. Мой код ниже:

from kivy.app import App
from kivy.app import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
#from kivy.uix.boxlayout import BoxLayout
#from kivy.uix.slider import Slider
import csv
import pickle

#empty_dict = {}                              # use this code if the pickle file is corrupt and needs to be reset.
#pickle_out = open("dict.pickle", "wb")
#pickle.dump(empty_dict, pickle_out)
#pickle_out.close()

class MainWindow(Screen):
    """This class will serve as the front page of the application.
    This input will be stored in a dictionary and later converted
    to a data structure using pandas and openpyxl."""

    # These variables link the python logic to the my2.kv kivy language file.
    first_name = ObjectProperty(None)
    last_name = ObjectProperty(None)
    level = ObjectProperty(None)

    # This section loads and saves the information stored from the user input.
    pickle_in = open('dict.pickle', 'rb')  # opens and assigns the opened pickle file to variable.
    student_data = pickle.load(pickle_in)  # imports the saved pickle file and assigns it to a variable.
    pickle_in.close()  # closes the pickle file for safety.

    def btn(self):
        #print(MainWindow.student_data)
        #print("First: " + self.first_name.text,
              #"Last: " + self.last_name.text)


        self.L = {self.first_name.text + ' ' + self.last_name.text: []}

        MainWindow.student_data.update(self.L)
        pickle_out = open("dict.pickle", "wb")
        pickle.dump(MainWindow.student_data, pickle_out)
        pickle_out.close()

        self.first_name.text = ''
        self.last_name.text = ''


class Controller(Screen):
    def __init__(self, **kwargs):
        super(Controller, self).__init__(**kwargs)
    def btn2(self):
        #print(self.lbl.text)
        #print(self.lbl2.text)
        #print(self.lbl3.text)
        #print(self.lbl4.text)
        #print(self.first_last.text)
        #print(self.first_last2.text)

        self.data = {self.first_last.text + ' ' + self.first_last2.text: [self.level.text, self.lbl.text, self.lbl2.text, self.lbl3.text, self.lbl4.text]}
        #print(self.data)

        # This section loads and saves the information stored from the user input.
        self.pickle_in = open('dict.pickle', 'rb')  # opens and assigns the opened pickle file to variable.
        self.loaded_data = pickle.load(self.pickle_in)  # imports the saved pickle file and assigns it to a variable.
        self.pickle_in.close()  # closes the pickle file for safety.

        #print(self.loaded_data)

        self.dictionary2 = self.data
        self.dictionary1 = self.loaded_data

        self.dictionary1.update(self.dictionary2)

        #print(self.dictionary1)

        pickle_out = open("dict.pickle", "wb")
        pickle.dump(self.dictionary1, pickle_out)
        pickle_out.close()

        self.first_last.text = ''
        self.first_last2.text = ''

    def Reading(self, *args):
        self.lbl.text = str(int(args[1]))

    def Dictation(self, *args):
        self.lbl2.text = str(int(args[1]))

    def Listening(self, *args):
        self.lbl3.text = str(int(args[1]))

    def Speaking(self, *args):
        self.lbl4.text = str(int(args[1]))




class ExporterScreen(Screen):
    def btn3(self):


        # This section loads and saves the information stored from the user input.
        self.pickle_in = open('dict.pickle', 'rb')  # opens and assigns the opened pickle file to variable.
        self.dict = pickle.load(self.pickle_in)  # imports the saved pickle file and assigns it to a variable.
        self.pickle_in.close()  # closes the pickle file for safety.

        #print(self.dict)

        temporary_row = []
        rows_list = []

        for k, v in self.dict.items():
            temporary_row.append(k)
            for i in v:
                temporary_row.append(i)
            rows_list.append(temporary_row)
            temporary_row = []

        with open('student_data.csv', 'w') as csvFile:

            writer = csv.writer(csvFile, delimiter=',')

            writer.writerow(['NAME', 'LEVEL', 'READING', 'DICTATION', 'WRITING', 'SPEAKING'])
            writer.writerows(rows_list) #the row should be ex: James, Earth, 23, 34, 45, 63

        csvFile.close()


class WindowManager(ScreenManager):
    pass


kv = Builder.load_file("my2.kv")


class MyMainApp(App):
    def build(self):
        return kv

if __name__ == "__main__":
    MyMainApp().run()

Вот мой код .kv:

WindowManager:
    MainWindow:
    Controller:
    ExporterScreen:


<MainWindow>:
    name: "main"
    first_name: first
    last_name: last


    GridLayout
        cols: 1
        size: root.width, root.height


        GridLayout:
            cols: 2

            Label:
                text: "Student First Name: "
            TextInput:
                id: first
                multiline: False

            Label:
                text: "Student Last Name: "
            TextInput:
                id: last
                multiline: False

        Button:
            size_hint: 0.3, 0.2
            text: "Submit"
            on_press: root.btn()

        FloatLayout:
            Button:
                font_size: 25
                size_hint: 0.3, 0.2
                text: ">"
                on_release:
                    app.root.current = "second"
                    root.manager.transition.direction = "left"
                pos_hint: {"right":1, "bottom": 1}

            Button:
                font_size: 25
                size_hint: 0.3, 0.2
                text: "<"
                on_release:
                    app.root.current = "third"
                    root.manager.transition.direction = "right"
                pos_hint: {"left":1, "bottom": 1}


<Controller>
    name: "second"
    lbl: my_label
    lbl2: my_label2
    lbl3: my_label3
    lbl4: my_label4
    first_last: first_last
    first_last2: first_last2
    level: level

    BoxLayout:
        orientation: 'vertical'
        Label:
            font_size: 25
            text: 'Reading'
        Label:
            id: my_label
            text: 'increase/decrease'
        Slider:
            min: 1
            max: 100
            on_value: root.Reading(*args)
        Label:
            font_size: 25
            text: 'Dictation'
        Label:
            id: my_label2
            text: 'increase/decrease'
        Slider:
            min: 1
            max: 100
            on_value: root.Dictation(*args)
        Label:
            font_size: 25
            text: 'Writing'
        Label:
            id: my_label3
            text: 'increase/decrease'
        Slider:
            min: 1
            max: 100
            on_value: root.Listening(*args)
        Label:
            font_size: 25
            text: 'Speaking'
        Label:
            id: my_label4
            text: 'increase/decrease'
        Slider:
            min: 1
            max: 100
            on_value: root.Speaking(*args)
        Label:
            text: "Level (Sky^, Sky, Earth, Rockets)"
        TextInput:
            multiline: False
            id: level

        GridLayout:
            cols:2
            Label:
                text: "First Name"
            TextInput:
                font_size: 8
                id: first_last
                multiline: False
            Label:
                text: "Last Name"
            TextInput:
                font_size: 8
                id: first_last2
                multiline: False


        GridLayout:
            cols: 3
            Button:
                text: "<"
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "right"
            Button:
                text: "Update"
                on_press: root.btn2()
            Button:
                text: ">"
                on_release:
                    app.root.current = "third"
                    root.manager.transition.direction = "left"


<ExporterScreen>
    name: "third"
    #GridLayout:
    #    orientation: "vertical"
#
    #    Button:
    #        font_size: 25
    #        size_hint: 0.3, 0.2
    #        text: "Export Data"
    #        on_press: root.btn3()
#
#
    #    FloatLayout:
    #        cols: 3
    #        Button:
    #            size_hint: 0.3, 0.2
    #            text: "<"
    #            on_release:
    #                app.root.current = "second"
    #                root.manager.transition.direction = "right"
    #            pos_hint: {"left": 1, "bottom": 1}
    #        #Button:
#
    #        Button:
    #            size_hint: 0.3, 0.2
    #            text: ">"
    #            on_release:
    #                app.root.current = "main"
    #                root.manager.transition.direction = "left"
    #            pos_hint: {"right":1, "bottom": 1}

    PageLayout:
        BoxLayout:
            orientation: 'vertical'
            cols: 3
            Label:
                text: "Hi"
            Label:
                text: "This application is still in developement"

            Label:
                text: "Bye"

            Button:
                font_size: 25
                #size_hint: 0.3, 0.2
                text: "Export Data"
                on_press: root.btn3()
        Label:
            text: 'This is just a blank page :('


        BoxLayout:
            orientation: 'vertical'
            cols: 3
            Label:
                text: ":)"
            Label:
                text: "Hello"

            Label:
                text: ":("

            Button:
                text: "Home"
                on_release:
                    app.root.current = "main"
                    root.manager.transition.direction = "right"
...