日本ソフトウェア科学会第 36 回大会 (2019 年度) 講演論文集

Android アプリケーション開発支援ツールのためのAPI 利用パターン情報収集におけるAPI バージョンの考慮の効果
原口 雄士, 近藤 悠志, 西本 匡志, 西山 佳志, 川端 英之, 弘中 哲夫
開発者にとって，オープンソースリポジトリマイニングによって得られる API 利用パターン情報は有用である．しかしながら，ライブラリやフレームワークによって提供される API は，バージョンアップによって新機能に関するクラスやメソッドが追加されたり，同じメソッド名でも仕様が変更されたりする．つまり API 利用パターン情報を収集する際に API のバージョンを正確に踏まえなければ，API メソッドの型や引数に関する情報が正確に得られない場合がある．結果として，収集される API 利用パターン情報が不正確になり，それを用いるアプリケーション開発支援ツールも影響を被る．これに対し我々は，収集された Android アプリケーションの API 利用パターン情報について，API のバージョン情報の踏まえる事による違いを調査した．その結果について報告を行う．

切な API の使い分けに関する知識や記述方法に関す

1 はじめにる知見が求められる．しかし，API の使用法や組み

近年のアプリケーションソフトウェアはライブラリ合わせ方に関する情報はドキュメント化されていなやフレームワークの API (Application Programming

いことも多い．さらにライブラリやフレームワークInterface) を組み合わせることで作られている．さらのバージョンによって使用可能な API には制約があに，オープンソースのライブラリやスマートフォン向り，開発者は API のバージョンを踏まえた上で使用けのフレームワークなどは，高頻度でアップデートする API を選択する必要がある．したがって，開発され続けている [2]．ライブラリやフレームワークの者が API の使用法に感する知見を得ることは容易でアップデートが行われると，API が追加あるいは削除はない．

されたり，既存の API に対する仕様変更が行れたり

API の使用法を把握したい開発者にとって API メすることがある [1] [3]．ある調査によれば，Androidソッド呼び出しの順序系列や API メソッド集合などの API は，API level が 16 から 26 になるまでの間，の，いわゆる API 利用パターン情報は有用な情報とバージョンアップの度に平均して 57 個のクラスとなりうる．実際，オープンソースリポジトリマイニ

266 個のメソッドが追加，4 個のクラスと 10 個のメングによって抽出された API 利用パターン情報を，ソッドが削除，155 個のクラスと 58 個のメソッドのAPI メソッドの推薦システム [7] [9] [10] やプログラ

仕様が変更されている [3]．

ムのバグ検出 [4] [5] などに活用する研究が数多くな

アプリケーション開発者には，実装内容に応じた適されている．我々もプログラムのデータ依存関係を解析することで得られる API 利用パターン情報を活用

Yushi Haraguchi， Yushi Kondoh， Masashi Nishimoto， Keiji Nishiyama， Hideyuki Kawabata， andTetsuo Hironaka, 広 島 市 立 大 学, Hiroshima City
University.

したプログラム理解支援ツール [8] やコード自動編集機能付開発環境 [6] を開発している．

API 利用パターン情報を活用したアプリケーショ

@Override public void onCreate(Bundle savedInstanceState) {mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mPowerManager = (PowerManager)getSystemService(POWER_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());}@Override protected void onResume() {mWakeLock.acquire();mSensorManager.registerListener(this,mAccelerometer, SensorManager.SENSOR_DELAY_GAME);}@Override protected void onPause() {mWakeLock.release();mSensorManager.unregisterListener(this);}

API利⽤パターン情報1

API利⽤パターン情報2

android.app.Activity → getSystemService(Return: java.lang.Object , Argument: java.lang.String)

android.app.Activity → getSystemService(Return: java.lang.Object , Argument: java.lang.String)

android.hardware.SensorManager → getDefaultSensor(Return: android.hardware.Sensor , Argument: int)

android.os.PowerManager → newWakeLock(Return: android.os.PowerManager.WakeLock ,Argument: int, java.lang.String)

android.hardware.SensorManager → registerListener(Return: Boolean ,Argument: android.hardware.SensorEventListener,android.hardware.Sensor, int))
android.hardware.SensorManager → unregisterListener(Return: void ,Argument: android.hardware.SensorEventListener))

図1

android.os.PowerManager.WakeLock → acquire(Return: void)
android.os.PowerManager.WakeLock → release(Return: void)

ソースコードから抽出される API 利用パターン情報群の例

