2016年現在の「Python を android で使う」

あえて季節感を出しているのは無論「明日はどうなるかわかりません」からだ。

2016年現在の「Python を android で使う」

この投稿の完成度と今後

書き足りてない。評価も足りてない。検証も不十分。つまりかなり書きかけ。

ので、2016-08-01 に初投稿としてあげるが、必要に応じて追記や更新していく予定。

そもそも後述のとおり、「android の python」に関する情報が現在とても時期的に中途半端なことになっていて、まさに「今」が一番わかりにくいことになってるんじゃないかと思う。(おそらく3年ほど前には少し状況がわかりやすかったんではないかと想像する。) ので、こうして記録しとくだけでもありがたい人はいると思うので、ワタシの情報もまだ中途半端だけど、あげてしまおうと思った。

Python の前に、android の基本

Python を android で動かすための現在の状況を正しく理解するためには、「そもそも android って?」の理解が少しは必要。

とはいえ基本はこうなのだ、てほどにはワタシは詳しくはない。のでざっくり説明する。ちゃんと知りたければこんなものは例えば 初めてのAndroidとかの書籍で学んだほうがいい。この書籍の絵を見せられたら良かったんだけれど、プレビューがないので、まさかスキャナとって公開するわけにゃいかんので、代わりに:

このシステムアーキテクチャ説明の絵でポイントとなるのは 3つ:

  1. ベースは linux
  2. Android Runtime は Java (DALVIK VIRTUAL MACHINE は java 互換実装)
  3. Application Framework, Applications and Widgets は java ベース

すなわち、「正統派 android アプリケーション」は、java で作る。単に java で作る、というだけでなく、アプリケーションとして実行出来るためには、apk という形式のパッケージにまとめあげる必要がある。これが Google Play でインストール出来る形式である、と。

この「正統派 android アプリケーション」を作るには現在のところは Android Studio(コマンドラインツールであれば同じページの「Get just the command line tools」より)を使う。

linux なのだから C/C++ で作ったものも動くのでは? その通り。Android NDKが公式な開発環境。公式でないものもあるようだ。

Python の前に、android の基本(2)

キーボードに関して。この投稿で紹介する SL4A を使うためには「まともなキーボード」が必要。特に Ctrl-C を叩けないとキツい。

ワタシは Hacker’s Keyboard を使っているが、おそらくこれはほとんどの人が選んでいるもの。使いやすい、というか、要は PC のキーボード(ほぼ)そのまま。

本家 CPython の android 対応

ない、と思う。ただ、python ARM cross compiling なんて検索をかけると結構情報ヒットするので、やろうとする人は多いらしい。

オリジナル SL4A について

十中八九、「python android」検索でヒットするのが「古い方のオリジナル SL4A」についての情報である。Scripting Layer for Android (SL4A) と名付けられたそれは、名前の通り、Android で Python 「など」のスクリクプティング環境を提供しようとしたもの。現在 GitHub に実体があるが、もとは Google Code にいた。(うち、python 環境はPy4A python2.7。)

Google Code 側に行くと死んでるのがわかるので、GitHub 側が生きてて安心…なのではなくて、こう説明されてる:

緑色で囲んだ箇所の外に書かれている文からは、おそらく Google Code での開発時点で既に開発はストップしていて、Fork してもらうことを期待して GitHub に引っ越したのだろうと言う事が想像出来る。

SL4A の Fork (android-python27 の Fork)

果たして Fork してメンテンスを続けてくれた人がいる。日本人である。

kuri65536/python-for-android がそれである。

SL4A が「android でのスクリプティングあれこれ」をサポートしようとし、android-python27 がその中のひとつ、だったのに対し、この kurihara さん版は主従が逆のようにみえる。「python に SL4A をバンドル」、としたようにも見える。

もちろんオリジナルの構造は保存されていて、SL4A ももちろん fork してメンテナンスされている。

オリジナル SL4A もこちらの fork 版も、たぶん NDK で CPython をビルド出来るようにしているプロジェクト、なのだと思う。プロジェクトのソースとしてはめぼしいものは makefile などのビルドツールしか管理されていないようだ。

2016年7月時点で https://github.com/kuri65536/sl4a に載っている QR コード経由でインストールする(あるいはページの apk リンクをダウンロードしてインストールする)と、割と新しい CPython 2.7.10 がインストールされた。

SL4A 版 python のノリは、「素の本物の CPython + android API へのファサード」というものになっていて、これを入れるだけで出来ることは「素の CPython で出来ること + ファサードで提供されている android 的なこと少し」という具合。

android ファサードでの使用例はここにある通りで例えば:

1 import android
2 
3 droid = android.Android()
4 droid.makeToast("Hello, Android!")

という具合なのだが、この android モジュールのドキュメントはないに等しい。親の SL4A ドキュメントを見るしかない。たとえば Text To Speech のサンプルをインターネットから漁ってくるとこんな書き方で見つかる:

1 import android
2 
3 droid = android.Android()
4 droid.speak("Hello, Android!")

が、これが動かないので SL4A ドキュメントをみると

1 import android
2 
3 droid = android.Android()
4 droid.ttsSpeak("Hello, Android!")

が正解、とわかる、という具合。

kuri65536/python-for-androidでサードパーティライブラリを使うことは標準 Python と同じノリでこれ用の site-packages にインストール出来れば出来る。動くかどうかは別問題だけれども。(Python 2.7 のあるバージョンから pip が標準添付になっているので、pip でインストール、出来るものは出来る、のではないかという気はするが試してない。)

site-packages の場所は… sys.path をダンプしてみればわかる。root 権限不要な場所としては

/sdcard/com.googlecode.pythonforandroid/extras/python

