上次嘗試了一下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的說明文檔安裝依賴
- 根據如下網頁安裝一些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
安裝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
打包命令
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,還需要配置權限、加簽名等其他的操作,這些都到需要的時候再研究吧。
以上是我基於具體操作所作的筆記,希望可以幫助到其他人。