我正在尝试使用Kivy和Buildozer创建一个简单的Android应用程序,该应用程序使用roslibpy向Ros主题发布消息。这款应用在Windows和Ubuntu上运行良好,但在Android上立即崩溃。我一直在使用logcat在Android上调试,并更新了buildozer。带有可变依赖项(autobahn、txaio、twisted)的规范文件。然而,在将twisted添加到需求之后,我仍然得到与以前相同的错误。
> buildozer android debug deploy run logcat
...
06-13 21:05:13.317 31150 31336 I python : Traceback (most recent call last):
06-13 21:05:13.318 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/app/main.py", line 5, in <module>
06-13 21:05:13.318 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/platform/build-arm64-v8a/build/python-installs/HelloKivyApp/arm64-v8a/roslibpy/__init__.py", line 113, in <module>
06-13 21:05:13.319 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/platform/build-arm64-v8a/build/python-installs/HelloKivyApp/arm64-v8a/roslibpy/ros.py", line 11, in <module>
06-13 21:05:13.319 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/platform/build-arm64-v8a/build/python-installs/HelloKivyApp/arm64-v8a/roslibpy/comm/__init__.py", line 9, in <module>
06-13 21:05:13.320 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/platform/build-arm64-v8a/build/python-installs/HelloKivyApp/arm64-v8a/roslibpy/comm/comm_autobahn.py", line 6, in <module>
06-13 21:05:13.320 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/platform/build-arm64-v8a/build/python-installs/HelloKivyApp/arm64-v8a/autobahn/twisted/__init__.py", line 36, in <module>
06-13 21:05:13.321 31150 31336 I python : File "/home/ben/sirrl/KivyMD/HelloKivy/.buildozer/android/platform/build-arm64-v8a/build/python-installs/HelloKivyApp/arm64-v8a/autobahn/twisted/util.py", line 32, in <module>
06-13 21:05:13.321 31150 31336 I python : ModuleNotFoundError: No module named 'twisted.internet'
06-13 21:05:13.322 31150 31336 I python : Python for android ended.
我尝试过干净的构建,以及如何在Buildozer中构建kivy和Twisted的所有建议,但都没有运气。
这里是buildozer。如果需要,我可以发布完整的文件。requirements = python3,kivy,kivymd,pillow,roslibpy,autobahn,txaio,twisted
Thanks for the help
我发现这个链接描述了如何在Kivy中使用twisted。https://kivy.org/doc/stable/guide/other-frameworks.html server-app。在导入roslibpy(或任何依赖twisted的库)
之前,必须在main.py的顶部运行以下代码from kivy.support import install_twisted_reactor
install_twisted_reactor()
import roslibpy
不幸的是,kivy.support.install_twisted_reactor()
和roslibpy.Ros(...).run()
都创建并运行了一个扭曲反应器的实例,如果在同一个程序中调用它们,将会导致问题。
我找到的解决方案是在第一次构建(以及每次干净构建之后)上使用kivy.support.install_twisted_reactor()
,这将在运行时与twisted.internet.error.ReactorAlreadyRunning
一起失败,然后删除kivy.support.install_twisted_reactor()
并再次构建和部署,现在应该工作。
我确信有一个更好的方法,以更自动化的方式做到这一点,不需要多次构建,但我还没有找到它。
我苦苦挣扎了3天,终于把它修好了。
目标:一个简单的kivy应用程序运行在三星平板电脑上,有一个"发送你好世界"按钮。当按下按钮时,它应该发送一个"Hello World"通过罗斯桥向第二个设备发送消息。第二个设备(我的笔记本电脑)正在运行rosbridge-server和listener-node,该节点打印"Hello world";给控制台的消息。
问题:当我使用列出了所有需求的规范文件时,由于zope.interface引起的补丁错误,构建过程将失败。解决方案是只使用zope.interface进行第一次构建。在第一次构建之后,添加调试日志中列出的所有需要的依赖项。
Kivy version: 2.1.0
重要提示:
-
我不需要下面的代码来构建我的apk,如@benschnapp建议
从kivy。支持导入install_twisted_reactor
install_twisted_reactor ()
-
取消/添加android。权限= android.permission.INTERNET to buildozer.spec
构建过程:
首先构建:
requirements = python3, kivy, zope.interface
第二次构建:添加所需的模块
requirements = python3, kivy, zope.interface, roslibpy, autobahn, txaio, twisted, attrs, hyperlink, idna, cryptography