LGPLとAndroid その2

先日のLGPLとAndroidを書いて以来、悶々としている。要するにプロプライエタリなアプリでAndEngineを使いたいのだが、かのライブラリはLGPLなのだ。AndEngine作者のNicolasさんはblogでソース公開はしなくていいと表明しているが、このエントリのコメントにもあるように、作者の表明とライセンスの意味するところは別ではあるので、白黒つけた確証が欲しかった。
で、先日からさらに調べて、現時点での素人解釈としては、LGPLライブラリをプロプライエタリAndroidアプリにリンクするのは「クロ」だ。なぜクロかと言えば、Androidの.apkファイルの仕組み上、LGPLの求める条件を満たすことができないから。とはいえ、私はGPLの解釈は素人なので、誰か詳しい人のご意見お待ちしております。

Androidのビルドのしくみ

  • Android SDKは、ビルドプロセスの過程で、Javaの.classファイルをAndroid用のバイトコード形式(.dx)に変換し、classes.dexというファイルにまとめる。
  • classes.dexは、1)自分の書いたプログラムと、2)利用するライブラリが混じった形で一つのファイルにまとまっている。
  • Androidの.apkファイルの中には、こうやって作られたclasses.dexと画像等のリソースファイルが入っている。
  • .apkファイルの中には、利用するライブラリの.jarファイルは含まれない。.jarに含まれていた.classファイルも、バイトコード変換されており、そのままの形では含まれていない。

つまり、.apkに含まれるclasses.dexファイルは、かなり静的リンクに近い性質を持っている。前回のエントリにあるように、LGPLライブラリをimportするJavaアプリを配布する際は、ライセンスにおいてLGPLライブラリ部分の改変を許可する必要があるが、このビルドの仕組みだと、ライブラリの差し替えはかなり困難だ。


強引な解釈として、以下のような考え方もあると思うのだが、これを受託案件で強弁できるかと言えば、できんわな。

  • .apkファイルは普通のZIPで開ける
  • .dexファイルはbakamaliを使えば、クラス単位で分割できる
  • 分割したクラスを差し替えれば、LGPLで求めている"allow users to modify the library"ができるではないか
  • ただそのためにはリバースエンジニアリングが必要なので、それはLGPLが求める通りに許可しましょう。

ようやくLGPLを読んでみた

ここまできてようやくLGPL 2.1を読んでみた(読んでなかったんか!!)。と、6-(b)にこんな言葉があるではないか。

6. b)『ライブラリ』とのリンクに適切な共有ライブラリ機構を用いる。適切な機構とは (1) ライブラリの関数を実行形式にコピーするのではなく、実行時にすでにユーザのコンピュータシステム上 に存在するライブラリのコピーを利用し、そして (2) ユーザがライブラリの修正版をインストールした場合でも、そのような修正版が著作物が作られた版とインターフェース的に互換である限り、修正版のライブラリで も適切に動作するようになっているものである。

GNU 劣等一般公衆利用許諾契約書 - GNU プロジェクト - フリーソフトウェア財団 (FSF)

つまり、先日私が読んでいた、The LGPL and Javaは、前提として、「ファイルシステム上の.jarを使う」という条件があり、その上でライブラリの差し替えを認めなさいね、ということだったのだ。上述の通り、Androidの場合はライブラリをバラバラにした上で、独自の実行形式に変換後、classes.dexの中にコピーしているわけで、たとえ差し替えが技術的に可能だとしても、LGPLの条件を満たしているわけではなかった。

というわけで、AndroidアプリでLGPLなライブラリを使った場合、アプリ本体もGPLの影響を免れない、という結論になりました。

どうしてもLGPL/GPLなライブラリを使いたかったらどうするか

どうしてもLGPL/GPLなライブラリを使いたい場合は、LGPL/GPL部分を別アプリとして分割し、使いたい機能をインテントとして実装しておけばいいと思う。こうすれば公開すべき範囲はLGPL/GPLを含むアプリ側だけに限定できる。昔のNetscape Navigatorが、Emacsのmovemail.cを使っていたときの方法と同じことですね。

ただ、AndEngineみたいにアプリと密結合して動くライブラリの場合、インテントとして実装するというのは現実的な解ではないなあ… というわけでAndEngineよ、さようなら。ライセンスが変わったら是非使いたいです。受託の宿命ながら、惜しいなあ…

追記

AndEngineのライセンスについては、AndEngineのフォーラムでも話題が出ている。
Source Code released! - AndEngine Forums