Buildozer构架安卓应用

目录

  1. 虚拟机相关配置:
  2. buildozer 0.39安装
  3. 用Xubuntu18.04建立打包环境的过程以及错误
  4. TIPS
  5. 附录

1、虚拟机相关配置:

1.1工具准备:

  1. 虚拟机:Oracle VM VirtualBox /VMware

如果再使用过程遇到错误:

错误提示:VERR-SUPDRV_HARDENING_EVIL_HANDLE(rc = -3738)

解决办法 :用版本更低的virtualBox:VirtualBox-4.3.12

  1. 镜像:xubuntu-18.04.3-desktop-amd64
  2. 虚拟机网络代理管理:profixer5.27

1.2虚拟机系统准备:

1.2.1 VBox虚拟机

1、网络错误:不能上网

解决:连接网线,重启。

2、错误:进入虚拟机后进行apt-getupdate失败,提示:

The repository 'http://mirrors.aliyun.com/ubuntu zesty Release' does not have a Release file或者:Not found [IP:XXXXXXXXXXXX]

原因:跟镜像的版本关系,建议选择长期支持(LTS)版本的镜像。

解决办法:cd 至/etc/apt/sources.list,执行:sudo vi sources.list 用下面的提供的镜 像源列表替换原来的sources.list。

或者执行:sudo chmod 777 sources.list 修改 sources.list文件权限,打开文件修改并 保存。

3、开机问题:开机执行5min读条。

  • 解决:cd至路径:

/etc/systemd/system/network-online.target.wants/networking.service

执行:sudo vi networking.service

将文件中最后一行的:TimeoutStartSec=5min 更改为:TimeoutStartSec=2sec

或者给文件权限直接进行编辑:sudo chmod 777 networking.service

1.2.2  VM虚拟机设置共享文件夹:

  • 参考百度经验:虚拟机设置共享文件夹
  • 设置完毕后访问目录:/mnt/hgfs/可以看到共享的文件夹

设置桌面快捷访问:sudo ln -sT /mnt/hgfs/XXX  /home/XXX/Desktop/XXX

(sudo ln -sT [文件夹路径] [桌面文件夹路径])

1.2.3设置虚拟机外部全局代理:

1、新建代理:

2、设置代理:

注意:

代理类型如果使用的是ss代理访问境外服务器,选择:SOCKS5

这里的代理IP为:127.0.0.1(本机回送地址) 端口设为:1080

3、设置代理规则:

这里在programs一栏,选择对应虚拟机负责网络连接的程序:

VirtualBox为:VirtualBox安装目录oraclevm\VirtualBox.exe

VMvare为:C:\Windows\SysWOW64\vmnat.exe

同时开启proxycap与ss便可以实现虚拟机内代理上网:

1.2.3设置虚拟机快照:

1、在VBox中称为备份功能:记录虚拟机不同时刻状态,方便返回之前状态。

2、在VMware中的快照功能,具有同样的功能。

1.2.4虚拟机使用的常见错误:

1、错误:Could not get lock /var/lib/dpkg/lock:

原因:出现这个问题可能是有另外一个程序正在运行,导致资源被锁不可用。 而导致资源被锁的原因可能是上次运行安装或更新时没有正常完成,进而出现 此状况

解决:重启或者执行:sudo rm /var/cache/apt/archives/lock

sudo rm /var/lib/dpkg/lock

  1. 错误:ReadTimeoutError/URLError

原因;网络问题,重新操作即可

解决办法:切换更好的网络环境反复尝试/更换时间段尝试虚拟外下载/手动添 加至指定路径。

  1. 错误:Permission denied

原因:操作权限不够

解决:执行语句前加:sudo

2、buildozer 0.39安装

2.1切换默认Python 版本:python3

  • sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 200

再执行:sudo update-alternatives --config python

就可以按照提示选择默认Python版本。同理,如果系统想安装多个python3的版 本,也可以使用类似的操作。

  • 在安装多个python版本的时候,请勿使用 sudo apt autoremove python3.5(卸载python3.5及其依赖),卸载系统自带的Python版本,否则会导致系统崩溃。

2.2 buildozer 0.39安装

  • sudo apt-get update
  • 安装最新pip:sudo curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  • sudo python get-pip.py
  • 安装/升级buildozer:

sudo pip install --upgrade buildozer

3、用Xubuntu18.04建立打包环境的过程以及错误

说明:之前在用kivy官方镜像:xubuntu17.04建立打包过程中,遇到了一些不同的问题, 我以为将其整合到其中了,下面包括两个版本的问题记录。

3.1:安装一些依赖包:

新系统缺少很多依赖包,需要手动提前安装,避免后面反复操作:

sudo apt-get install zlib1g-dev

sudo apt-get install git

sudo apt-get install cython

sudo apt-get install openjdk-8-jdk

sudo apt-get install zlib1g-dev

sudo apt-get install git

sudo apt-get install cython

sudo apt-get install openjdk-8-jdk

