Presentation is loading. Please wait.

Presentation is loading. Please wait.

クローズドソースアプリから、GPLソフトを使うには

Similar presentations


Presentation on theme: "クローズドソースアプリから、GPLソフトを使うには"— Presentation transcript:

1 クローズドソースアプリから、GPLソフトを使うには
長部 敏 twitter gmail : 主な活動地域: 日本Android会埼玉支部、多摩支部

2 GPLライセンスとは GNU General Public Licenseの略 コピーレフトのソフトウェアライセンスの一種
コピーレフトとは:著作権に対する考え方で、著作権を保持したまま、二次的著作物も含めて、すべての者が著作物を利用・再配布・改変できなければいけないという考え方 つまり、二次的著作物の頒布条件を同一のライセンスに限るということ ソースコード公開の義務がある →二次的著作物もソースコード公開義務あり

3 GPLソフトの例 Linuxカーネル LinuxデスクトップGnomeのアプリ Linuxのコマンドの多く(bash、lftpなど)

4 Androidアプリを開発する際のGPLの問題点
GPLソフトを使ってAndroidアプリを開発したら、そのアプリを同じライセンスGPLで公開する必要がある → ソースコード要公開 つまり、Androidアプリのソースコードをクローズドにできないので、有料アプリにしづらい

5 GPLの問題点を回避するには プロセス間通信を使用する GNU FAQから
「単なる集積」と「二つのモジュールを一つのプログラムに結合すること」の違いは何ですか? パイプやソケット、コマンドライン引数は通常二つの分離したプログラムの間で使われるコミュニケーションメカニズムです。ですからそれらがコミュニケーションのために使われるときには、モジュールは通常別々のプログラムです。 →ソケットやパイプはプロセス間通信。 余談 : Androidアプリ内部でコマンドラインのコマンドを呼ぶ方法(コマンドライン引数の方法)も可能であるそうだが、Android OSやコマンドのクロスコンパイル必要で、アプリ作成が面倒。

6 AndroidでGPLソフトを使用するには
GPLソフトをライブラリ化して、JNI(Java Native Interface)を用いて、販売したい(クローズドソース)アプリとは別パッケージにして、サービスアプリを作る。販売したいアプリはクライアントアプリになる。 販売したいアプリからサービスアプリを利用するには、サービスのバインドを使用する。(プロセス間通信の一種)。AIDLの使用。 aidlファイルはPublic Domainのライセンスにする

7 Public Domain 著作物や発明などの知的創作物について、知的財産権が発生していない状態又は消滅した状態のことをいう。
例: Androidのデータベースソフト sqliteなど

8 なぜ、aidlファイルをPublic Domainにするか
GNU FAQより Q: あるプログラムがパブリックドメインに置かれたコードとGPLで保護されたコードから構成されていたとして、パブリックドメインな部分を取り出してパブリックドメインなコードとして利用することができますか? A: どの部分がパブリックドメインに置かれているか見分けがつき、それを残りの部分から分離できるならば可能です。もしコードがその開発者によってパブリックドメインに置かれていたならば、コードがどこにあろうとそれはパブリックドメインだからです。 つまり、クライアントアプリでPublic Domainなaidlファイルを使っても、アプリはGPLライセンスにならない

9 バインド AIDL(Android Interface Defiition Language)ファイルでサービスが提供する機能を定義
自動生成されたインターフェイスの機能をサービスに実装 マニフェストファイルにサービスを登録 クライアントアプリで、サービスとの接続を管理するServiceConnectionインターフェイスを実装したクラスの作成

10 開発して公開中のアプリ NHKラジオ語学講座のストリームをflvファイルとしてダウンロードするアプリ
・ サービスアプリ FlvDownloadService ・ ダウンロード・再生ができるアプリ LangDroidBetaベータ版 注意: ユーザは私的利用の範囲内なので、ダウンロード・再生は合法。アプリ開発者を規制する法律はない。 FlvDownloadServiceは、GPLライセンスであるflvstreamerを改造

