上次尝试了一下kivy,并且使用Kivy Laucher在安卓手机上成功运行python程序,非常好!又get了一项开发安卓手机端程序的新技能。 但是Kivy Laucher的方式还是不同于安卓手机常用的apk包。如果和其他人分享写好的程序,Kivy Laucher的方式还是比较麻烦的。

所以,我们来尝试打包apk!

目录

  • 打包工具
    • p4a
    • WSL
  • 配置环境
    • WSL的配置
    • 安装各种依赖和包
      • 根据buildozer的说明文档安装依赖
      • 安装p4a的依赖
    • 安装p4a
    • 安装Android SDK/NDK
      • 下载SDK
      • 下载NDK
      • 安装SDK/NDK
        • 解压
      • 部署cmdline-tools
        • 添加环境变量
        • 下载安装API platform和build-tools
  • 打包过程
    • 新建一个hello world项目
    • 打包命令
    • 打包过程可能遇到的问题
  • 测试
  • 结束

打包工具

Kivy官方推荐使用Buildozer来打包,说什么可以自动化打包过程。然而我试了一下,发现安装各种依赖的过程非常的痛苦,虽然是自动下载的,但是因为网络环境的问题,非常的不顺畅。且每次新建一个项目后,打包过程会重复下载很多依赖,这一点让我非常的不理解。如果下载依赖的过程很快也就罢了,无奈每次下载过程都很慢,且会发生问题。
所以我又尝试了 python-for-android (以下简称p4a)。
关于打包apk的官方文档: https://kivy.org/doc/stable/guide/packaging-android.html

p4a

其实p4a也是Kivy官方推荐的打包方式,虽然需要些手工活,但是其实过程也并不复杂。 而且,(似乎)Buildozer也是基于p4a的。

WSL

WSL是Windows Subsystem for Linux,就是Windows下的Linux子系统,比较新版的Win10都可以安装。因为打包需要Linux环境,所以可以用虚拟机安装一个Linux系统。但是因为虚拟机有些笨重,而且安装虚拟机和一个新的Linux系统也有些麻烦,所以WSL成为一个非常好的选择。 安装方便,卸载方便,而且WSL和Windows主系统共享一个文件系统,拷贝文件也非常方便。

需要注意的是,我下面用的是WSL,而不是WSL 2。 WSL和WSL 2不是一个东西。

安装WSL的方法就不多说了,网上的介绍非常的多。WSL可安装的Linux有几个版本,我们这里使用Ubuntu。就目前来说,安装好的Ubuntu版本代号应该是Focal。 我用uname查看的信息如下:

$ uname -a
Linux DESKTOP-MY 4.4.0-18362-Microsoft #836-Microsoft Mon May 05 16:04:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux

配置环境

WSL的配置

首先更改apt源为国内源

cd ~
mkdir bak
cp /etc/apt/sources.list ~/bak/
sudo vi /etc/apt/sources.list

将文件更改为如下内容

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

更新系统

sudo apt-get update
sudo apt-get upgrade

安装各种依赖和包

根据buildozer的说明文档安装依赖

  • 根据如下网页安装一些buildozer的依赖,buildozer基于p4a,我觉得(猜)buildozer的依赖p4a也应该用得到
    https://buildozer.readthedocs.io/en/latest/installation.html#targeting-android
sudo apt-get update
sudo apt-get install git zip unzip openjdk-8-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
  • 设置python3-pip的国内源
mkdir ~/.pip
vi ~/.pip/pip.conf

编辑文件内容如下

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
  • 安装 Cython,注意版本,貌似p4a依赖特定版本
pip3 install --user --upgrade Cython==0.29.19 virtualenv  # the --user should be removed if you do this in a venv

安装p4a的依赖

  • 根据如下网页,安装p4a的依赖
    https://python-for-android.readthedocs.io/en/latest/quickstart/
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install build-essential ccache git zlib1g-dev python3 python3-dev libncurses5:i386 libstdc++6:i386 zlib1g:i386 openjdk-8-jdk unzip ant ccache autoconf libtool libssl-dev