3.2:构建环境前的准备工作

  • 建立一个buildozer的工作目录,cd至该目录下面。目录用于存放需要打包的资源文件以及buildozer.spec文件,在buildozer程序第一次编译过程中会在这个文件夹中生成一个.buildozer的隐藏文件夹,只有 .buildozer和main.py以及buildozer.spec文件存在于同一个文件夹,打包过程才能正常进行。(通过Ctrl+H访问隐藏文件夹)
  • 建立main.py文件
  • 构建buildozerspec文件:Buildozer init
  • 修改buildozer.spec文件:log_level = 2
  • 开启外网代理,执行:buildozer -v android debug

3.3构建环境

主要分为两个步骤:下载组件建立(解压/编译/复制)环境,在3.2所说的目 下面执行指令:buildozer android -v debug

3.3.1下载组件:

3.3.1.1:python-for-android

1、Cloning into ‘python-for-android’(必须连接代理进行)

错误:failed to read python-for-android setup.py(找不到相关文件)

原因:因为网络原因,文件下载不完整

解决办法:删除工作目录下面/.buildozer/android/platform的/python-for-android文件夹, 在良好的的网络环境下面重新执行:buildozer android -v debug

3.3.1.2:安卓工具

1、下载并配置:ant/android sdk/android ndk(关闭代理下载速度更快)

2、Installing/updating SDK platform tools if necessary

错误:sdkmanger is not installed

原因:因为网络原因,文件下载不完整

解决办法:删除工作目录下面/.buildozer/android/platform下android-sdk的文件夹, 在良好的的网络环境下面重新执行:buildozer android -v debug

3、downloading build-tools

4、downloading platform api target

  1. 下载packages(可以不用代理)

主要包括:python、hostpython3、libffi、openssl、pyjnius、sdl2、sdl2_image、sdl2_mixer、sdl_ttf、setuptools、six、sqlites,下载至:/.bildozer/android/platform/build/packages

3.3.2: 建立(解压/编译/复制)环境

  1. 分别building上述下载的packages

错误:sh.CommandNotFound:make

原因:缺少make工具

解决:安装make工具:sudo apt install make

  1. building libffi for armeabi-v7a

错误: autoconf:not found

原因:缺少相应工具

解决: 1、sudo apt-get install autoconf / 2、sudo apt-get install automake /3、sudo apt-get install libtool

  1. building python3 for armeabi-v7a

如果在building python3过程中出错,如果是有关.so文件的错误,可以尝试终止过程,执行Buildozer android clean,然后再执行Buildozer android debug

  1. building pyjnius for armeabi-v7a

错误:XXXX Cython.Build.Cythonize(ModuleNotFound) 原因未知

解决:python3 pip install Cython(记得过程开始时就已经通过apt-get安装了cython, 但这里提示的是首字母大写的Cython,所以通过pip安装Cython,但具体有什么不同, 暂时还没有深究。)

  1. 这里日志中报告错误:jnius.c: No such file,但是构建过程没有终止,忽略了此错误。

至此,building的过程已经结束,后面基本不会出现什么大问题。

6、生成.apk文件

3.4添加packages--opencv

3.4.1安装cmake

  • 确认下载的版本:cmake-3.11.0.tar.Z
  • 这里以cmake-3.11.0.tar.Z为例子:

tar xf cmake-3.11.0.tar.Z

cd cmake-3.11.0.tar.Z

Sudo ./configure

Sudo make

sudo make install

3.4.2修改requirements

  • requirements = python3,kivy,opencv==3.4.0
  • 再次执行:Øbuildozer -v android debug

3.4.3下载并生成 opencv

错误:1 out of 1 hunk FAILED -- saving rejects to file modules/python/CMakeLists.txt.rej

分析:这个问题发生在给opencv打补丁的过程中,可能是opencv与cmake版本兼容问 题。

解决:由于之前在另外一个系统中有用cmake3.5运行成功的过程,于是将cmake3.5覆盖安装,执行Buildozer android clean,再重新执行Buildozer android debug,查看日志,上述过程中的位置#3正常运行,没有发生打补丁的错误。但是之后提示camke3.5版本太低仍报错。此时再覆盖安装cmake3.11,便没有再报错。相当于cmake3.5帮助完成了打补丁的过程。

3.4.4成功生成Apk文件,opencv运行正常

  • 相关包的版本cmake-3.11.0.tar.Z+opencv3.4.0
  • opencv测试代码:

cube_rgb = cv2.imread('/sdcard/test.jpg')

cube_gray = cv2.cvtColor(cube_rgb, cv2.COLOR_BGR2GRAY)

cv2.imwrite('/sdcard/res.jpg',cube_gray)

  • 其他版本搭配参考:cmake3.12+opencv3.4.1

3.5其他错误

1、错误:由java引发的错误:java.lang.NoClassDefFoundError

可能原因:java版本问题,建议使用java 8, Java 8是目前的长期支持版本

解决:sudo apt-get install openjdk-8-jdk(只需要装openjdk-8-jdk,不要装jre等,jdk已 经包含了jre以及java编译器)

2、建立 python3的过程中错误:No module named ‘_ctypes’

原因: 缺少相关模块。

解决:Sudo apt install libffi-dev

如果依旧解决不了尝试执行下面过程:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade

sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus

sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev

sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev

sudo apt-get install libssl-dev openssl

3、错误:安装cmake3.7.0出现:

原因:

解决:2、更换cmake版本至cmake3.11.0

4、问题:长时间卡在这个界面不动

可以尝试键入‘y’回车,继续执行。

5、错误:python文件语法错误:one of your Python files has syntax error。

原因:一般出现这个问题,要看min.py的语法是否与buildozer下对应的python版 本 是否一致。

解决:检查并更正main.py中是否有语法错误。

  1. 错误:Aidl not found, please install it

解决:

  • 首先应该检查,android sdk是否下载完整。
  • Buildozer文档中提示应该安装:build-tools
  • 如果没有解决,尝试安装:

sudo apt-get update

sudo apt-get install build-essential

sudo apt-get install libstdc++6

sudo apt-get install aidl

  1. 还有一些错误,碰到了,但是解决方法不是很清晰,列出来以后补充:
  • No module named 'ConfigParser'
  • Errors were encountered while processing: python-defusedxml
  • 建立libffi出错:possibly undefined macro: LT_SYS_SYMBOL_USCORE:

可能是automake,autoconf,libtool版本不匹配构成的,一直没有解决。

4、TIPS

  1. 镜像源包含了的资源包下载不使用代理下载快。镜像源不包含的资源使用代理下载更快,代理网络的网络状况上午好于下午。
  2. Python2,7的注释,出现中文时,需要加上:# coding: utf-8,否则报错。
  3. Linux系统中需要加 ./ 运行可执行文件。
  4. 有的资源包在下载时(虚拟机内/虚拟机外/使用代理)特别慢,可以尝试用手机开代理下载。用log中的链接下载。
  5. 在下载packages的过程中,可能会因为网络原因卡住,可以尝试重新进行过程/连接或断开代理/手动配置相关包,如果手动配置包,应该cd至相关包的路径下面,复制自己下载好的包,同时还应该生成一个.mark-<package-version>文件,如下:
  1. Buildozer指令:

    1. Buildzoer init

      1. 生成buildozer.spec file文件
    2. buildozer -v android debug
      1. 开始Android应用的构建
    3. buildozer android deploy run logcat
      1. 将apk 文件传到手机上并安装,获取buildozer运行log
    4. buildozer -v android debug deploy run logcat > my_log.txt
      1. 将logcat输出到名为my_log.txt的文件中
    5. buildozer android run logcat 2>&1 >/dev/null | grep 'XXX' > filter.out
      1. buildozer将adb logcat信息写入stderr,因此使用2>&1将其重定向到stdout,使用grep获取与XXX相关的所有信息
    6. buildozer android_new clean
      1. 清除已经构建了二进制的映象
  2. update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。
  3. 软件版本:

Alpha(α):预览版,或者叫内部测试版;一般不向外部发布,会有很多Bug;一般只有 测试人员使用。

Beta(β):测试版,或者叫公开测试版;这个阶段的版本会一直加入新的功能;在 Alpha 版之后推出。

RC(Release Candidate):最终测试版本;可能成为最终产品的候选版本,如果未出现问 题则可发布成为正式版本。多数开源软件会推出两个RC版本,最后的 RC2 则成为正 式版本。

  1. 编译安装cmake时,不要下载以及使用后缀是.zip的文件,里面没有 confiure文件,无法编译安装。
  1. 相关资源的网址:

虚拟机镜像:VM/VBOX:https://www.osboxes.org/virtualbox-images/

各平台、各个版本cmake的安装:https://cmake.org/files/

buildozer的官方使用文档:https://buildozer.readthedocs.io/en/latest/

xubuntu18.04官方下载:

https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/xubuntu/releases/18.04/release/xub untu-18.04-desktop-amd64.iso

Buildozer 官方使用文档:https://buildozer.readthedocs.io/en/latest/

附录:

libffi:

外部函数接口 LibFFI。“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码。而 “Libffi” 库只提供了最底层的、与架构相关的、完整的”FFI”,因此在它之上必须有一层来负责管理两种语言之间参数的格式转换。

高级语言编译器产生代码时都会依据一系列的规则,这些规则十分必要,特别是对独立编译来说。其中之一是“调用约定” (Calling Convention),它包含了编译器关于函数入口处的函数参数、函数返回值的一系列假设。它有时也被称作“ABI”(Application Binary Interface)。调用约定(Calling Conventions)定义了程序中调用函数的方式,它决定了在函数调用的时候数据(比如说参数)在堆栈中的组织方式。

目前有许多项目都使用了 libff ,包括 ruby,cpython, openjdk,dalvik vm 等等。例如在 Ruby 中,利用 rubyffi (包装了 libffi )可以如此动态地调用一个 dll。

内容来自:https://www.cnblogs.com/findumars/p/4882620.html

Openssl:

OpenSSL是为网络通信提供安全及数据完整性的一种安全协议。OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

  作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

  辅助功能:BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。

OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。

内容来自:

https://blog.csdn.net/m0_38080126/article/details/77609226

Pyjnius

Pyjnius是一个用于访问Java类的Python库。

内容来自:https://www.jianshu.com/p/5c7c3e514e37

sdl2