ン開発支援ツールの有用性は，API 利用パターン情バージョン情報を正確に踏まえて収集した API 利用報の正確さや詳細さに大きく依存する可能性がある．

パターン情報がアプリケーション開発支援ツールに及正確かつ詳細な API 利用パターン情報を収集するたぼす影響について，我々が開発しているコード自動編めの手段としては，API 利用パターン情報の収集す集機能付開発環境 (以下，SSS) [6] を例に考察を行う．

る際に，プロジェクトに設定された API バージョン情報を正確に踏まえることが挙げられる．API 利用2 準備

パターン情報を収集する際に，API のバージョン情2. 1 関連研究：API のバージョンの違いへの対報を正確に踏まえなければ，収集される API メソッ

応についてドの型や引数に関する情報が不正確となる場合があAPI のバージョンアップは，API を用いて構築さる．また，API のバージョン情報が付与されていないれているソフトウェアの可用性に大きな影響を与えう

API 利用パターン情報を使用するアプリケーション

る．API のバージョンアップによる影響を抑えるた

開発支援ツールは，開発者が使用する API バージョめの研究として，代用可能な API を自動的に見つけンには対応していない情報を提示するといった不正確る方法に関する研究がある [3]． [3] では，Javadoc にな支援をしてしまう可能性がある．

頼ることの効果の少なさが指摘されるとともに，公式

本研究では，API 利用パターン情報を収集する際に，プロジェクトで設定されている．API のバージョドキュメントを踏まえて対策するのが確実であるとの報告がなされている．

ン情報を正確に踏まえることが，API 利用パターン

多くの開発者は，アプリケーション開発にあたり，情報に与える影響について調査する．また，API のAPI のバージョンの違いを意識しようとする．実際

のところ，SDK INT を用いて，複数のバージョンに対れるかを調査した．調査の手順としては，収集対象の応した記述がなされるアプリケーションも多い．しかプロジェクトに設定された API のバージョン情報をしながらその「複数バージョン対応」を正しく行うこ

正確に踏まえて，抽出される API 利用パターン情報とは必ずしも容易ではない．文献 [1] では，バージョと，21 から 25 の API バージョンを設定して抽出さンの違いを意識して記述されたアプリケーションプロれる API 利用パターン情報の比較を行う．

グラムが全体の 92%を占めることが報告されている．
またその一方で，バージョンを意識しているいくつか

3. 1 調査の対象データのアプリのうち 25%にはバージョンの扱いに不適切

本調査では，Google Samples†1 における Androidな部分があったことも指摘している．

プロジェクトのうち，プロジェクトで使用されているライブラリが，Android 標準ライブラリと Android

2. 2 API 利用パターン情報への影響

Support Library である 100 個のプロジェクトを調

図 1 は，我々が開発しているアプリケーション開査対象とする．1 つの Android プロジェクトに複数発支援ツールで用いている API 利用パターン情報でのモジュールが含まれていた場合，各モジュールを 1ある [6] [8]．我々が活用する API 利用パターン情報

つの Android プロジェクトとして扱う．調査対象とは，特定の機能を実装するために必要とされる API

なる Android プロジェクトは，2017 年 1 月に収集しメソッドの集合である．例えば，図 1 における APIたものを使用する．

利用パターン情報 1 はセンサー値を取得するために必要となる API メソッド集合であり，API 利用パター

表1

ン情報 2 は WakeLock 機能を実装するために必要とAPI level

Android プロジェクト数なる API メソッド集合である．抽出された各 API 利

2311

用パターン情報には，API メソッドの所属クラスと24

89

各プロジェクトにおける API level

メソッド名，メソッドの戻り値の型と引数の型に関する情報が含まれている．なお，各 API メソッド名は，クラス名→メソッド名と本稿では表記される．
適切な API バージョン情報を踏まえてプログラム

3. 2 調査内容を解析しなかった場合，API メソッドが所属するク各 Android プロジェクトごとに正確な API バーラスに関する情報や引数の仕様に関する情報に誤りジョンで抽出した場合と，21 から 25 のバージョンをが生じる場合がある．また，API のバージョンによっ設定して抽出した場合の，API 利用パターン情報のて使用可能な API メソッドに制約がある場合もある．

違いを調査する．API 利用パターン情報は 3. 1 から

例えば，Android API の Progress Dialog クラスは，抽出を行う．API 利用パターン情報を自動抽出する

