API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也
ソフトウェアの比較 現在,大量のソフトウェアが入手可能 –Android Market から, Vector から, … – 類似するソフトウェアが多い ソフトウェアを選択する必要性 – 利用者:ソフトウェアに利用したい機能が存 在するかを確認したい – 開発者:機能追加の際,今あるソフトウェア がどのような機能を持つか知りたい ソフトウェアを比較して 機能の違いを明確にする必要がある 2 特別研究発表会
ソフトウェア比較における問題 点 特別研究発表会 3 比較方法問題点 実際に利用して比べ る すべての機能を試すことが大変 比較したいソフトウェアが多い場 合 時間的コストがかかる ドキュメントの比較 同じ機能を別の用語で定義するな ど記述レベルが統一されていない 恐れ ドキュメントが存在しない場合 ソースコードの比較 差分が多くなり理解が難しい
API 呼び出しと機能 プラットフォーム固有の機能を利用するために API が呼び出される 高機能な API が提供される環境がある –Android , Windows , … 呼び出しの形式は統一されている 複数のソフトウェアを機械的に処理できる ソースコードの比較より少ない情報で比較が可能 4 特別研究発表会 API 呼び出しを比較することで ソフトウェアの比較ができるのではな いか
Android 携帯端末向けプラットフォーム Android SDK (ソフトウェア開発キット) – カメラ, GPS 位置情報などを利用するための API を含む – 抽象度が高く,高機能な API を持つ 特別研究発表会 5
6 A.m1() B.m2() D.m2() B.m3() 提案手法の概要 特別研究発表会 共通する機能 X 1 のみに存在する 機能 アプリケーション X 1 アプリケーション X 2 共通する API 呼び出し 列 API 呼び出し列抽出 比較 事前知識 X 1 のみに出現する API 呼び出し列 X 2 のみに出現する API 呼び出し列 照合 X 2 のみに存在する 機能 A.m1() B.m2() B.m3() C.m1() D.m4() API 呼び出し列 照合 API 呼び出し 列 名前
API 呼び出し列 メソッドから抽出した興味のある API 呼び出 しの並び – ソースコード中の出現順 – 制御構造は考慮しない 1 メソッドにつき1つの API 呼び出し列を抽出 特別研究発表会 7 public void onClick(View v) { String s = str.substring(2); Intent intent=new Intent(this,com.example.edit.class); startActivity(intent); } android.content.Intent.android.content.Intent android.app.Activity.startActivity ソースコー ド API 呼び出し 列
A.m1() B.m2() B.m3() C.m1() D.m4() D.m2() B.m3() 特別研究発表会 8 比較 API 呼び出し列の比較 A.m1() B.m2() B.m3() C.m1() D.m4() B.m3() A.m1() B.m2() D.m2() B.m3() API 呼び出し列 X 1 のみに出現する API 呼び出し列 X 2 のみに出現する API 呼び出し列 共通する API 呼び出し列 長さ2以上の共通す る連続部分を 共通する API 呼び出し 列として抽出 B.m3()
D.m2() B.m3() 事前知識 特別研究発表会 9 B.m2() B.m3() C.m1() D.m4() A.m1() B.m2() 一致 A.m1() B.m2() D.m2() B.m3() B.m2() B.m3() C.m1() カメラ 1 地図 1 カメラ 3 事前知識との照合 共通する API 呼び出し列 X 1 のみに出現する API 呼び出し列 X 2 のみに出現する API 呼び出し列 B.m3() C.m1() D.m4()
B.m2() C.m1() 事前知識 地図機能を持つ Android アプリケーショ ン A.m1() B.m2() C.m1() API 呼び出し列 B.m2() C.m1() B.m3() A.m1() B.m2() 共通する API 呼び出し列 1 A.m1() B.m2() D.m4() B.m2() C.m1() 共通する API 呼び出し列 2 X1X1 X1X1 X2X2 X2X2 … X3X3 X3X3 特別研究発表会 10 API 呼び出し列 抽出 事前知識作成の概要 フィルタリ ング A.m1() B.m2() 登録 除去 地図 2
ツールの概要( 1/2 ) : 起動画面 11 比較対象を選択 特別研究発表会
ツールの概要( 2/2 ) : 結果表示 12 検出された機能(差 分) 検出された機能(共 通) 選択 機能名と API 呼び出し 列 出現位置情報 特別研究発表会
ケーススタディ( 1/7 ) : 目的 作成した事前知識に登録されている機能 が,比較対象のアプリケーションに含ま れているかを確認する 試作したツールにより,共通する機能, 共通しない機能がわかることを確認する 特別研究発表会 13
ケーススタディ( 2/7 ) : 対象 地図機能を持つアプリケーション 11 個を 収集 6 個で事前知識作成 –156 個の API 呼び出し列を抽出 – うち 23 個に機能名をつけ登録 残りの 5 個をケーススタディの対象とする 特別研究発表会 14
ケーススタディ( 3/7 ) : 手順 特別研究発表会 地図機能を持つアプリケーション 5 個か ら API 呼び出し列を抽出し,事前知識と 照合 2. 照合結果から 5 つのアプリケーションが 区別できることを確認 3. 試作したツールを用いて 2 つのアプリ ケーションを比較し,機能の差分が提示 されることを確認
ケーススタディ( 4/7 ) : 結果 機能を含むアプリケーション数 合計 機能を表している API 呼び出し列の 数 割近くの機能が調査対象のアプリケー ションに出現 特別研究発表会 16 いずれかのアプリケーションに出現した機 能: 18
ケーススタディ( 5/7 ) : 5つのアプリケーションとの照 合 機能 警告ダイア ログ表示 緯度経度 取得 トースト 表示 緯度経度 設定 サブメ ニュー表示 アプリケーショ ン A ○○○○ - アプリケーショ ン B ○ - ○ -- アプリケーショ ン C ○○ --- アプリケーショ ン D ○○○ -- アプリケーショ ン E ○○○○○ アプリケーション間の違いをいくつかの機能で 確認 – アプリケーション A には緯度経度を設定する機能が存 在 – 警告ダイアログ表示機能はすべてのアプリケーショ ンに存在 特別研究発表会 17 …
ケーススタディ( 6/7 ) : ツールを用いた比較の例 共通する機能と共通しない機能が区分されている – どちらもメニューの UI を利用 – 比較元 2 では緯度経度を取得する 同じ機能でも違う API 呼び出し列で実現されている場合 あるため,複数表示される項目がある 特別研究発表会 18 アプリケーション C アプリケーション B
ケーススタディ( 7/7 ) : 考察 API 呼び出し列を比較することで,機能の 比較が実現できている 特定の機能を表していないと考えられる API 呼び出し列が多い –Android アプリケーションに共通する記述 – アプリケーション内部での処理 特別研究発表会 19
まとめと今後の課題 まとめ –API 呼び出し列を利用したアプリケーション の 比較方法の提案 –Android アプリケーション向け比較ツールの試 作 – 手法の有効性を確認 今後の課題 – 事前知識のフィルタリングの自動化 – ドメインごとに固有の機能と,ドメインによ らない機能を分類して提示する手法の検討 20 特別研究発表会
非表示スライド 説明用 21 特別研究発表会
単純なソースコードの比較 Unix diff ではほぼ全体が差分になってしま う 例 :twitter クライアントアプリ 2 種の diff 22 + if (colIndex > -1) { + inReplyTo = mCursor.getString(colIndex); + if (inReplyTo != null && "null".equals(inReplyTo) == false) { + inReplyTo = String.format(Locale.getDefault(), getText(R.string.tweet_source_in_reply_to).toString(), inReplyTo); } - terp_handler = new Handler() { - public void handleMessage(Message m) { - switch (m.arg1) { - case -1: 特別研究発表会
共通部分の抽出 23 プロジェクト 1 API 呼び 出し A.m 1() B.m 2() B.m 3() C.m 1() D.m 4() D.m 2() B.m 3() E.m 3() A.m 1() ○ ------- B.m 2() - ○ ------ D.m 2() ----- ○ -- B.m 3() -- ○ --- ○ - B.m 2() - ○ ------ B.m 3() -- ○ --- ○ - C.m 1() --- ○ ---- D.m 4() ---- ○ --- E.m 3() ------- ○ D.m 2() ----- ○ -- B.m2() B.m3() C.m1() D.m4() A.m1() B.m2() 共通部分情報 特別研究発表会
差分の抽出 24 プロジェクト 1 API 呼び 出し A.m 1() B.m 2() B.m 3() C.m 1() D.m 4() D.m 2() B.m 3() E.m 3() A.m 1() ○ ------- B.m 2() - ○ ------ D.m 2() ----- ○ -- B.m 3() -- ○ --- ○ - B.m 2() - ○ ------ B.m 3() -- ○ --- ○ - C.m 1() --- ○ ---- D.m 4() ---- ○ --- E.m 3() ------- ○ D.m 2() ----- ○ -- 差分情報 (プロジェクト 1 ) D.m2() 差分情報 (プロジェク ト 2 ) D.m2() B.m3() 取り消し線をつけた API 呼び出しは共通部 分 代わりにダミーを記録 特別研究発表会 B.m3() E.m3() D.m2()