11 FlvDonwnloadServiceの場合
aidlファイル FlvDownloadServiceInterface.aidl Public Domainにしておく FlvDownloadServiceInterface.javaが自動生成 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); }

12 FlvDonwnloadServiceの場合
サービスクラスを実装(ソースコード参照) ネイティブメソッドの宣言 ライブラリのロード FlvDownloadServiceInterface.java内で定義されたStubクラスを継承した無名クラスを作成し、機能を実装。内部でネイティブメソッドを呼び出す。

13 FlvDonwnloadServiceの場合
flvstreamerをライブラリ化(その1) 1. javahで、JavaのclassファイルからCのヘッダファイルをjniディレクトリに生成 javah -classpath bin -d jni Javaクラス 2. jniディレクトリにflvsteamerのソースコードコピー 3. main関数の関数名をflvstreamerに変える  ↑ライブラリ化のためのポイント。改造箇所が少ない。 4. ヘッダファイル flvstreamer.hを作成 #ifndef FLVSTREAMER_H #define FLVSTREAMER_H int flvstreamer(int, char **); #endif

14 FlvDonwnloadServiceの場合
flvstreamerをライブラリ化(その2) 5. 重要: flvstreamer.cで、オプション解析(getopt_long)の処理の前に、optind = 0を追加。連続ダウンロードが可能になる。 6. Cプログラムの実装(次のページ参照) 7. ライブラリを生成するAndroid.mkの作成 8. Android NDKのndk-buildでビルド 9. Eclipseのプロジェクトをリフレッシュ

15 FlvDonwnloadServiceの場合
Linuxでのコマンドでは flvstreamer -r url -o out.flv -e Cプログラムの実装例(コード断片、エラー処理、メモリー解放省略) url = (*env)->GetStringUTFChars(env, urlj, NULL); outfile = (*env)->GetStringUTFChars(env, outfilej, NULL); argv[0] = (char *)malloc(sizeof(char) * (strlen("flvstreamer") + 1)); memset(argv[0], 0, strlen("flvstreamer") + 1); strcpy(argv[0], "flvstreamer"); argv[1] = (char *)malloc(sizeof(char) * (strlen("-r") + 1)); memset(argv[1], 0, strlen("-r") +1); strcpy(argv[1], "-r"); rtn = flvstreamer(argc, argv);

16 FlvDonwnloadServiceの場合
log.cファイルで ・#include <android/log.h>を加える ・putc('\n', fmgs) → __android_log_write(ANDROID_LOG_DEBUG, "TAG", "\n") ・ fprintf(fmsg, "%s", str) → __android_log_print(ANDROID_LOG_DEBUG, "TAG", "%s", str); ・fflush(fmsg)

17 ラジオ語学講座ダウンロード・再生アプリの場合
クライアントアプリの実装(その1) 1. src内にサービスアプリのパッケージ名と同じパッケージを作成し、中にaidlファイルのリンクを作る。Public Domainなファイルを使っているので、クライアントアプリはGPL汚染されない。

18 ラジオ語学講座ダウンロード・再生アプリの場合
クライアントアプリの実装(その2) 2. アクティビティクラス内でバインド 3. サービスのメソッドを呼ぶには bindService(new Intent(FlvDownloadServiceInterface.class.getName()), mConnection, Context.BIND_AUTO_CREATE); mDownloadInterface.flvdownload(URLBASE, title, WHERE);

19 まとめ JNIを使って、GPLソフトをライブラリ化して、サービスアプリを作った。main関数をコマンド名の関数に変えることによって、元のGPLソフトの改造箇所を少なくできた。 サービスのバインドを使って、サービスアプリを利用するクライアントアプリ「語学ファイルダウンロード・再生アプリ」を作った。 今回のライブラリ化の方法が利用できるのは、C、C++のコマンドラインアプリで、対話型でないソフト。例えば、ssh、ftp、lftpとかはダメ。

20 付録:FlvDownloadServiceのソースファイル公開場所
githubにGPLライセンスで公開 url: gitコマンドでダウンロードするには $ git clone


Download ppt "クローズドソースアプリから、GPLソフトを使うには"

Similar presentations


Ads by Google