使用buildozer 将kivy编写的Python程序打包成apk

kivy 打包安卓apk

想将kivy编写Python程序打包成apk,在网上找了一些别人配置的环境,发现版本比较旧了,打包出现一堆问题,因此想自己搭一个,虽然过程艰辛,也算是有所收获,记录下来,方便自己回顾。

一、环境配置:

win10系统
kivy==2.1.0

二、目的:

自己通过kivy(2.1.0)写了一个拍照的程序(调用了opencv),希望通过buildozer工具,将其打包成apk,安装到安卓手机上使用。

三、过程记录:

1、安装ubuntu 22.04虚拟环境:

选用ubuntu22.04原因:尝试过18.04和20.04,均失败了,最后选用了ubuntu22.04 LTS版,成功打包

1.1 virtualbox官网下载virtualbox,安装到电脑;

在这里插入图片描述

如果下载的virtualbox不能使用,再去官网上下载拓展包,安装到电脑即可。

1.2 ubuntu官网下载ubuntu 22.04 LTS:
1.3 在virtualbox中安装ubuntu虚拟环境:

参考教程:使用VirtualBox安装Linux虚拟机,避坑指南.
在安装时,分配给虚拟机的内存建议大于35G
在这里插入图片描述

1.4 建立共享文件夹,主机与虚拟机共享粘贴板::

共享文件夹是实现主机与虚拟机文件传输的通道。

① 在“设置”中添加要共享的文件夹:

勾选“固定分配”和“自动挂载”,保存。
在这里插入图片描述

② 共享粘贴板:

“设置”→“常规”→“高级”,
“共享粘贴板”和“拖放”均设为“双向”。
在这里插入图片描述

③ 安装增强功能:

安装后,点击“VBox_GAs_7.0.10”中的 “VBoxLinuxAdditions.run” ,右键选择“作为程序运行”,完成安装。即可看到“sf_”开头的共享文件夹。
在这里插入图片描述

④ 重启虚拟机,设置完成。
⑤ 如果显示没有访问共享文件夹的权限,在终端执行以下语句:
sudo usermod -aG vboxsf $(你的用户名)

重启是虚拟机即可。

2、在虚拟机的主目录下,创建一个空文件夹 “pcaking”,进入该文件夹,右键选择“在终端打开”,在该终端中执行后面的所以命令。

3、在虚拟环境中安装Python3.9

ubuntu22.04中自带的是Python3.10,通过其打包的apk调试时显示没有opencv模块,查了一圈都说在 opencv 4.5.3.56 版本以后,打包经常出现这个问题,因此需要退回4.5.3.56版本,但是在python3.10环境下,一直无法安装opencv 4.5.3.56版本,存在版本冲突

因此,我们这里需要在虚拟环境中安装python3.9,并在该环境下进行打包。
安装参考:在 Ubuntu 22.04 上安装 Python 3.9(多版本适用)

在安装3.9以后,不要尝试卸载原来的3.10,因为有些环境依赖于3.10,卸载了可能环境就蹦了!!!

4、配置buildozer:

根据官方文档,配置buildozer工具:

①安装buildozer包
pip3 install --user --upgrade buildozer
②安装依赖
sudo apt update
sudo apt install -y git zip unzip openjdk-11-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev 
pip3 install --user --upgrade Cython==0.29.33 virtualenv  # the --user should be removed if you do this in a venv

官网推荐的openjdk-17在打包报错,改用openjdk-11后解决。

③ 在 ~/.bashrc 文件最后一行加入下列内容:
export PATH=$PATH:~/.local/bin/

.bashrc文件可在主目录中找到(隐藏的文件,点击右上角的三条杠即勾选显示隐藏文件即可找到)。

5、打包:

首先将你需要打包的程序复制到2中创建的 “packing” 文件夹中,其中,主程序命名为 “main.py”(必须这样)。

① 生成 “buildozer.spec” 文件,这个文件将会控制你的打包配置:
buildozer init

buildozer.spec”的配置及介绍,查看文章 kivy Buildozer文件参数介绍或者去官网看介绍 buildozer.spec文件介绍
其实官网介绍也比较简单,想深入了解的可以查看生成的 “buildozer.spec” 文件,里面有注释!!!
也可以将自己写好的 “buildozer.spec”放入到当前文件夹,直接执行第②步。

注意:
“buildozer.spec” 中,有一行是添加所需的依赖包:

# (list) Application requirements
# comma seperated e.g. requirements = sqlite3,kivy
requirements = python3==3.9.12,hostpython3==3.9.12,kivy==2.1.0,opencv

其中依赖包的写法要对应官网要求的recipes:点击查看recipes
此外,有时候指明版本号可能会出现网络问题,去掉版本号即可!

② 配置Android环境:
buildozer -v android debug

第一次打包过程比较长,耐心等待~~~

6、实体机调试:

我的手机型号:redmiK30 pro

① 下载adb调试工具:

参考文章:Windows 10 如何安装adb工具并配置变量环境

② 调试语句:

以下语句均在电脑终端输入(“win+R”→输入“cmd”进入);
还需要进入手机的开发者选项,打开无线调试功能!

# 1、无线调试(不需要无线调试的跳过):
adb tcpip 5555(PS:5555是端口号,可以随意地指定)
# 首先要查找到手机的IP地址,比如我的是192.168.0.22,然后执行连接命令:
adb connect 192.168.0.22:5555