Sdl2它是一个(相对)易于使用的库,可以在不依赖于特定于操作的功能的情况下添加多媒体功能。SDL提供的内容:窗口管理、软件(CPU)和硬件(GPU)渲染2D图形、输入事件系统、时间管理、音频处理、文件IO和加载、穿线、用于3D图形的OpenGL API。

sdl2_image

由于在使用SDL2开发的过程,需要加载png图片,而SDL2本身不提供加载png图片的功能实现。所以需要在引入SDL2_image库。

sdl2_mixer :播放音乐库

sdl_ttfL:显示文字,渲染文字

Setuptools

Python包管理工具,setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块即可。支持上传到PyPI。

内容来自:https://www.jianshu.com/p/ea9973091fdf

Six

Python 2 和 Python 3 版本的分裂给 Python 开发者们带来了很大的烦恼,为了使代码同时兼容两个版本,往往要增加大量的代码。 于是 Six 出现了。正如它的介绍所说,它是一个专门用来兼容 Python 2 和 Python 3 的库。它解决了诸如 urllib 的部分方法不兼容, str 和 bytes 类型不兼容等问题。

sqlites

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

内容来自:https://baike.baidu.com/item/SQLite/375020?fr=aladdin

.so文件

Android中的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发中。

其实就是shared object的意思,.so文件的理解

内容来自:https://blog.csdn.net/zplxl99/article/details/80376298

Cython

准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而 Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。

C语言是编译性语言,而Python则是解释性语言,简而言之,就是Python运行是逐行运行,不需要实现编译,而C需要在运行前编译。那么,可想而知,如果运行前,需要事先编译,那么其实有一种“上帝视角”的感觉,自然可以做很多优化,让代码运行的更快。而Cython的出现就是这个目的,让Python也可以被编译,然后执行。Cython是一种部分包含和改变C语言,以及完全包含pyhton语言的一个语言集合。Cython是用Python实现的一种语言,可以用来写Python扩展,用它写出来的库都可以通过import来载入,性能上比Python的快。Cython里可以载入Python扩展(比如 import math),也可以载入C的库的头文件(比如:cdef extern from “math.h”),另外也可以用它来写Python代码。将关键部分重写成C扩展模块。Cython中的强大之处在于可以把Python和C结合起来,它使得看起来像Python语言的Cython代码有着和C相似的运行速度。

内容来自:https://blog.csdn.net/mou_it/article/details/81876879

Cpython

CPython是特指C语言实现的Python,就是原汁原味的Python。

之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。

JDK

Buildozer构架安卓应用

目录

  1. 虚拟机相关配置:
  2. buildozer 0.39安装
  3. 用Xubuntu18.04建立打包环境的过程以及错误
  4. TIPS
  5. 附录

1、虚拟机相关配置:

1.1工具准备:

  1. 虚拟机:Oracle VM VirtualBox /VMware

如果再使用过程遇到错误:

错误提示:VERR-SUPDRV_HARDENING_EVIL_HANDLE(rc = -3738)

解决办法 :用版本更低的virtualBox:VirtualBox-4.3.12

  1. 镜像:xubuntu-18.04.3-desktop-amd64
  2. 虚拟机网络代理管理:profixer5.27

1.2虚拟机系统准备:

1.2.1 VBox虚拟机

1、网络错误:不能上网

解决:连接网线,重启。

2、错误:进入虚拟机后进行apt-getupdate失败,提示:

The repository 'http://mirrors.aliyun.com/ubuntu zesty Release' does not have a Release file或者:Not found [IP:XXXXXXXXXXXX]

原因:跟镜像的版本关系,建议选择长期支持(LTS)版本的镜像。

解决办法:cd 至/etc/apt/sources.list,执行:sudo vi sources.list 用下面的提供的镜 像源列表替换原来的sources.list。

或者执行:sudo chmod 777 sources.list 修改 sources.list文件权限,打开文件修改并 保存。

3、开机问题:开机执行5min读条。

  • 解决:cd至路径:

/etc/systemd/system/network-online.target.wants/networking.service

执行:sudo vi networking.service

将文件中最后一行的:TimeoutStartSec=5min 更改为:TimeoutStartSec=2sec

或者给文件权限直接进行编辑:sudo chmod 777 networking.service

1.2.2  VM虚拟机设置共享文件夹:

  • 参考百度经验:虚拟机设置共享文件夹
  • 设置完毕后访问目录:/mnt/hgfs/可以看到共享的文件夹

设置桌面快捷访问:sudo ln -sT /mnt/hgfs/XXX  /home/XXX/Desktop/XXX

(sudo ln -sT [文件夹路径] [桌面文件夹路径])

1.2.3设置虚拟机外部全局代理:

1、新建代理:

2、设置代理:

注意:

代理类型如果使用的是ss代理访问境外服务器,选择:SOCKS5

这里的代理IP为:127.0.0.1(本机回送地址) 端口设为:1080

3、设置代理规则:

这里在programs一栏,选择对应虚拟机负责网络连接的程序:

VirtualBox为:VirtualBox安装目录oraclevm\VirtualBox.exe

VMvare为:C:\Windows\SysWOW64\vmnat.exe