ではないかと思う。pip とかに頼らず(or 頼れず)放り込めばいい、てことなら、ここに置けばいいんじゃないだろうか、たぶん。

一応「プレビルド版」がいくつか置かれているが、-py2.6.egg が平然と置かれているのをみるに、保守がうまくいっていないんではないかとは思う。android 実機の UI から「Modules」で飛ばされるのもここだが、現時点ではあまり期待しない方がいいような気もする。(情報によれば twisted は動いてるようなので、動くは動くのだろうが。)

評価、については…ワタシはほとんどサワリしか使ってないのでその資格はない。数日遊んでみた印象としては:

  • 迷子になる UI が凄くいやだ。かなり慣れが必要。
  • background 実行 (歯車アイコンでの実行)の止め方がわかりません…。
  • ちょっとしたバッチ的な処理をするにはきっと十分。
  • 十分とはいえないにせよ標準的なサードパーティライブラリのインストール手段があるのは吉。

という具合。探ってて後述の kivyLauncher を見つけてしまったので、今は触ってない。

SL4A ではそもそも python だけでなく bash が使えるのが面白い。python はともかく bash のために SL4A、てのは考え方としてはありかもしれない。

QPython

QPythonは、はっきりと SL4A から Fork したとは言っていないようにも思うが、GitHub をみるに、やはり SL4A 由来のようだ。

数日前にはインストールできたはずなのに、今 Google Play からインストール出来ない。kurihara さん版とその元の SL4A より使い勝手が良さそうだったのだが…。

これを一度アンインストールしたのは、まずは kivyLauncher を知ったからというのもあるが、サンプルがうまく動かなかったことも理由。kivyLauncher と違い、また SL4A 同様「素の Python とほとんど同じ知識で使える」点は良いと思った。

とにかく現状これの評価が出来ない状態にある。「QPyPi」なんてのがいて、結構色んなライブラリ使えるのが確実にメリット、だったんだけどなぁ。

2016-08-02 07:35 追記:
issue 116より判明。Google Drive で公開されておる。じかにダウンロードすればインストール出来る。

評価検証は時間が出来たら…。

kivyファミリ

まず、kivy ってのは

kivy そのものは「android 用 python」ではない

似たもので何を思い出してもらえればいいかといえば、たとえば KDE とか Qt だろうか。クロスプラットフォームのウィンドウツールキット、的なものなのだが、スマホ・タブレット・html5 時代向けである。トップページでこう言ってる:

Kivy – Open source Python library for rapid development of applications
that make use of innovative user interfaces, such as multi-touch apps.

Windows でも iOS でも動く。無論デバイス固有のものもあるので、android で動くが Windows で動かないものは作れる。(対応表としては plyer のドキュメントがおよそ動作可否を表現出来ているんじゃないかと思う。)

kivy と android、の関係で重要な kivy ファミリのサブプロジェクトが以下:

  • Plyer: a platform-independent api to use features commonly found on various platforms, notably mobile ones
  • Pyjnius: a Python module to access Java class as Python class, using JNI.
  • Python for Android: Access Android specific functionality

python for android という名前が乱立していて悩ましいのだが、kivy のそれは、「Android で動作する Python アプリケーションを構築する開発環境」である。つまり android 機で実際に動作させるアプリケーションではない:

python-for-android is a packager for Python apps on Android. You can create your own Python distribution including the modules and dependencies you want, and bundle it in an APK along with your own code.

Android SDK, NDK が当然必要で、また、それ以前に JDK 7.0 以上が必要。これでは大変なので、ということであるのが buildozer、かな? kivy の download エリアの一番下から Virtual Machine のダウンロードが出来る。Ubuntu に必要環境を放り込んだイメージ、らしい。ワタシはダウンロードだけしてまだ試してない状態。とにかくこれさえあれば、やりたい「オレオレ拡張」は出来るはずである。

kivyLauncher

Python for Android あるいは buildozer を Android SDK の Python 版、的な理解をするとすれば、当然「スクリプティングなんだからカジュアルに」なノリにはまったくそぐわないわけである。サクっと作ってサクっと動かせなけりゃぁあえて Python の意味がない。

kivyLauncher はまさにそのためのもの。「kivyアプリケーションとして、ただしほんの少しだけ独自流儀に従うだけで、Python スクリプトを放り込むだけで動く」。kivyLauncher そのものはまさに Python for Android アプリケーションになっていて、kivy アプリケーションスクリプトが動作するように必要なものがバンドルされた特殊な Python 環境。

したいことが全て出来る、ためには Python for Android あるいは buildozer が必要になることはあるように思う。というのも、kivyLauncher はサードパーティライブラリを追加する標準の手段がない。

「kivy アプリケーションとして作る必要がある」点だけ許容出来るなら、今のところ少なくともワタシにとっては最善の android 用 Python。特に PlyerPyjnius がセットなのがパワフルで、これのおかげで android API で出来ることはおそらく全て出来ると思っていい。「kivy アプリケーションとして作る必要がある」というのはつまりまがりなりでも GUI として作らなければ何も出来ない、ということ。けれど、「スマホで使う」ためにはむしろその方がいい。コンソールへの入力はスマホではあまりにキツい。出来ないことはないがストレスがたまってしょうがない。(タブレットだと印象だいぶ違うだろうが。)

不満がないかといえばもちろんある。/sdcard/kivy のフォルダにアプリケーションフォルダを配置するのだが、たくさん置いて行くとすぐに使いにくくなるが、階層管理とかは出来ない。site-packages のような標準的な「サードパーティライブラリ置き場」やその手段がないのもイヤラシイ。これら制限が耐えられなくなってきたら buildozer に手を出してみようと思う。