# 2、查看是否连接成功(需要保证只有一台设备连接)
adb devices

# 3、调试
adb shell #获取权限

adb shell pm list packages  #查看实体机apk

adb install C:\Users\20483\kivy_share\XXX.apk  #安装apk,后面为apk在电脑上的绝对路径

run-as com.20483.myapp  #驱动程序
# com.20483.myapp = package.domain(= com.20483) + package.name(= myapp)

cd files/app/.kivy/logs   #进入日志文件夹,隐藏文件
ls     #可查看日志名  kivy_xx-xx-xx_0.txt 
cat   kivy_xx-xx-xx_0.txt  #查看日志内容

7、遇到的问题及解决方法:

Q1: 调试时缺包:

A: 在打包前,请务必现在虚拟机上保证程序能够运行(由于是虚拟机,有时候调用摄像头易出错,多尝试几遍)。
在程序能在虚拟机上运行的前提下,如果出现缺包起来,检查 “buildozer.spec”中依赖包是否写入或规范!

Q2: “gradlew failed!”:
[WARNING]: ERROR: /root/Hidden/.buildozer/android/platform/build/dists/sets/gradlew failed!

A:
1、进入 /home/your_user/.gradle/wrapper/dists 文件夹,可以看到gradlew包;
2、进入链接下载对应版本的gradlew包;
3、将2中下载的包,替换原来的gradlew包;
4、重新执行打包命令即可。

Q3 :“failed to run autopoint”:
autoreconf: failed to run autopoint: No such file or directory

A: 在终端执行:

sudo apt install autopoint
Q4 :NDK version conflict in buildozer for Kivy app:
[ERROR]:   Build failed: Please set the environment variable 'LEGACY_NDK' to point to a NDK location with gcc/gfortran support (supported NDK version: 'r21e')

A:
解决方法参考:链接1链接2
1、修改“buildozer.spec”文件中的 android.ndk 选项:

android.ndk = 21e

2、执行:

buildozer -v android debug

3、此时可以发现,在“ /home/wuqx1999/.buildozer/android/platform ”文件中,出现 “ android-ndk-r21e” 文件夹;

4、进入 r21e 下载以下两个压缩包到“packing”文件中:
在这里插入图片描述
5、返回终端,依次执行:

#安装 aarch64-linux-android-4.9
# 使用rm -rf" 命令删除指定目录及其子目录
rm -rf $(ANDROID_NDK_HOME_LEGACY)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/ 
# 使用 "mkdir" 命令创建一个指定目录
mkdir  $(ANDROID_NDK_HOME_LEGACY)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/ 
# 使用 "tar -xf" 命令将指定的 tar 包解压到指定目录
tar -xf $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64) -C $(ANDROID_NDK_HOME_LEGACY)/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/ --strip-components 1 
# 使用 "rm -f" 命令删除指定文件
rm -f $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64) 

#安装arm-linux-androideabi-4.9
rm -rf $(ANDROID_NDK_HOME_LEGACY)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ 
mkdir  $(ANDROID_NDK_HOME_LEGACY)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ 
tar -xf $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM) -C $(ANDROID_NDK_HOME_LEGACY)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ --strip-components 1 
rm -f $(ANDROID_NDK_GFORTRAN_ARCHIVE_ARM)

_其中:

1、ANDROID_NDK_HOME_LEGACY 为 android-ndk-r21e 的文件路径: 
比如我的为:/home/wuqx1999/.buildozer/android/platform/android-ndk-r21e_

2、ANDROID_NDK_GFORTRAN_ARCHIVE_ARM64 = gcc-arm64-linux-x86_64.tar.bz2
(gcc-arm64-linux-x86_64.tar.bz2为下载的第一个压缩包的相对路径)

3、ANDROID_NDK_GFORTRAN_ARCHIVE_ARM = gcc-arm-linux-x86_64.tar.bz2
(gcc-arm-linux-x86_64.tar.bz2为下载的第二个压缩包的相对路径)

6、将1中对 buildozer.spec 的修改注释掉,既改为:

# android.ndk = 21e

7、修改默认使用的NDK:

export LEGACY_NDK=~/.buildozer/android/platform/android-ndk-r21e

8、重新执行打包命令,问题解决:

buildozer -v android debug
Q5 :提示某个包不适用于 arm64框架:

A: 可能是某些第三方包,无法在安卓框架上使用。

四、写在最后:

1、如果嫌麻烦,可使用我搭建的环境:

1.1 .ova下载地址:

链接:链接:https://pan.baidu.com/s/1OyeqhpdxpHiEnlEnfZ9oHw
提取码:avmd

password: 681843242

1.2 ova导入:

① 打开virtualbox,选择“导入虚拟电脑”:
在这里插入图片描述
② 选择下载的.ova文件:
在这里插入图片描述
③ 修改电脑储存位置,点击“完成”,等待导入完成,启动即可。
在这里插入图片描述
1.3 进入主目录中的packing文件,将要打包的文件复制到该文件夹,即可进行打包:
一些打包细节看前面内容。

2、说明:

2.1 由于时间较久,其中一些细节或bug描述可能不够详细,将就看吧。
2.2 欢迎大家多多交流,不喜勿喷。
  • 0
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nightarrogant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值