KivyLauncherとSL4A+Py4Aの比較 - Kivy Advent Calendar 2013

さて今回KivyLauncherをいろいろといじってきましたが、2年前はSL4A+Py4Aをいろいろと試していました。

となると、この2つはどう違うのか気になるところかもしれません。

KivyLauncherは、まずSDLOpenGLを組み合わせてマルチメディア環境を作ってからPythonを起動します。まあマルチメディア環境といっても、AndroidのSurfaceViewとSDL関連のクラスをくっつけて、Androidのサービスプログラムとして動くようにしたものです。Unityみたいなゲームエンジンに比べれば貧弱です。でも、最低限フレーム(画面)とサウンドとタッチパネル入力にアクセスできればいいという発想ですので、ライブラリ次第でどのようなUIでも組み立てられます。
起動されたPythonからはAndroidAPIではなく、そのマルチメディア環境にアクセスします。Kivyのライブラリはその上でウィジェットの描画、クロックやタッチイベントの管理を行うことでアニメーションやインタラクションが実現されています。
WindowsMacOSXiOS上のKivyの場合も (実装はDirectXだったりいろいろ違うのですが) 同じマルチメディア環境を作り、その上でウィジェット描画やイベント管理を行うので、ハードウェアの違い(カメラ、GPS、加速度センサ)を避けるという条件であれば、マルチプラットフォームのアプリケーションを作ることが可能なわけです。

SL4Aでのプログラミングのアプローチは、これとは対照的なものになります。
SL4Aから起動されたPythonは、SL4Aを経由してAndroid APIにアクセスして描画やハードウェア操作が利用できる形になっています。SL4AはAndroidと密接に連携していて、描画もAndroid本来のレイアウトエンジンを使うことになります。SL4Aはプログラミング言語としてPythonJrubyPHPなどが使えますが、同じ名前のAPIを呼び出すので、見た目はJavaAndroidプログラミングするのに近い形になります。

マルチプラットフォームを意識するのであればKivyしか選択肢はありませんが、もし「Androidだけで動けばよい」プログラムであればKivyで書くかSL4Aで書くか迷うところかもしれません。
SL4Aは、おそらくAndroidアプリをJavaで開発した経験があれば早く馴染むと思います。またWebViewベースのアプリケーションを作る場合はSL4Aを選択することになります。
一方KivyはこれまでのAndroidプログラミングとは異なる形態なので、Javaによる開発経験がない方が向いていると思います。ゲームプログラミングや組み込みのLinux端末を経験した人は、Kivyの方が馴染むかもしれません。

あと、KivyLauncherとSL4A+Py4Aのすぐに分かる違いとして、Androidアプリのパーミッションがあります。KivyLauncherはUSBストレージ、ネットワーク、Bluetooth程度しか要求していませんが、SL4AはAndroid APIの大半を網羅しているため、連絡帳だのSMSだの通話だの、ありとあらゆるパーミッションを要求しています。
さすがにこんなSL4Aを「インストールしてください」とお客さんにお願いするのは難しいので、最低限のパーミッションでAPKパッケージを作って渡すしかないです。そもそもSL4AがGoogle Playで公開できないのも、このパーミッションが影響していると思います。
一方のKivyLauncherはGoogle Playからインストール可能になっています。まだ試してはいませんが、KivyLauncherでpyjniusを使ってGPS情報を取得するアプリを作ったら、GPS関連のパーミッションをつけるためにビルドし直す必要があるでしょう。