同时开启proxycap与ss便可以实现虚拟机内代理上网:

1.2.3设置虚拟机快照:

1、在VBox中称为备份功能:记录虚拟机不同时刻状态,方便返回之前状态。

2、在VMware中的快照功能,具有同样的功能。

1.2.4虚拟机使用的常见错误:

1、错误:Could not get lock /var/lib/dpkg/lock:

原因:出现这个问题可能是有另外一个程序正在运行,导致资源被锁不可用。 而导致资源被锁的原因可能是上次运行安装或更新时没有正常完成,进而出现 此状况

解决:重启或者执行:sudo rm /var/cache/apt/archives/lock

sudo rm /var/lib/dpkg/lock

  1. 错误:ReadTimeoutError/URLError

原因;网络问题,重新操作即可

解决办法:切换更好的网络环境反复尝试/更换时间段尝试虚拟外下载/手动添 加至指定路径。

  1. 错误:Permission denied

原因:操作权限不够

解决:执行语句前加:sudo

2、buildozer 0.39安装

2.1切换默认Python 版本:python3

  • sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 200

再执行:sudo update-alternatives --config python

就可以按照提示选择默认Python版本。同理,如果系统想安装多个python3的版 本,也可以使用类似的操作。

  • 在安装多个python版本的时候,请勿使用 sudo apt autoremove python3.5(卸载python3.5及其依赖),卸载系统自带的Python版本,否则会导致系统崩溃。

2.2 buildozer 0.39安装

  • sudo apt-get update
  • 安装最新pip:sudo curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  • sudo python get-pip.py
  • 安装/升级buildozer:

sudo pip install --upgrade buildozer

3、用Xubuntu18.04建立打包环境的过程以及错误

说明:之前在用kivy官方镜像:xubuntu17.04建立打包过程中,遇到了一些不同的问题, 我以为将其整合到其中了,下面包括两个版本的问题记录。

3.1:安装一些依赖包:

新系统缺少很多依赖包,需要手动提前安装,避免后面反复操作:

sudo apt-get install zlib1g-dev

sudo apt-get install git

sudo apt-get install cython

sudo apt-get install openjdk-8-jdk

sudo apt-get install zlib1g-dev

sudo apt-get install git

sudo apt-get install cython

sudo apt-get install openjdk-8-jdk

3.2:构建环境前的准备工作

  • 建立一个buildozer的工作目录,cd至该目录下面。目录用于存放需要打包的资源文件以及buildozer.spec文件,在buildozer程序第一次编译过程中会在这个文件夹中生成一个.buildozer的隐藏文件夹,只有 .buildozer和main.py以及buildozer.spec文件存在于同一个文件夹,打包过程才能正常进行。(通过Ctrl+H访问隐藏文件夹)
  • 建立main.py文件
  • 构建buildozerspec文件:Buildozer init
  • 修改buildozer.spec文件:log_level = 2
  • 开启外网代理,执行:buildozer -v android debug

3.3构建环境

主要分为两个步骤:下载组件建立(解压/编译/复制)环境,在3.2所说的目 下面执行指令:buildozer android -v debug

3.3.1下载组件:

3.3.1.1:python-for-android

1、Cloning into ‘python-for-android’(必须连接代理进行)

错误:failed to read python-for-android setup.py(找不到相关文件)

原因:因为网络原因,文件下载不完整

解决办法:删除工作目录下面/.buildozer/android/platform的/python-for-android文件夹, 在良好的的网络环境下面重新执行:buildozer android -v debug

3.3.1.2:安卓工具

1、下载并配置:ant/android sdk/android ndk(关闭代理下载速度更快)

2、Installing/updating SDK platform tools if necessary

错误:sdkmanger is not installed

原因:因为网络原因,文件下载不完整

解决办法:删除工作目录下面/.buildozer/android/platform下android-sdk的文件夹, 在良好的的网络环境下面重新执行:buildozer android -v debug

3、downloading build-tools

4、downloading platform api target

  1. 下载packages(可以不用代理)

主要包括:python、hostpython3、libffi、openssl、pyjnius、sdl2、sdl2_image、sdl2_mixer、sdl_ttf、setuptools、six、sqlites,下载至:/.bildozer/android/platform/build/packages

3.3.2: 建立(解压/编译/复制)环境

  1. 分别building上述下载的packages

错误:sh.CommandNotFound:make

原因:缺少make工具

解决:安装make工具:sudo apt install make

  1. building libffi for armeabi-v7a

错误: autoconf:not found

原因:缺少相应工具

解决: 1、sudo apt-get install autoconf / 2、sudo apt-get install automake /3、sudo apt-get install libtool

  1. building python3 for armeabi-v7a

如果在building python3过程中出错,如果是有关.so文件的错误,可以尝试终止过程,执行Buildozer android clean,然后再执行Buildozer android debug

  1. building pyjnius for armeabi-v7a

错误:XXXX Cython.Build.Cythonize(ModuleNotFound) 原因未知

解决:python3 pip install Cython(记得过程开始时就已经通过apt-get安装了cython, 但这里提示的是首字母大写的Cython,所以通过pip安装Cython,但具体有什么不同, 暂时还没有深究。)

  1. 这里日志中报告错误:jnius.c: No such file,但是构建过程没有终止,忽略了此错误。

