クローズドソースアプリから、GPLソフトを使うには <ul><li>長部 敏 </li></ul>twitter : @andropenguin gmail  :   [email_address] 主な活動地域: 日本Android会埼玉支部...
GPLライセンスとは <ul><li>GNU General Public Licenseの略
コピーレフトのソフトウェアライセンスの一種
コピーレフトとは:著作権に対する考え方で、著作権を保持したまま、二次的著作物も含めて、すべての者が著作物を利用・再配布・改変できなければいけないという考え方
つまり、二次的著作物の頒布条件を同一のライセンスに限るということ
ソースコード公開の義務がある
->二次的著作物もソースコード公開義務あり </li></ul>
GPLソフトの例 <ul><li>Linuxカーネル
LinuxデスクトップGnomeのアプリ
Linuxのコマンドの多く(bash、lftpなど) </li></ul>
Androidアプリを開発する際のGPLの問題点 <ul><li>GPLソフトを使ってAndroidアプリを開発したら、そのアプリを同じライセンスGPLで公開する必要がある -> ソースコード要公開
つまり、Androidアプリのソースコードをクローズドにできないので、有料アプリにしづらい </li></ul>
GPLの問題点を回避するには <ul><li>プロセス間通信を使用する
GNU FAQから
「単なる集積」と「二つのモジュールを一つのプログラムに結合すること」の違いは何ですか?
パイプやソケット、コマンドライン引数は通常二つの分離したプログラムの間で使われるコミュニケーションメカニズムです。ですからそれらがコミュニケーションのために使われるときには、モジュールは通常別々のプログラムです。
-> ソケットやパイプはプロセス間通信。
余談  : Android アプリ内部でコマンドラインのコマンドを呼ぶ方法 ( コマンドライン引数の方法 ) も可能であるそうだが、 Android OS やコマンドのクロスコンパイル必要で、アプリ作成が面倒。 </li></ul>
AndroidでGPLソフトを使用するには <ul><li>GPLソフトをライブラリ化して、JNI(Java Native Interface)を用いて、販売したい(クローズドソース)アプリとは別パッケージにして、サービスアプリを作る。販売した...
販売したいアプリからサービスアプリを利用するには、サービスのバインドを使用する。(プロセス間通信の一種)。AIDLの使用。
Upcoming SlideShare
Loading in …5
×

How to use GPL software in closed source Android application

1,760 views

Published on

How to use GPL software in closed source Android application.

Published in: Technology, Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,760
On SlideShare
0
From Embeds
0
Number of Embeds
37
Actions
Shares
0
Downloads
7
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