API Level 26 以降で非推奨となった API である．し際には，API 利用パターン情報抽出器に対して，プたがって，API のバージョンを 26 以上に設定していログラムの解析に使用する API のバージョン情報をる開発者に対して，Progress Dialog クラスを含んだ与える必要がある．設定するバージョンは 21 から 25

API 利用パターン情報を提示することは適切な支援の 5 つとした．サポートライブラリのバージョンにであるとは言えない．

おいて指定する際には，21 の場合は 21 .0 .0 ，25 の場合は 25 .0 .0 のようにした．API 利用パターン情報

3 調査に含まれている各 API メソッドの情報として，API

本節では，オープンソースリポジトリマイニングにメソッドの名前の他に，引数や戻り値，所属するクラよって API 利用パターン情報を収集する際に，APIバージョン情報が正確か否かでどのような違いが見ら†1 https://github.com/googlesamples

スの型情報がある．今回は Android プロジェクトごとに正確なバージョンを踏まえて抽出した API 利用パターン情報と，21 から 25 のバージョンを設定して抽出した API 利用パターン情報を比較した時に，結果に違いのある API 利用パターン情報のみを扱う．

3. 3 調査方法
はじめに，情報抽出元の各 Android プロジェクトと同じ API バージョンで API 利用パターン情報を抽

図2

特徴１

図3

特徴 2

出する．次に API バージョンを 21 から 25 に指定して，それぞれのバージョンで API 利用パターン情報を抽出する．ライブラリやフレームワークのバージョンを指定した場合は，抽出元の全ての Android プロ
ジェクトに対し指定した API バージョンで API 利用パターン情報を抽出する．そして各 Android と同じライブラリやフレームワークで抽出した API 利用パ
ターン情報と．それぞれ指定したバージョンで抽出された API 利用パターン情報について比較を行う．同
じ API 利用パターン情報としての条件は，API 利用パターン情報を構成する各 API メソッドの情報が全ン情報の数を表 2 に示す．Android プロジェクトと同て同じである事として比較を行う．

じライブラリやフレームワーク抽出した API 利用パ
表2

各バージョンごとにおける違いのあるターン情報の総数は 1866 であった．表 2 での設定すAPI 利用パターン情報の数

るバージョンとは，ソースコード解析を行う際に用い設定する違いのあったバージョン

API 利用パターン抽出されたるライブラリやフレームワークのバージョンである．

API 利用パターン それぞれの API 利用パターン情報を比較し，API メ情報の数情報の総数

211371817221291817

23321865

24218672581867

ソッドの情報における違いとして特徴のある 3 つを挙げる．3 つの具体例を図 2 から図 3 に示す．

• （特徴１）API メソッドの引数や戻り値に関する情報の有無．

• （特徴２）API メソッドの引数や戻り値の情報は同じだが，所属するクラスの情報が異なる．

• （特徴３）API メソッドのクラスは同じである
が，引数や戻り値の情報が異なる．

3. 4. 1 各パターンについて
3. 4 結果
抽出元プロジェクトで使用されている API バージョ

それぞれの特徴 1 から特徴３の実例を図 2 から図 4に示す．

ンを，正確に踏まえて抽出した API 利用パターン情

特徴１では解析に用いたライブラリやフレームワー

報と，21 から 25 のバージョンで抽出した API 利用パ

クにクラス本体が定義されていなかったため，APIターン情報を比較し，違いのあった API 利用パター

メソッドの引数や戻り値，所属するクラスの情報が取収集した API 利用パターン情報を活用し，開発中のソースコードに開発者が選択したコード片を自動挿入するツールである．SSS によって挿入されるコード片の抽出元であるオープンソースプロジェクトが，開発者の使用する API のバージョンと異なっていた場合，開発中の環境ではコンパイルできないコード片が埋め込まれる可能性があった．しかし，API 利用パターン情報に API のバージョン情報が加味されたこ
図4

特徴 3とによって，開発者が求める API バージョンのコード片を埋め込む事ができるようになると考えられる．

得できていない事が考えられる．
特徴２での違いのある 2 つのクラスは互いに継承

4 まとめと今後の課題関係のあるクラスであり，既存の API メソッドに対API 利用パターン情報を活用するツールにおけるしオーバーライドされた API メソッドが存在していアプリケーション開発者にとっての有用性は，API 利る．図 3 の例において，”putBoolean” という API メ用パターン情報の正確さや詳細さに大きく依存する

ソッドは API level が 22 のバージョンアップした際可能性がある．我々は，API のバージョンに着目し，にオーバーライドされた API メソッドである．よっ