至此,building的过程已经结束,后面基本不会出现什么大问题。

6、生成.apk文件

3.4添加packages--opencv

3.4.1安装cmake

  • 确认下载的版本:cmake-3.11.0.tar.Z
  • 这里以cmake-3.11.0.tar.Z为例子:

tar xf cmake-3.11.0.tar.Z

cd cmake-3.11.0.tar.Z

Sudo ./configure

Sudo make

sudo make install

3.4.2修改requirements

  • requirements = python3,kivy,opencv==3.4.0
  • 再次执行:Øbuildozer -v android debug

3.4.3下载并生成 opencv

错误:1 out of 1 hunk FAILED -- saving rejects to file modules/python/CMakeLists.txt.rej

分析:这个问题发生在给opencv打补丁的过程中,可能是opencv与cmake版本兼容问 题。

解决:由于之前在另外一个系统中有用cmake3.5运行成功的过程,于是将cmake3.5覆盖安装,执行Buildozer android clean,再重新执行Buildozer android debug,查看日志,上述过程中的位置#3正常运行,没有发生打补丁的错误。但是之后提示camke3.5版本太低仍报错。此时再覆盖安装cmake3.11,便没有再报错。相当于cmake3.5帮助完成了打补丁的过程。

3.4.4成功生成Apk文件,opencv运行正常

  • 相关包的版本cmake-3.11.0.tar.Z+opencv3.4.0
  • opencv测试代码:

cube_rgb = cv2.imread('/sdcard/test.jpg')

cube_gray = cv2.cvtColor(cube_rgb, cv2.COLOR_BGR2GRAY)

cv2.imwrite('/sdcard/res.jpg',cube_gray)

  • 其他版本搭配参考:cmake3.12+opencv3.4.1

3.5其他错误

1、错误:由java引发的错误:java.lang.NoClassDefFoundError

可能原因:java版本问题,建议使用java 8, Java 8是目前的长期支持版本

解决:sudo apt-get install openjdk-8-jdk(只需要装openjdk-8-jdk,不要装jre等,jdk已 经包含了jre以及java编译器)

2、建立 python3的过程中错误:No module named ‘_ctypes’

原因: 缺少相关模块。

解决:Sudo apt install libffi-dev

如果依旧解决不了尝试执行下面过程:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade

sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus

sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev

sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev

sudo apt-get install libssl-dev openssl

3、错误:安装cmake3.7.0出现:

原因:

解决:2、更换cmake版本至cmake3.11.0

4、问题:长时间卡在这个界面不动

可以尝试键入‘y’回车,继续执行。

5、错误:python文件语法错误:one of your Python files has syntax error。

原因:一般出现这个问题,要看min.py的语法是否与buildozer下对应的python版 本 是否一致。

解决:检查并更正main.py中是否有语法错误。

  1. 错误:Aidl not found, please install it

解决:

  • 首先应该检查,android sdk是否下载完整。
  • Buildozer文档中提示应该安装:build-tools
  • 如果没有解决,尝试安装:

sudo apt-get update

sudo apt-get install build-essential

sudo apt-get install libstdc++6

sudo apt-get install aidl

  1. 还有一些错误,碰到了,但是解决方法不是很清晰,列出来以后补充:
  • No module named 'ConfigParser'
  • Errors were encountered while processing: python-defusedxml
  • 建立libffi出错:possibly undefined macro: LT_SYS_SYMBOL_USCORE:

可能是automake,autoconf,libtool版本不匹配构成的,一直没有解决。

4、TIPS

  1. 镜像源包含了的资源包下载不使用代理下载快。镜像源不包含的资源使用代理下载更快,代理网络的网络状况上午好于下午。
  2. Python2,7的注释,出现中文时,需要加上:# coding: utf-8,否则报错。
  3. Linux系统中需要加 ./ 运行可执行文件。
  4. 有的资源包在下载时(虚拟机内/虚拟机外/使用代理)特别慢,可以尝试用手机开代理下载。用log中的链接下载。
  5. 在下载packages的过程中,可能会因为网络原因卡住,可以尝试重新进行过程/连接或断开代理/手动配置相关包,如果手动配置包,应该cd至相关包的路径下面,复制自己下载好的包,同时还应该生成一个.mark-<package-version>文件,如下:
  1. Buildozer指令:

    1. Buildzoer init

      1. 生成buildozer.spec file文件
    2. buildozer -v android debug
      1. 开始Android应用的构建
    3. buildozer android deploy run logcat
      1. 将apk 文件传到手机上并安装,获取buildozer运行log
    4. buildozer -v android debug deploy run logcat > my_log.txt
      1. 将logcat输出到名为my_log.txt的文件中
    5. buildozer android run logcat 2>&1 >/dev/null | grep 'XXX' > filter.out
      1. buildozer将adb logcat信息写入stderr,因此使用2>&1将其重定向到stdout,使用grep获取与XXX相关的所有信息
    6. buildozer android_new clean
      1. 清除已经构建了二进制的映象
  2. update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。
  3. 软件版本:

