Pythonでandroidアプリをつくるよ〜kivy & buildozer on MacOS
Pythonで使えるGUIライブラリはいろいろあるが、PCでもスマホでも使えるクロスプラットフォームなGUIは少ない。Kivyはそんな数少ないクロスプラットフォームGUIの一つである。ただしKivyライブラリを使っても、あくまでpythonプログラムなので、そのままではandroid で実行できない。pythonプログラムからAPKファイル(androidでの実行形式ファイル)を作る必要がある。それをやってくれるのが、Buildozer である。
Kivy & BuildozderはMacPortsでもHomebrewでもインストール可だが、ここでは、Macports を使ってのインストールを説明する。
作動確認したマシーンは以下の通り
- Mac Pro (Mid 2010) macOS Sierra (Homebrew)
- MacBook Pro (2018) macOS High Sierra 10.13.6 (Macports, Homebrew)
- MacBook Air (Early 2014) macOS Mojave 10.14.2 (Macports)
Python のインストール
KivyをPC上で使うだけなら、pythonのバージョンはどれでも構わないが、buildozerを使ってapk ファイルを作るときにエラーが出るので、pythonのマイナーバージョンまで注意すべし。
動作確認したバージョン
可 | 不可 | |
Macports | Python3.6.7 | Python3.7.1(現時点のmacportsでの安定版の最新) |
Homebrew | Python3.7.2, 3.7.0 |
--- Python3.7.1がダメなのか?!
portコマンドでpythonとpipをインストール
$ sudo port install python36 $ sudo port select --set python python36 $ sudo port install pip-36 $ sudo port select --set pip pip-36
/opt/local/bin および /opt/local/Library/Frameworks/Python.framework/Versions/3.6/bin にパスを通すのを忘れずに。
Kivy のインストール
Kivyのインストール
Kivyおよび依存関係のあるツールをインストール。
$ sudo port install libsdl2 libsdl2_image libsdl2_ttf libsdl2_mixer $ sudo pip install -I Cython==0.29.2 $ sudo pip kivy
kivyのバージョンによって、不適合なcythonのバージョンがある。今の場合、kivy-1.10.1がインストールされたが、Cython-0.29.2で問題ないことは確認した。
Kivyの動作確認
サンプルとして、“Hello World”と表示させるプログラムを書く。
from kivy.app import App from kivy.uix.label import Label class HelloApp(App): def build(self): return Label(text='Hello World') if __name__ == '__main__': HelloApp().run()
main.py という名前で保存。(buildozerを使うときは必ずmain.pyにすべし)
$ python main.py
新しくwindow が現れて“Hello World”と表示されればOK。
Buildozer のインストール
Buildozer本体のインストール
$ sudo pip install buildozer
これでBuildozer-0.37がインストールされるが、実はこのバージョン、バグがあるので、開発版にアップグレードする。
$ sudo pip install git+http://github.com/kivy/buildozer
Buildozer-0.38.dev0がインストールされる。Buildozerを正常に作動させるには他にもいくつかのツールのインストールが必要。
CrystaX NDKのインストール
あとでbuidozer起動する時に、デフォルトではGoogleのNDKを勝手にやってくれるのだが、GoogleのNDKだと途中でエラーが出る。代わりに、CrystaX NDKを使う。https://www.crystax.net/en/downloadから crystax-ndk-10.3.2-darwin-x86_64.tar.xz をダウンロード。
$ xz -dc crystax-ndk-10.3.2-darwin-x86_64.tar.xz | tar xvf -
で解凍。crystax-ndk-10.3.2 ディレクトリ内に展開される。
Java Development Kit(JDK)のインストール
JDKの最新版はバージョン11だが、buildozer はバージョン8しか対応していないことに注意。
$/usr/libexec/java_home -V
で現在インストールされているJDKのリストと、アクティヴになっているバージョンを表示される。
Matching Java Virtual Machines (5): 11.0.1, x86_64: "Java SE 11.0.1" /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home 1.8.0_192, x86_64: "OpenJDK 8" /Library/Java/JavaVirtualMachines/openjdk8/Contents/Home 1.8.0_191, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home 1.6.0_65-b14-468, x86_64: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 1.6.0_65-b14-468, i386: "Java SE 6" /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
最後の行がアクティヴになっているバージョンのHome。この場合、バージョン11がアクティヴになっている。”OpenJDK 8“ か”Java SE 8”のどちらかをアクティブにすべし。あとで、buildozer を作動する際に
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk8/Contents/Home
のように一時的に環境変数を変えると良い。
もし、リストに"OpenJDK 8”も"Java SE 8”がなかったら、
$ sudo port install openjdk8
で"OpenJDK 8”をインストールできる。
Buildozer 起動
Buildozerの設定ファイル
作業ディレクトリ(ここでは“Hello”とする)を作って、そこにmain.py (あれば、他の関連プログラムファイルも) を置く。
$ cd Hello $ buildozer init
とすると、作業ディレクトリ内に”buildozer.spec”というファイルができる。 buildozer.specは、以下の部分を書き換える。
# (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy requirements = python3crystax==3.6,kivy # (int) Android API to use android.api = 27 # (int) Minimum API required android.minapi = 21 # (int) Android SDK version to use android.sdk = 24 # (str) Android NDK directory (if empty, it will be automatically downloaded.) android.ndk_path = (crstax-ndkディレクトリのパス)/crystax-ndk-10.3.2/ # (str) python-for-android branch to use, defaults to stable p4a.branch = master # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) log_level = 2
Buildozer でAPKファイルを作る
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk8/Contents/Home $ buildozer android debug
成功すると
# Android packaging done! # APK myapp-0.1-debug.apk available in the bin directory
と表示され、作業ディレクトリ中のbin ディレクトリにmyapp-0.1-debug.apkが作られている(アプリ名とバージョンはbuildorzer.spec内で設定されている)。基本的にはこれだけでOKのはずだが、初めて起動されるときは、環境によってはツールが足りなくてエラーがでる。
例えば、
pkg_resources.DistributionNotFound: The ’sh’ distribution was not found and is required by buildozer
というエラーメッセージが出たら、
$ sudo pip install sh
でshライブラリをインストールすれば良い。
OSError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
ってエラーが出ることも。このときは
$ sudo port install curl
で curl をインストールしたらエラーを回避できた。