上面的命令如果出现Package ... is not configured yet.的报错,解决方法如下:

sudo mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
sudo mkdir /var/lib/dpkg/info/
sudo apt-get update
sudo apt-get -f install

没有报错之后,再执行如下命令

sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old/
sudo rm -rf /var/lib/dpkg/info
sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info
sudo apt-get update

安装p4a

pip3 install python-for-android

安装Android SDK/NDK

注意SDK/NDK的版本,请安装推荐的版本,避免出现问题

下载SDK

  • 在下列网页下载Android-SDK,放置于c:\p4a文件夹
    https://developer.android.google.cn/studio?hl=zh-cn#downloads
    也可以直接点击下面的下载链接
    https://dl.google.com/android/repository/commandlinetools-linux-6514223_latest.zip?hl=zh-cn
文件名:      commandlinetools-linux-6514223_latest.zip
文件大小:    82 MB
SHA-256:    ef319a5afdb41822cb1c88d93bc7c23b0af4fc670abca89ff0346ee6688da797

下载NDK

  • 下载Android-NDK,放置于c:\p4a文件夹,官方要求版本r19b。下面这个NDK的下载网页没有这个版本,可以直接点击之后的r19b版本的下载链接
    只有r19c: https://developer.android.google.cn/ndk/downloads/older_releases?hl=zh-cn

r19b下载链接: https://dl.google.com/android/repository/android-ndk-r19b-linux-x86_64.zip?hl=zh_cn

SHA-1: 16F62346AB47F7125A0E977DCC08F54881F8A3D7

安装SDK/NDK

解压
mkdir ~/androidsdk
cd ~/androidsdk
unzip /mnt/c/p4a/commandlinetools-linux-6514223_latest.zip  mkdir ~/Android
cd ~/Android
mkdir SDK
unzip /mnt/c/p4a/android-ndk-r19b-linux-x86_64.zip

部署cmdline-tools

运行如下命令(注意第二行里的$HOME,这里不可以使用“~”符号)

cd ~/androidsdk/tools/bin/
./sdkmanager --sdk_root=$HOME/Android/SDK "cmdline-tools;latest"

输入y回车,接受许可协议

添加环境变量

修改.bashrc

vi ~/.bashrc

在文件末尾添加如下内容

export ANDROID_SDK_ROOT="$HOME/Android/SDK"
export PATH=$PATH:~/.local/bin/:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/:$ANDROID_SDK_ROOT/tools/:$ANDROID_SDK_ROOT/platform-tools/export ANDROIDSDK="$HOME/Android/SDK"
export ANDROIDNDK="$HOME/Android/android-ndk-r19b"
export ANDROIDAPI="27"  # Target API version of your application
export NDKAPI="21"      # Minimum supported API version of your application

现在可以删除之前zip文件解压缩的sdk文件夹

cd ~
rm -rf ~/androidsdk/

Ctrl+D关闭窗口,然后再次打开Ubuntu

下载安装API platform和build-tools
  • 根据 https://python-for-android.readthedocs.io/en/latest/quickstart/
    安装 API platform,推荐的API level是27。
sdkmanager "platforms;android-27"

注意:这里不需要用--sdk_root=...参数了。

  • 安装build-tools
sdkmanager "build-tools;28.0.2"

不过Buildozer推荐安装的是build-tools;29.0.0,所以也可以安装29.0.0版本

sdkmanager "build-tools;29.0.0"

如下也可以列举所有可以安装的build-tools的版本

sdkmanager --list | grep build-tools

可以看到最新版的是"build-tools;30.0.0"

打包过程

新建一个hello world项目