Alpha(α):预览版,或者叫内部测试版;一般不向外部发布,会有很多Bug;一般只有 测试人员使用。

Beta(β):测试版,或者叫公开测试版;这个阶段的版本会一直加入新的功能;在 Alpha 版之后推出。

RC(Release Candidate):最终测试版本;可能成为最终产品的候选版本,如果未出现问 题则可发布成为正式版本。多数开源软件会推出两个RC版本,最后的 RC2 则成为正 式版本。

  1. 编译安装cmake时,不要下载以及使用后缀是.zip的文件,里面没有 confiure文件,无法编译安装。
  1. 相关资源的网址:

虚拟机镜像:VM/VBOX:https://www.osboxes.org/virtualbox-images/

各平台、各个版本cmake的安装:https://cmake.org/files/

buildozer的官方使用文档:https://buildozer.readthedocs.io/en/latest/

xubuntu18.04官方下载:

https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/xubuntu/releases/18.04/release/xub untu-18.04-desktop-amd64.iso

Buildozer 官方使用文档:https://buildozer.readthedocs.io/en/latest/

附录:

libffi:

外部函数接口 LibFFI。“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码。而 “Libffi” 库只提供了最底层的、与架构相关的、完整的”FFI”,因此在它之上必须有一层来负责管理两种语言之间参数的格式转换。

高级语言编译器产生代码时都会依据一系列的规则,这些规则十分必要,特别是对独立编译来说。其中之一是“调用约定” (Calling Convention),它包含了编译器关于函数入口处的函数参数、函数返回值的一系列假设。它有时也被称作“ABI”(Application Binary Interface)。调用约定(Calling Conventions)定义了程序中调用函数的方式,它决定了在函数调用的时候数据(比如说参数)在堆栈中的组织方式。

目前有许多项目都使用了 libff ,包括 ruby,cpython, openjdk,dalvik vm 等等。例如在 Ruby 中,利用 rubyffi (包装了 libffi )可以如此动态地调用一个 dll。

内容来自:https://www.cnblogs.com/findumars/p/4882620.html

Openssl:

OpenSSL是为网络通信提供安全及数据完整性的一种安全协议。OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

  作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

  辅助功能:BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。

OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。

内容来自:

https://blog.csdn.net/m0_38080126/article/details/77609226

Pyjnius

Pyjnius是一个用于访问Java类的Python库。

内容来自:https://www.jianshu.com/p/5c7c3e514e37

sdl2

Sdl2它是一个(相对)易于使用的库,可以在不依赖于特定于操作的功能的情况下添加多媒体功能。SDL提供的内容:窗口管理、软件(CPU)和硬件(GPU)渲染2D图形、输入事件系统、时间管理、音频处理、文件IO和加载、穿线、用于3D图形的OpenGL API。

sdl2_image

由于在使用SDL2开发的过程,需要加载png图片,而SDL2本身不提供加载png图片的功能实现。所以需要在引入SDL2_image库。

sdl2_mixer :播放音乐库

sdl_ttfL:显示文字,渲染文字

Setuptools

Python包管理工具,setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。用户在使用setuptools创建的包时,并不需要已安装setuptools,只要一个启动模块即可。支持上传到PyPI。

内容来自:https://www.jianshu.com/p/ea9973091fdf

Six

Python 2 和 Python 3 版本的分裂给 Python 开发者们带来了很大的烦恼,为了使代码同时兼容两个版本,往往要增加大量的代码。 于是 Six 出现了。正如它的介绍所说,它是一个专门用来兼容 Python 2 和 Python 3 的库。它解决了诸如 urllib 的部分方法不兼容, str 和 bytes 类型不兼容等问题。

sqlites

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

内容来自:https://baike.baidu.com/item/SQLite/375020?fr=aladdin

.so文件

Android中的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发中。

其实就是shared object的意思,.so文件的理解

内容来自:https://blog.csdn.net/zplxl99/article/details/80376298

Cython

准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而 Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。

C语言是编译性语言,而Python则是解释性语言,简而言之,就是Python运行是逐行运行,不需要实现编译,而C需要在运行前编译。那么,可想而知,如果运行前,需要事先编译,那么其实有一种“上帝视角”的感觉,自然可以做很多优化,让代码运行的更快。而Cython的出现就是这个目的,让Python也可以被编译,然后执行。Cython是一种部分包含和改变C语言,以及完全包含pyhton语言的一个语言集合。Cython是用Python实现的一种语言,可以用来写Python扩展,用它写出来的库都可以通过import来载入,性能上比Python的快。Cython里可以载入Python扩展(比如 import math),也可以载入C的库的头文件(比如:cdef extern from “math.h”),另外也可以用它来写Python代码。将关键部分重写成C扩展模块。Cython中的强大之处在于可以把Python和C结合起来,它使得看起来像Python语言的Cython代码有着和C相似的运行速度。

内容来自:https://blog.csdn.net/mou_it/article/details/81876879

Cpython

CPython是特指C语言实现的Python,就是原汁原味的Python。

之所以使用CPython这个词,是因为Python还有一些其它的实现,比如Jython,就是Java版的Python,还有烧脑的PyPy,使用Python再把Python实现了一遍。

