Buildozer 编译 apk,但它在 android 上崩溃
Posted
技术标签:
【中文标题】Buildozer 编译 apk,但它在 android 上崩溃【英文标题】:Buildozer compiles apk, but it crashes on android 【发布时间】:2014-07-20 02:07:56 【问题描述】:我能够构建一个 .apk,但是在我将它安装到我的 android 手机上之后,它只是在启动时崩溃了。我失败的想法是我正在使用 3rd 方库,例如(beautifulsoup)。
这就是我的导入在 main.py 中的样子:
from kivy.app import App
from kivy.properties import ListProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
import time, os, random, urllib2, re, cookielib as cj
from bs4 import BeautifulSoup as bs
from functools import partial
我在跑小牛10.9.3
它与 buildozer.spec 文件有关吗? 我尝试将 BeautifulSoup 添加到应用需求中,但这并没有改变任何事情。
任何帮助将不胜感激。
【问题讨论】:
你能发一下logcat吗? 我不太确定logcat,我只运行'buildozer android logcat'吗?如果是,这就是我得到的: $ buildozer android logcat # 检查配置令牌 # 确保构建布局 # 检查配置令牌 您确实需要将所有非核心 Python 模块添加到您的 buildozer.spec 要求中。它们不会自动拾取。添加后,发布您的运行尝试日志。 我现在用的是'requirements = kivy, BeautifulSoup',functools,time,os都是核心模块吧?这是完整的日志:pastebin.com/ZyCipwwu 几个月前我遇到了完全相同的问题,并在 kivy 用户支持小组中提出了一个问题(谷歌那个,在那里问没有害处)。我在那里问了这个问题,但从未解决我的问题。 bs4 似乎根本无法与 kivy/buildozer 一起使用。但是,致力于它的人一直在修复用户遇到的错误和问题,所以现在可能已经解决了。我想我可能会再次提出这个问题,并希望得到解决 【参考方案1】:我也遇到了这个问题,但我(显然)能够通过解决方法让一切正常工作。由于看起来您发布的不是 logcat,因此我假设您遇到了与我相同的问题。
是的,您确实需要在规范中将 beautifulsoup4 列为一项要求。通过查看 bs4 的代码,bs4 似乎愿意使用几个“构建器”中的任何一个。它支持 htmlParser、html5lib 或 lxml。我不知道为什么我们不能加载 HTMLParser,但它实际上是三个库中 最不喜欢的 库,如果不是因为导入周围没有 try 块,它似乎一切都会正常工作(只要其他解析库之一可用)。
考虑到这一点,我包含了其他库之一,并决定破解导入过程,以便 Python 假装 _htmlparser 加载正常:)
这篇文章很有启发性:http://xion.org.pl/2012/05/06/hacking-python-imports/
最终结果是这样的:
import imp
import sys
class ImportBlocker(object):
def __init__(self, *args):
self.black_list = args
def find_module(self, name, path=None):
if name in self.black_list:
return self
return None
def load_module(self, name):
module = imp.new_module(name)
module.__all__ = [] # Necessary because of how bs4 inspects the module
return module
sys.meta_path = [ImportBlocker('bs4.builder._htmlparser')]
from bs4 import BeautifulSoup
我还在 buildozer.spec 的要求中添加了 html5lib。
现在,这是解决问题的正确方法吗?我不知道。最好的方法可能是要求作者修复它。可能就像将导入放在 try 块中一样简单。尽管如此,这是我目前采用的方法,它至少是一个有趣的练习,也是一种测试您的应用直到出现更好的修复的方法。
另外,我应该警告您,我最近才这样做,所以我不能 100% 保证它不会造成任何问题,但至少,它运行良好,足以让我的应用程序运行并抓取我感兴趣的特定网站。祝你好运!
【讨论】:
我也在为此苦苦挣扎,您的修复允许它在 Kivy Android 上运行。谢谢! 谢谢你!我一直在通过 buildozer 为 android 使用 bs4 太久了。你的工作对我有用,我非常感谢你。谢谢!【参考方案2】:我知道这个问题已经有好几年了。我认为@Will 给出的答案非常棒,但不幸的是,就我而言,我无法使用它,因为 html5lib 对于我正在制作的东西来说太慢了。所以仅供参考;对于绝对必须使用内置解析器的任何人。它不漂亮,但相当易于管理。
问题
经过大量调查,我确定了问题的原因。在 buildozer 日志中,我注意到编译 _htmlparser 文件时出现问题,日志读取如下(我的项目路径替换为
Compiling <project-path>/.buildozer/android/platform/build/dists/mypackage/private/lib/python2.7/site-packages/bs4/builder/_htmlparser.py ...
SyntaxError: ("(unicode error) \\N escapes not supported (can't load unicodedata module)", ('<project-path>/.buildozer/android/platform/build/dists/mypackage/private/lib/python2.7/site-packages/bs4/builder/_htmlparser.py', 135, None, 'data = u"\\NREPLACEMENT CHARACTER"\n'))
因为编译失败,它没有包含在构建的 apk 文件中。所以我查看了文件和导致问题的行:data = u"\NREPLACEMENT CHARACTER"
实际上应该替换为data = u"\ufffd"
快速修复
现在最简单的方法是修改包中的文件。您可以只编辑上面错误中提到的文件,理论上应该可以工作,但不建议这样做,因为每次重新安装软件包或从另一台机器构建代码时,问题都会再次出现。
稍微好一点的修复
如果修复程序全部打包到我们的代码中会很好,所以从@Will 的回答中汲取灵感,这是您在导入 bs4 之前需要放入的代码:
import sys
class ImportFixer(object):
def __init__(self, mname):
self.mname = mname
def find_module(self, name, path=None):
if name == self.mname:
return self
return None
def load_module(self, name):
import _htmlparser as module
module.__name__ = name
return module
sys.meta_path = [ImportFixer('bs4.builder._htmlparser')]
from bs4 import BeautifulSoup
主要区别在于您需要将 _htmlparser.py 文件从 bs4 包复制到当前目录并修复前面提到的行 data = u"\NREPLACEMENT CHARACTER"
和 data = u"\ufffd"
然后,每次导入bs4模块,都会神奇地拦截导入,使用本地文件。
警告:如果您曾经更新 Beautiful Soup,您可能需要在您的项目中使用更新的 _htmlparser.py 文件,并根据需要进行相同的修复。
最后的评论
如果我犯了一些拼写错误、语法错误或根本没有意义,请记住,我在周末的大部分时间都在努力解决这个问题,坦率地说,我的想法并不正确。如果您有任何问题,请发表评论,我会在有机会时回复和/或编辑我的答案。
【讨论】:
哎,看来python -m compileall 没有编译这个文件,所以直接是python的问题。这种东西最好直接报道项目而不是这里解释:) 编辑:实际报道github.com/kivy/python-for-android/issues/1060以上是关于Buildozer 编译 apk,但它在 android 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Buildozer 无法编译 .apk,因为未定义“xrange”
为啥 Kivy apk 在 android 设备上启动 apk 后立即崩溃
使用 buildozer 打包 apk 时出现 mpmath 和 sympy 错误