Pythonでandroidアプリをつくるよ〜kivy & buildozer on MacOS

Pythonで使えるGUIライブラリはいろいろあるが、PCでもスマホでも使えるクロスプラットフォームGUIは少ない。Kivyはそんな数少ないクロスプラットフォームGUIの一つである。ただしKivyライブラリを使っても、あくまでpythonプログラムなので、そのままではandroid で実行できない。pythonプログラムからAPKファイル(androidでの実行形式ファイル)を作る必要がある。それをやってくれるのが、Buildozer である。

Kivy & BuildozderはMacPortsでもHomebrewでもインストール可だが、ここでは、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 KitJDK)のインストール

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 をインストールしたらエラーを回避できた。

APKファイルをAndroidに移動

android端末にて

まずはインストールしたいandroid 端末をディベロッパーモードにする必要がある。
[設定] —> [システム]—>[端末情報]
ビルド番号をしばらく連打するとディベロッパーになれる。

続いて、
[端末情報] —> [システム] —> [開発者向けオプション]

開発者向けオプション → ON
USBデバッグ → ON

に設定する。
Macandroid をUSBケーブルでつなぐとUSB使用のポップアップが出るので、 「ファイルを転送」を選択。

Mac にて
$ buildozer android debug deploy run

Android 端末側でアプリの起動が確認できればOK。