当前位置: 首页 > 工具软件 > Buildozer > 使用案例 >

Buildozer构架安卓应用

魏君博
2023-12-01

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虚拟机设置共享文件夹:

设置桌面快捷访问: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

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虚拟机设置共享文件夹:

设置桌面快捷访问: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

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的开放源码版本

 

 

 类似资料: