5

我在 python 3 和 kivy 中编写了一个小程序。现在我想使用 buildozer 构建一个 .apk 并在我的 android 手机上测试该应用程序。一切正常,我能够在手机上安装该应用程序,但该应用程序在启动时崩溃了。

错误日志显示,apk 的 python 环境是 python 2.7 而不是 3。因此,我的问题是:是否可以在 android 上使用 python 3 环境构建带有 buildozer 的 apk?还是我必须在 python2 中重写应用程序?是否有可能强制buildozer使用python3?

编辑:我按照 inclement 建议的步骤操作并收到以下错误:

 Traceback (most recent call last):
File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
  "__main__", fname, loader, pkg_name)
File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
  exec code in run_globals
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 747, in <module>
  main()
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 744, in main
  ToolchainCL()
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 323, in __init__
  getattr(self, args.command)(unknown)
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 105, in wrapper_func
  build_dist_from_args(ctx, dist, dist_args)
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 142, in build_dist_from_args
  build_recipes(build_order, python_modules, ctx)
File "pythonforandroid/build.py", line 560, in build_recipes
  recipe.build_arch(arch)
File "pythonforandroid/recipe.py", line 910, in build_arch
  self.build_cython_components(arch)
File "pythonforandroid/recipe.py", line 919, in build_cython_components
  command = sh.Command('python{}'.format(self.ctx.python_recipe.version))
File "/usr/lib/python2.7/site-packages/sh.py", line 788, in __init__
  raise CommandNotFound(path)
sh.CommandNotFound: python3.5
# Command failed: python -m pythonforandroid.toolchain create --dist_name=zugFart --bootstrap=sdl2 --requirements=kivy==1.9.1,python3crystax --arch armeabi-v7a --copy-libs

编辑2:这似乎是一个永无止境的故事。安装了 python3.5 后,我遇到了这个错误:

collect2: error: ld returned 1 exit status
error: command 'arm-linux-androideabi-gcc' failed with exit status 1

随着我过去从错误到错误的前进,将代码简单地更改为 python2.7 会更聪明,但现在我投入了这么多时间,我只想最终成功。:-)

那么有人知道如何解决这个问题吗?

最后编辑:我终于投降并更改了我的代码以使用 python 2.7。在此过程中,我监督了一个很好的建议:如果您使用期货,则必须将其添加到 buildozer 文件的要求中。否则,应用程序在启动时会崩溃并显示“空模块”错误消息。

现在我的应用程序可以在手机上运行,​​我终于高兴了 :-) 感谢我试图帮助我解决问题。

4

3 回答 3

3

我不确定 buildozer 是否有 python3 的构建选项,但 python-for-android 实验性地支持它。您可以通过从其主分支安装 buildozer 并使用android_new目标 ( buildozer android_new debug) 来使用新版本的 python-for-android。如果 buildozer 可以使用它的 python3 选项,您需要添加python3crystax要求(如果有,请替换 python2),手动下载 CrystaX NDK,并将 buildozer 的 NDK 路径选项设置为指向它。可能还需要写入kivy==1.9.1需求,而不仅仅是kivy.

Python3 构建仍在开发中,以具有 python2 的所有功能,并且需要进行一些清理,包括修剪包含的文件和压缩更多内容。一些菜谱还不能与 python3 一起使用,尽管大多数都可以。

编辑:除非您的脚本很复杂并且大量使用 py2/py3 的主要差异(例如 unicode 处理),否则使用 python2 可能并不难。由于它们几乎是相同的语言,因此您可能不需要“重写”,只需进行一些小的更改。

于 2016-04-11T09:39:11.080 回答
0

首先(至少几周前)kivy 无法正确使用 python 3.5,请改用 3.4;检查您的导入,有时它可能是完整模块导入的问题;示例 - 不要使用 import math,而是使用 from math import ...;最好的方法是使用您可以从 kivy 页面下载的预构建 buildozer 映像;我正在使用它,除了完全导入之外从来没有任何问题,并且 shebang 行也应该在构建之前从代码中删除(有时会出现问题)

于 2016-04-12T12:17:45.743 回答
0

如果您从源代码而不是从 pip 编译 buildozer,2018 年的自述文件声称支持 python3:

https://github.com/kivy/buildozer/

我会包含构建说明,但它们可能会在几个月内更改

于 2018-08-22T21:35:20.773 回答