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

Slides:



Advertisements
Similar presentations
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也. 講義計画(あくまで予定) 第 1 回 プログラミング言語の種類と歴史 第 2 回 eclipse の基本操作 第 3 回 eclipse のデバッグ機能 第 4 回 構造化プログラミングの復習 第 5 回 演習 第 6 回 構造化指向からオブジェクト指向へ.
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Generic programming と STL
IBM Power Systems Linux センター のご紹介
自社製ミドルウエアをDalvikと連携させることが可能になる
Androidアプリを公開する方法.
Android:Service 小山 圭.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
~手続き指向からオブジェクト指向へ(Ⅰ)~
WebサービスII (第10回) 2007年11月28日 植田龍男.
第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」
Servlet J2EE I 第8回 /
アプレット (Applet)について.
WSDL と JAX-RPC 年10月13日 Webサービス II (第3回) WSDL と JAX-RPC 年10月13日.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
構造体.
Androidソースコード公開後のJNI
マスタリング バベル Boost.勉強会 #2 ( ).
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
WSDL と JAX-RPC 年10月20日 Webサービス II (第4回) WSDL と JAX-RPC 年10月20日.
TA 高田正法 B10 CPUを作る 2日目 SPIMのコンパイル TA 高田正法
XSL-FO + MathML MathML表示、PDF生成、SVG生成
RMI ソフトウェア特論 第6回 /
プログラミング演習3 第2回 GUIの復習.
Androidアプリの作成 07A1069 松永大樹.
補足説明.
コンパイラの解析 (2) GCJのデータ構造 - 1.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
ポインタ解析におけるライブラリの スタブコードへの置換の効果
EclipseでWekaのAPIを呼び出す
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
デジタル画像とC言語.
Java8について 2014/03/07.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アスペクト指向言語のための 独立性の高いパッケージシステム
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
B演習(言語処理系演習)第2回 田浦.
Boostのスマートなポインタを使ってみる
実装について 前田俊行.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
ネットワーク・プログラミング デバイスドライバと環境変数.
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
フレンド関数とフレンド演算子.
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

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

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

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

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

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

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

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

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

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

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

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); }

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

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

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

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);

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)

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

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

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

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