Androidアプリを開発するときに、LGPLのライブラリを使用したいときの方法です。
方法としては2通り。アプリをLGPLにするか、動的に読み込むようにするか。
※注意:本記事の内容は個人的に調べたものであり、その内容の正確性や安全性を保証するものではありません。本記事の内容を用いて行う一切の行為、被った損害・損失に対しては、一切の責任を負いかねます。
なぜライブラリとして使用する場合に注意する必要があるのか
まず、Androidの場合はなぜ注意する必要があるのかということについて。
LGPLは、それを組み込むアプリおよびライブラリに対して、LGPLでライセンスすることを強制するライセンスです。しかし動的リンクであれば使用しているアプリへLGPLを強制されることはありません。
なので、WindowsやLinuxのアプリケーションであれば利用するだけでいいのですが、Androidはすべてのコードをdexという形式に変換してapkパッケージに収めてしまうので、ライブラリとしてjarをプロジェクトに入れるだけでも、LGPLの規約としてはLGPLを適用しろということになるのですよね。
このあたりについては、以下のリンクが参考になります。
そうではないとする説もありますが、個人的には上のリンク先の見解が正しいと思っています。
(ただ、LGPLでライセンスされたライブラリ側の意図を考えたとしても、Androidのこの挙動による影響は本意ではないとは思います…)
方法1:AndroidアプリをLGPLとする
ストレートかつ王道。
そのアプリをLGPLでライセンスしてしまえば問題は無いですね。
LGPLでライセンスするということはどういうことかというと、利用者にソースコードを公開し、改変、再配布などの許可を与えるということになります。お金はいただいてもいいです。
また、ありがちな誤解としてはソースコードを一般公開しなければならないという懸念ですが、GPL/LGPLのライセンス先は利用者となるので、例えば業務アプリなどで顧客(利用者)が決まっている場合、その相手にだけソースコードを収めればよいのです。
だから、エンドユーザーから請負で開発して納品物にソースコードなどの権利を含めている場合など、実質的に問題ないケースもあると思います。
(ただ、GPL/LGPLのコードを使用していることは伝えておかないと、そのユーザーがそれを他のことに利用しようとしたときにトラブルになるかもしれませんので、そういう点では注意が必要かなとは思います)
この方法が採れるなら、何の問題も無くライブラリをAndroidアプリに組み込むことが出来ます。
方法2:jarファイルを動的に読み込む
ある意味、今回の本題はこれ。
dexにコンパイルされてapkに取り込まれてしまうからライセンスで問題になる、であれば実行時に読み込めば良い。
dllやsoといったダイナミックリンクを行うことが出来れば、LGPLのライブラリとしてある意味正しい使い方ができるというわけです。
その方法がこちら。
ストレージに置いてあるjarをdexに変換して、それをDexClassLoaderで読み込むというもの。
この機構を組み込んだあとは、ストレージにjarファイルを置いて、それを指定して動的に読み込んでやればOKというわけ。
jarからdexは手作業で済ませて、dexファイルを直接置くようにしてもいいかもしれません。(その場合はその手順を示してあればOKかな?)
これなら動作としては、動的リンクとなりますからLGPLライセンスの影響を受けることなく利用することができるはずです。
まわりくどい方法になってしまいますが…この部分をラッピングするクラスを作ってやるなどすれば、使い勝手はそこまで悪くならないかなと…
またこの方法を選んだ場合、ユーザーによるLGPLライブラリ部分の改変、入れ替えは許可しなければなりません。
つまりjarファイルを入れ替えられるようにしないといけないということ。
場合によってはセキュリティホールになるので、そういう面でも注意は必要です。
余談ですが、ここで使用してるdx.jarをプロジェクトに組み込んだとき、
Error:Error converting bytecode to dex:Cause: Dex cannot parse version 52 byte code.This is caused by library dependencies that have been compiled using Java 8 or above.If you are using the 'java' gradle plugin in a library submodule addtargetCompatibility = '1.7'sourceCompatibility = '1.7'to that submodule's build.gradle file.
参考
GNU Lesser General Public License (Wikipedia)
コメント
[…] 次にiOS(iPhone)アプリやAndroidアプリで動的リンクができるかどうかは、Androidの場合は可能そうです。「ユーザーがライブラリを差し替える」ことができればOKのようです。参考5:LGPLのライブラリをライセンスに抵触せずにAndroidアプリへ組み込む方法参考6:LGPLとAndroidのジレンマ参考7:AndroidアプリとLGPLライセンスについて問題ないという解釈のツイート […]