$ mkdir ~/helloworld
$ cp /mnt/c/p4a/helloworld/* ~/helloworld/
$ ls -l ~/helloworld/
total 3640
-rwxrwxrwx 1 zz zz 3725920 Jun 13 10:31 DroidSansFallback.ttf
-rwxrwxrwx 1 zz zz      77 Jun 13 10:31 hello.kv
-rwxrwxrwx 1 zz zz     359 Jun 13 10:31 main.py

打包命令

$ cd ~/helloworld
$ p4a apk --private $HOME/helloworld --package=org.example.hello --name "Hello World" --version 0.1 --bootstrap=sdl2 --requirements=python3,kivy

打包命令就不多解释了,请参考官方的文档。需要注意的是--private $HOME/helloworld是为了指定项目所在的文件夹。

打包过程可能遇到的问题

第一次运行打包命令会自动下载很多包和依赖,要耐心等待。

整个过程对网络要求也很高,对于大部分人来说,大概率会出现下载不了的情况。
如果出现下载慢或者下载不了的情况,可以手动下载。例如下载hostpython3的时候出现如下提示:

[INFO]:    Downloading hostpython3
[INFO]:    -> running mkdir -p /home/zz/.local/share/python-for-android/packages/hostpython3
[INFO]:    -> directory context /home/zz/.local/share/python-for-android/packages/hostpython3
[INFO]:    -> running basename https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
[INFO]:    -> running rm Python-3.8.1.tgz
[INFO]:    -> running rm -f .mark-Python-3.8.1.tgz
[INFO]:    Downloading hostpython3 from https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz

随后出现了下载中断,或者下载速度很慢,我们可以Ctrl+C中断下载,使用其他办法下载如下软件包,并保存于c:\p4a
https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
然后将下载的文件拷贝到对应的文件夹内(注意对应上面的一堆[INFO]信息)

touch /home/zz/.local/share/python-for-android/packages/hostpython3/.mark-Python-3.8.1.tgz
cp /mnt/c/Users/zz/Desktop/Python-3.8.1.tgz /home/zz/.local/share/python-for-android/packages/hostpython3/

随后再次运行打包命令,就会自动跳过下载hostpython3,继续后面的过程了。

你可能需要针对几个文件的下载反复操作类似上面的命令。或者采用科学的上网方法以避免网络问题。

打包过程我也注意到出现了其他的错误提示,不过都并没有中断而继续了,所以就没有在意。不知后面有没有其他问题。

经过一番波折以后,当返回命令提示符时,在运行打包命令的当前目录下应该已经生成了一个apk文件。

$ ls -l *.apk
-rw-rw-rw- 1 zz zz 14887306 Jun 13 13:15 unnamed_dist_1__armeabi-v7a-debug-0.1-.apk

还有一个好消息是,一次打包后,以后再给别的项目打包就不用再次下载那么多依赖了。

测试

在我的电脑上,用Windows资源管理器访问
C:\Users\zz\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\zz
可以看到apk文件,你的目录位置也许不同,不过搜索apk的文件名总是可以找到相应位置的。

拷贝那个apk文件到手机里,运行,安装……就可以在手机屏幕上看到安装好的Hello World软件了。
点击它,就可以运行。


结束

基于kivy的python程序apk打包搞定了!过程并不复杂,但是网络很关键。

其实打包的讲究还是很多的,具体可以参考官网文档 https://kivy.org/#support。还有,如果要在应用市场发布apk,还需要配置权限、加签名等其他的操作,这些都到需要的时候再研究吧。

以上是我基于具体操作所作的笔记,希望可以帮助到其他人。

将使用Kivy的Python程序打包为安卓的apk文件(使用python-for-android)相关推荐

  1. python程序打包成安卓app教程_Python打包方法基本应用方式介绍

    Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言,对于经验丰富的开发人员来说,掌握这样一款语言在其程序开发中是一个比较重要的选择.我们今天就先来了解一下python打包方法的相关 ...

  2. python程序打包成安卓app教程_Python zipapp打包教程(超级详细)

    经过复杂的开发.调试之后,终于得到一个 Python 程序,这个程序或许精巧,或许有些古拙,但它是我们心血的结晶,我们当然希望将这个程序发布出来. Python 提供了一个 zipapp 模块,通过该 ...

  3. Python:将python程序打包为apk文件

    1.概述 Kivy是一套Python下的跨平台开源应用开发框架官网我们可以用 它来将Python程序打包为安卓的apk安装文件.以下是在windows环境中使用. 安装和配置的过程中会下载很多东西,确 ...

  4. Pyinstaller将Python程序打包成EXE(多种模式的打包)

    Pyinstaller将Python程序打包成EXE 文章目录 Pyinstaller将Python程序打包成EXE 安装 安装 pip install pyinstaller 博文已经迁移到个人主页 ...

  5. 本文一步一步地教你如何将Python程序打包成exe文件—赶紧进来学习吧

    [先来看看几个问题] 一.什么是exe可执行文件? exe文件英文全名是executable file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为.exe的是其中的一种 ...

  6. 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)

    目录 打包前置知识 一.什么是exe可执行文件? 二.为什么要将 Python 程序打包为 exe 可执行文件? 三.为什么 Python 程序不能直接运行呢? 四.我们用什么来打包 Python 文 ...

  7. python程序打包成exe可执行文件,亲测可行(pyinstaller教程)

    python程序打包成exe可执行文件,亲测可行(pyinstaller教程)(11-20190214) 文章目录: 有些程序你不想让别人看到,由此程序你想做成绿色软件普惠大众,有些..., 然而你只 ...

  8. Python 程序打包 -- 使用pyinstaller

    Python 程序打包 – 使用pyinstaller 1.安装 pyinstaller pip 安装:打开cmd输入 pip3 install pyinstaller 2.cmd 使用 pyinst ...

  9. python程序打包为exe可执行文件

    大家都知道,Python是一种脚本语言,也就是解释型的语言,需要解释器来进行解释以后才可以执行,而Python源代码需要在Python虚拟机上面运行,但是我们做好的程序,不可能给用户使用的时候还让他安 ...

  10. pyqt打包成linux可执行程序,PyQtopencv图像处理(5):python程序打包成可执行文件...

    让我们稍微休息一下,来把我们目前写好的小程序打包成.exe文件. python程序打包有一些方法,py2exe和pyinstaller.其中py2exe的安装比较方便,但是打包起来比较麻烦:而pyin ...

最新文章

  1. 舵机控制器STC8G1K
  2. 计算机控制zos,第二章zOS操作系统的功能概述2.1zOS的内存管理.PDF
  3. 信息系统项目管理师需要准备多久?备考技巧分享
  4. wxWidgets:wxStatusBar类用法
  5. 第五章 云原生与容器技术
  6. angular 使用rxjs 监听同级兄弟组件数据变化
  7. 用numpy,matplotlib库画笛卡尔爱心曲线
  8. SAP web 开发 (第二篇 bsp 开发 mvc模式 Part2 )
  9. 2021快手服饰行业数据价值报告
  10. python程序实现excel排序_python初学—-实现excel里面读数据进行排序(改进算法)
  11. 全球呼吸机告急!医疗科技巨头美敦力“开源”设计图和源代码
  12. 暴力破解附近局域网WiFi密码
  13. 创业不难,找准项目才难,教你一眼识破好项目
  14. Java Logging之JUL系列——Handler
  15. Java程序员该如何准备明年的「金三银四」跳槽季,你准备好了吗?
  16. 2015校园招聘联通笔试的几个题目
  17. js 手机号码和电话号码(座机号)正则校验
  18. 什么样的笔记本适合编程?
  19. 【AUTOSAR】【CAN通信】CanTp
  20. 南部一名女子欲跳江轻生,已经被成功营救

热门文章

  1. int i=-20; unsigned int j = 10; i+j;的问题
  2. 启动root用户 银河麒麟_银河麒麟V10启用VNCServer
  3. vijos 1641 Vs Snowy
  4. 2019 杭电多校第6场 HDU - 6638 Snowy Smile 线段树 最大子段和
  5. arcgis快速生成图框_arcgis图框的制作
  6. 手脱ASPack v2.12
  7. 如何用纯 CSS 创作一个永动的牛顿摆
  8. windows事件查看器
  9. c++11新特性介绍
  10. 这是我见过最好的唐诗,而且通俗易懂2