正確かつ詳細な API 利用パターン情報の収集を行って API level が 21 では ”putBoolean” という API メた．実際に今回の調査で，API のバージョン情報がソッドはオーバーライドされておらず，API メソッドない場合には API メソッドの情報について，不正確の所属するクラスの情報に違いが生じたのだと考えな情報が存在していた事がわかった．
今後の課題として，さらに API 利用パターン情報られる．
特徴３ではライブラリやフレームワークのバージョの正確さを向上させるために，API 利用パターンのンアップにより，既存の API メソッドに対し仕様変抽出元プロジェクトを選定，もしくは収集した API更が行われたり，オーバーロードされた API メソッ

利用パターン情報の選別をする事で，開発者にとってドであった．変更が行われる以前のバージョンでソー有用性の高い API 利用パターン情報を収集できるのスコード解析を行うと，変更後の API メソッドにつではないかと考える．また，API 利用パターン情報いての情報を参照する事ができず，正確な API メソッを活用したツールに関してより詳細な調査が必要でドの情報を取得できなかったと考えられる．

ある．

3. 4. 2 API 利用パターン情報への影響に関する考察

API 利用パターン情報を活用する開発者にとって，図 2 から図 4 のような不正確な情報は，有用な情報であるとは言えない．API バージョンを踏まえて API
利用パターン情報を抽出すると，そういった不正確な情報を正確に抽出する事ができた．
実際に正確かつ詳細な API 利用パターン情報が抽出できるようになった事で，我々が開発している API利用パターン情報を活用するツールである，コード自動編集機能付開発環境 (以下，SSS) [6] を例に考察を行う．プログラムのデータ依存関係を解析することで参 考 文 献[ 1 ] He, D., Li, L., Wang, L., Zheng, H., Li, G., andXue, J.: Understanding and Detecting Evolutioninduced Compatibility Issues in Android Apps, Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering, ASE
2018, New York, NY, USA, ACM, 2018, pp. 167–177.
[ 2 ] Lamba, Y., Khattar, M., and Sureka, A.:
Pravaaha: Mining Android Applications for Discovering API Call Usage Patterns and Trends, ISEC,
2014.
[ 3 ] Lamothe, M. and Shang, W.: Exploring the Useof Automated API Migrating Techniques in Practice: An Experience Report on Android, Proceed-ings of the 15th International Conference on Mining Software Repositories, MSR ’18, New York, NY,USA, ACM, 2018, pp. 503–514.
[ 4 ] Li, Z. and Zhou, Y.: PR-Miner: Automatically
Extracting Implicit Programming Rules and Detecting Violations in Large Software Code, Proceedingsof the 10th European Software Engineering Conference Held Jointly with 13th ACM SIGSOFT International Symposium on Foundations of Software
Engineering, ESEC/FSE-13, New York, NY, USA,ACM, 2005, pp. 306–315.
[ 5 ] Livshits, B. and Zimmermann, T.: DynaMine:ﬁnding common error patterns by mining software
revision histories., Vol. 30, 01 2005, pp. 296–305.
[ 6 ] Masashi, N., Keiji, N., Hideyuki, K., and Tetsuo, H.: Easy-going Development of Event-Driven
Applications by Iterating a Search-Select-SuperposeLoop, Journal of Information Processing, Vol. 60,
No. 3(2019).

[ 7 ] Nguyen, T. T., Pham, H. V., Vu, P. M., andNguyen, T. T.: Recommending API Usages for
Mobile Apps with Hidden Markov Model, 2015
30th IEEE/ACM International Conference on Automated Software Engineering (ASE), Nov 2015,
pp. 795–800.
[ 8 ] Nishimoto, M., Nishiyama, K., Kawabata, H.,
and Hironaka, T.: Supporting program understanding by automatic indexing of functionalities insource code, SERA 2019, May 2019, pp. 13–18.
[ 9 ] Xie, T. and Pei, J.: MAPO: Mining API Usages
from Open Source Repositories, Proceedings of the2006 International Workshop on Mining Software
Repositories, MSR ’06, New York, NY, USA, ACM,
2006, pp. 54–57.
[10] 早瀬康裕, 鬼塚勇弥, 山本哲男, 石尾隆, 井上克郎:
API 呼び出しとメソッド周辺の識別子の実績に基づいた API 集合推薦手法, 情報処理学会論文誌, Vol. 56,
No. 2(2015), pp. 692–700.