將使用Kivy的Python程序打包爲安卓的apk文件(使用python-for-android)

上次嘗試了一下kivy,並且使用Kivy Laucher在安卓手機上成功運行python程序,非常好!又get了一項開發安卓手機端程序的新技能。 但是Kivy Laucher的方式還是不同於安卓手機常用的apk包。如果和其他人分享寫好的程序,Kivy Laucher的方式還是比較麻煩的。

所以,我們來嘗試打包apk!

打包工具

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可安裝的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的說明文檔安裝依賴

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的依賴

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

安裝p4a

pip3 install python-for-android  

安裝Android SDK/NDK

注意SDK/NDK的版本,請安裝推薦的版本,避免出現問題

下載SDK

文件名:		commandlinetools-linux-6514223_latest.zip	
文件大小:	82 MB	
SHA-256: 	ef319a5afdb41822cb1c88d93bc7c23b0af4fc670abca89ff0346ee6688da797

下載NDK

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
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

打包命令

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軟件了。
點擊它,就可以運行。

安裝好的apk
運行結果

結束

基於kivy的python程序apk打包搞定了!過程並不複雜,但是網絡很關鍵。

其實打包的講究還是很多的,具體可以參考官網文檔 https://kivy.org/#support。還有,如果要在應用市場發佈apk,還需要配置權限、加簽名等其他的操作,這些都到需要的時候再研究吧。

以上是我基於具體操作所作的筆記,希望可以幫助到其他人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章