How to use GPL software in closed source Android application

  1. 1. クローズドソースアプリから、GPLソフトを使うには <ul><li>長部 敏 </li></ul>twitter : @andropenguin gmail : [email_address] 主な活動地域: 日本Android会埼玉支部、多摩支部
  2. 2. GPLライセンスとは <ul><li>GNU General Public Licenseの略
  3. 3. コピーレフトのソフトウェアライセンスの一種
  4. 4. コピーレフトとは:著作権に対する考え方で、著作権を保持したまま、二次的著作物も含めて、すべての者が著作物を利用・再配布・改変できなければいけないという考え方
  5. 5. つまり、二次的著作物の頒布条件を同一のライセンスに限るということ
  6. 6. ソースコード公開の義務がある
  7. 7. ->二次的著作物もソースコード公開義務あり </li></ul>
  8. 8. GPLソフトの例 <ul><li>Linuxカーネル
  9. 9. LinuxデスクトップGnomeのアプリ
  10. 10. Linuxのコマンドの多く(bash、lftpなど) </li></ul>
  11. 11. Androidアプリを開発する際のGPLの問題点 <ul><li>GPLソフトを使ってAndroidアプリを開発したら、そのアプリを同じライセンスGPLで公開する必要がある -> ソースコード要公開
  12. 12. つまり、Androidアプリのソースコードをクローズドにできないので、有料アプリにしづらい </li></ul>
  13. 13. GPLの問題点を回避するには <ul><li>プロセス間通信を使用する
  14. 14. GNU FAQから
  15. 15. 「単なる集積」と「二つのモジュールを一つのプログラムに結合すること」の違いは何ですか?
  16. 16. パイプやソケット、コマンドライン引数は通常二つの分離したプログラムの間で使われるコミュニケーションメカニズムです。ですからそれらがコミュニケーションのために使われるときには、モジュールは通常別々のプログラムです。
  17. 17. -> ソケットやパイプはプロセス間通信。
  18. 18. 余談 : Android アプリ内部でコマンドラインのコマンドを呼ぶ方法 ( コマンドライン引数の方法 ) も可能であるそうだが、 Android OS やコマンドのクロスコンパイル必要で、アプリ作成が面倒。 </li></ul>
  19. 19. AndroidでGPLソフトを使用するには <ul><li>GPLソフトをライブラリ化して、JNI(Java Native Interface)を用いて、販売したい(クローズドソース)アプリとは別パッケージにして、サービスアプリを作る。販売したいアプリはクライアントアプリになる。
  20. 20. 販売したいアプリからサービスアプリを利用するには、サービスのバインドを使用する。(プロセス間通信の一種)。AIDLの使用。
  21. 21. aidlファイルはPublic Domainのライセンスにする </li></ul>
  22. 22. Public Domain <ul><li>著作物や発明などの知的創作物について、知的財産権が発生していない状態又は消滅した状態のことをいう。
  23. 23. 例: Androidのデータベースソフト sqliteなど </li></ul>
  24. 24. なぜ、aidlファイルをPublic Domainにするか <ul><li>GNU FAQ より
  25. 25. Q: あるプログラムがパブリックドメインに置かれたコードと GPL で保護されたコードから構成されていたとして、パブリックドメインな部分を取り出してパブリックドメインなコードとして利用することができますか ?
  26. 26. A: どの部分がパブリックドメインに置かれているか見分けがつき、それを残りの部分から分離できるならば可能です。もしコードがその開発者によってパブリックドメインに置かれていたならば、コードがどこにあろうとそれはパブリックドメインだからです。
  27. 27. つまり、クライアントアプリで Public Domain な aidl ファイルを使っても、アプリは GPL ライセンスにならない </li></ul>
  28. 28. バインド <ul><li>AIDL(Android Interface Defiition Language)ファイルでサービスが提供する機能を定義
  29. 29. AIDLファイルからインターフェイスを自動生成
  30. 30. 自動生成されたインターフェイスの機能をサービスに実装
  31. 31. マニフェストファイルにサービスを登録
  32. 32. クライアントアプリで、サービスとの接続を管理するServiceConnectionインターフェイスを実装したクラスの作成 </li></ul>
  33. 33. 開発して公開中のアプリ <ul><li>NHKラジオ語学講座のストリームをflvファイルとしてダウンロードするアプリ
  34. 34. ・ サービスアプリ FlvDownloadService
  35. 35. ・ ダウンロード・再生ができるアプリ LangDroidBetaベータ版
  36. 36. 注意 : ユーザは私的利用の範囲内なので、ダウンロード・再生は合法。アプリ開発者を規制する法律はない。
  37. 37. FlvDownloadServiceは、GPLライセンスであるflvstreamerを改造
  38. 38. http://savannah.nongnu.org/projects/flvstreamer </li></ul>
  39. 39. FlvDonwnloadServiceの場合 <ul><li>aidl ファイル FlvDownloadServiceInterface.aidl
  40. 40. Public Domain にしておく
  41. 41. FlvDownloadServiceInterface.java が自動生成 </li></ul>package com.sarltokyo.flvdownloadservice; interface FlvDownloadServiceInterface { // download Flv file int flvdownload(in String urlbase, in String title, in String where); // remove flv file int removeflv(in String title, in String where); }
  42. 42. FlvDonwnloadServiceの場合 <ul><li>サービスクラスを実装(ソースコード参照)
  43. 43. ネイティブメソッドの宣言
  44. 44. ライブラリのロード
  45. 45. FlvDownloadServiceInterface.java内で定義されたStubクラスを継承した無名クラスを作成し、機能を実装。内部でネイティブメソッドを呼び出す。 </li></ul>
  46. 46. FlvDonwnloadServiceの場合 <ul><li>flvstreamerをライブラリ化(その1)
  47. 47. 1. javah で、 Java の class ファイルから C のヘッダファイルを jni ディレクトリに生成
  48. 48. javah -classpath bin -d jni Java クラス
  49. 49. 2. jni ディレクトリに flvsteamer のソースコードコピー
  50. 50. 3. main 関数の関数名を flvstreamer に変える </li><ul><li>  ↑ライブラリ化のためのポイント。改造箇所が少ない。 </li></ul><li>4. ヘッダファイル flvstreamer.h を作成 </li></ul>#ifndef FLVSTREAMER_H #define FLVSTREAMER_H int flvstreamer(int, char **); #endif
  51. 51. FlvDonwnloadServiceの場合 <ul><li>flvstreamer をライブラリ化 ( その 2)
  52. 52. 5. 重要 : flvstreamer.c で、オプション解析 (getopt_long) の処理の前に、 optind = 0 を追加。連続ダウンロードが可能になる。
  53. 53. 6. C プログラムの実装 ( 次のページ参照)
  54. 54. 7. ライブラリを生成する Android.mk の作成
  55. 55. 8. Android NDK の ndk-build でビルド
  56. 56. 9. Eclipse のプロジェクトをリフレッシュ </li></ul>
  57. 57. FlvDonwnloadServiceの場合 <ul><li>Linuxでのコマンドでは
  58. 58. flvstreamer -r url -o out.flv -e
  59. 59. Cプログラムの実装例(コード断片、エラー処理、メモリー解放省略) </li></ul>url = (*env)->GetStringUTFChars(env, urlj, NULL); outfile = (*env)->GetStringUTFChars(env, outfilej, NULL); argv[0] = (char *)malloc(sizeof(char) * (strlen(&quot;flvstreamer&quot;) + 1)); memset(argv[0], 0, strlen(&quot;flvstreamer&quot;) + 1); strcpy(argv[0], &quot;flvstreamer&quot;); argv[1] = (char *)malloc(sizeof(char) * (strlen(&quot;-r&quot;) + 1)); memset(argv[1], 0, strlen(&quot;-r&quot;) +1); strcpy(argv[1], &quot;-r&quot;); … rtn = flvstreamer(argc, argv);
  60. 60. FlvDonwnloadServiceの場合 <ul><li>元のCプログラムのエラー出力の書き換え
  61. 61. log.c ファイルで
  62. 62. ・ #include <android/log.h> を加える
  63. 63. ・ putc('n', fmgs)
  64. 64. -> __android_log_write(ANDROID_LOG_DEBUG, &quot;TAG&quot;, &quot;n&quot;)
  65. 65. ・ fprintf(fmsg, &quot;%s&quot;, str)
  66. 66. -> __android_log_print(ANDROID_LOG_DEBUG, &quot;TAG&quot;, &quot;%s&quot;, str);
  67. 67. ・ fflush(fmsg)
  68. 68. -> __android_log_write(ANDROID_LOG_DEBUG, &quot;TAG&quot;, &quot;n&quot;) </li></ul>
  69. 69. ラジオ語学講座ダウンロード・再生アプリの場合 <ul><li>クライアントアプリの実装(その1)
  70. 70. 1. src内にサービスアプリのパッケージ名と同じパッケージを作成し、中にaidlファイルのリンクを作る。Public Domainなファイルを使っているので、クライアントアプリはGPL汚染されない。 </li></ul>
  71. 71. ラジオ語学講座ダウンロード・再生アプリの場合 <ul><li>クライアントアプリの実装(その2)
  72. 72. 2. アクティビティクラス内でバインド
  73. 73. 3. サービスのメソッドを呼ぶには </li></ul>bindService(new Intent(FlvDownloadServiceInterface.class.getName()), mConnection, Context.BIND_AUTO_CREATE); mDownloadInterface.flvdownload(URLBASE, title, WHERE);
  74. 74. まとめ <ul><li>JNIを使って、GPLソフトをライブラリ化して、サービスアプリを作った。main関数をコマンド名の関数に変えることによって、元のGPLソフトの改造箇所を少なくできた。
  75. 75. サービスのバインドを使って、サービスアプリを利用するクライアントアプリ「語学ファイルダウンロード・再生アプリ」を作った。
  76. 76. 今回のライブラリ化の方法が利用できるのは、C、C++のコマンドラインアプリで、対話型でないソフト。例えば、ssh、ftp、lftpとかはダメ。 </li></ul>
  77. 77. 付録:FlvDownloadServiceのソースファイル公開場所 <ul><li>githubにGPLライセンスで公開
  78. 78. url: https://github.com/andropenguin/FlvDownloadService
  79. 79. gitコマンドでダウンロードするには
  80. 80. $ git clone https://github.com/andropenguin/FlvDownloadService.git </li></ul>

×