JDK

JDK是Java Development Kit 的缩写,中文称为Java开发工具包,由SUN公司提供。它为Java程序开发提供了编译和运行环境,包含三个版本:(J2SE、J2EE、J2ME)

JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

JRE是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

openjdk是jdk的开放源码版本。

JDK是Java Development Kit 的缩写,中文称为Java开发工具包,由SUN公司提供。它为Java程序开发提供了编译和运行环境,包含三个版本:(J2SE、J2EE、J2ME)

JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

JRE是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

openjdk是jdk的开放源码版本。

Buildozer构架安卓应用相关推荐

  1. 《Buildozer打包实战指南》第五节 在安卓模拟器和真机上运行apk文件并查看日志

    目录 5.1 在安卓模拟器上运行apk文件并查看日志 5.2 在真机上运行并查看日志 5.3 查看apk包内日志 成功打包出apk文件并不代表真正成功,只

  2. Python、Kivy、Buildozer打包成功的apk在安卓平台安装打开后闪退(崩溃)?

    这是一篇写给自己的笔记. 发现app闪退后,去手机设置里"开发者选项",导出错误日志.我的三星手机叫"漏洞报告" 等待几分钟完成后,获得一个压缩包,可以通过QQ ...

  3. py文件打包或apk_Python文件打包成exe很简单,如果安卓手机也能运行的软件你会吗...

    前言 我相信很多小伙伴都知道怎么将Python的文件打包成exe,而且这个也非常的简单,一行代码就能轻松搞定:pyinstaller -F xxx.py 但是如果我们用Python开发一个小游戏或者一 ...

  4. Facebook 开源安卓版 React Native,开发者可将相同代码用于网页和 iOS 应用开发

    转自:http://mt.sohu.com/20150915/n421177212.shtml Facebook 创建了React Java 库,这样,Facebook 的工程团队就可以用相同的代码给 ...

  5. 二手手机交易平台使用MYSQL的方法_安卓Android校园淘(二手交易)APP设计与实现(MySQL)...

    安卓Android校园淘(二手交易)APP设计与实现(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文14000字,程序代码,MySQL数据库) 本项目就是一个基于Androi ...

  6. 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )

    From:Hook 神器家族的 Frida 工具使用详解:https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frid ...

  7. android配置so支持armeabi,安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)...

    背景 Android 系统本质是一个通过改造的 Linux 系统,so库是Linux系统上使用的共享库(相似windows上的dll).最先,Android 系统只支持 ARMv5 的 CPU 构架, ...

  8. 鸿蒙将至,安卓安否?

    本文经授权转载自花边科技(ID:huabiankeji) 封图 | CSDN付费下载于东方IC 七年前,任正非曾说过这样的一句话,如果他们突然断了我们的粮食,安卓系统不给我用了,Window  Pho ...

  9. python3下载手机安卓版,python3.0手机版下载

    如何在手机上下载python 应用市场内搜索下载下载Python在您开始之前,在你的计算机将需要Python,但您可能不需要下载它. 首先检查(在命令行窗口输入python)有没有安装Python!如 ...

最新文章

  1. 安卓4.4.4安装哪个微信版本_微信一个开关,速度立马提升一倍
  2. python 百度词典_python在线抓取百度词典的翻译结果翻译单词
  3. gulp与grunt对比
  4. 安装hadoop1.2.1集群环境
  5. ”Can't connect to MySQL server on localhost (10061)”
  6. SQL10 用where过滤空值练习
  7. RMSE、MAPE、准确率、召回率、F1、ROC、AUC总结
  8. ReactiveCocoa中潜在的内存泄漏及解决方案
  9. rabbitmq 相关方法
  10. Beta阶段冲刺第一天
  11. Linux报错问题:bash: vi: command not found
  12. Java开发工程师如何做好职业规划和成长路线
  13. 显卡RTX2080 + CUDA10 + win10 + tensorflow配置安装探坑记
  14. HyperX Alloy Mars2游戏机械键盘,深耕专业电竞机游戏械键盘
  15. python解决租房问题_高德API+Python解决租房问题
  16. 发现网站被劫持该怎么办?网站域名劫持如何有效预防
  17. STM32单片机扫雷游戏TFT触摸操作单片机小游戏
  18. useNavigate使用报错
  19. python多线程,线程锁
  20. Java初学者作业——编写Java程序, 实现根据用户购买商品总金额, 计算实际支付的金额及所获得的购物券金额。

热门文章

  1. 矩阵特征值和特征向量求解——特征值分解
  2. 营收倍数级增长,利润却止步不前!光庭信息只有一只脚踏进了智能电动车风口?...
  3. (业务)自动生成邀请码
  4. 信息系统综合测试与管理
  5. 2003server计算机管理里面没有本地用户和组
  6. GeoServer操作文档
  7. java mf文件怎么打开_安卓手机如何打开.MF文件?
  8. 微信小程序 java服务器发送通知给用户 全流程 (获取openid 获取formid)
  9. 9月有哪些程序员新书与您相约?
  10. 高等数学学习笔记——第二十八讲——函数的极值及最优化应用