連載
» 2013年03月08日 10時00分 UPDATE

実践しながら学ぶ Android USBガジェットの仕組み(10):Androidアプリケーションフレームワークを改造してPCRescuroidを追加する (1/2)

起動不能になったPCを救出する「PCRescuroid」の開発を進める本連載。今回は、Androidアプリケーションフレームワークに強く依存するアプリを開発する際に役立つ手法を紹介する。

[村上雅彦、舟元拓斗、森崇(永和システムマネジメント),MONOist]

1.はじめに

 前回前々回は本題から少し横道にそれて、AndroidエミュレータでUSB接続環境を提供するソリューションを紹介しました。こうした環境があると、Android端末(実機)を使わなくてもエミュレータ上でUSBドライバの開発ができるため、現在、われわれが試作中のUSBアプリケーション(アプリ)/ドライバ開発にも大いに役立てることができます。

 というわけで、今回から本来の目的である「PCRescuroid(ピーシーレスキュロイド)」の開発に戻りたいと思います。

 PCRescuroidをAndroidに組み込むには、連載第7回で説明した通り、大きく分けて以下の3つの層の改造が必要となります。

  • アプリケーション層
  • アプリケーションフレームワーク層
  • Linuxカーネル層

 各層の改造概要をざっとまとめると、図1のようになります。その中から今回は、①と②について解説します。

改造概要 図1 各層の改造概要

 一般的に、Androidアプリケーションフレームワーク層を改造すると、Androidの全ソースコードをリコンパイルすることになり、開発効率があまり良くありません。同様に、Androidアプリケーションフレームワークに強く依存するアプリ開発の場合も、Androidアプリケーションフレームワーク層の改造と同等扱いとなるため、アプリの開発といえども、開発効率の面で“やや難あり”といえます。

 今回は、Androidアプリケーションフレームワークに強く依存するアプリを開発する際に役立つ手法を紹介します。この手法を採用すると、具体的に以下のようなメリットを享受できます。

  • Windowsマシンでアプリ開発できる
  • 通常のアプリと同様に統合開発環境(Eclipse)で開発できる
  • Androidアプリケーションフレームワーク層の改造による影響を受けずにアプリ開発できる(注1)
  • アプリのコンパイル時間が短くて済む
※注1:インタフェース仕様は除きます。


2.Androidアプリケーションフレームワークの改造とアプリ開発を分離

 Androidアプリケーションフレームワーク層の改造と同フレームワークに強く依存するアプリの開発を独立して行うには、これらの間にある“つなぎ部分”、つまりインタフェースをしっかりと把握してから、その解決方法を模索する必要があります。

 まずは、われわれが開発するアプリ(PCRescuroid)の分析からはじめましょう。

 PCRescuroidは、Android端末がUSB接続された時に、SDカード/CDイメージのいずれかをマウントできるようにするためのアプリです(注2)。PCRescuroidの基本的な画面遷移は、以下の通りです(図2)。

PCRescuroidの基本的な画面遷移 図2 PCRescuroidの基本的な画面遷移【※画像クリックで拡大表示】

 続いて、図2の画面遷移を基に、Androidアプリケーションフレームワーク層とのインタフェースを整理した結果を表1に示します。

No. アクター イベント イベント発行先 トリガ
フレームワーク USB接続通知 PCRescuroid ユーザーがAndroid端末とPCをUSB接続する
PCRescuroid マウント通知 フレームワーク ユーザーがマウントを選択する
表1 Androidアプリケーションフレームワーク層とのインタフェース

 上記2つのインタフェースがAndroidアプリケーションフレームワーク層との“つなぎ部分”となります。なお、Androidに標準で組み込まれているUsbStorageActivity(PCRescuroidと同じ位置付けのアプリ)の場合は、さらに強い依存関係にあります。

※注2:当初、CDイメージだけを対象としていましたが、SDカードのマウントも考慮する必要があったため、新たに追加しました。


 詳細を表2に示します。

No. アクター イベント 強い依存関係の内容(課題)
フレームワーク USB接続通知 フレームワークはUSB接続イベントを、Notificationを利用してアプリに通知します。具体的には、Notificationの設定として、タップ時に起動するアプリを「クラスオブジェクト」で指定します。このアプリの指定を「クラスオブジェクト」としているため、フレームワークとアプリは静的な結合が必要となり、同時コンパイル・リンクしなければなりません
PCRescuroid マウント通知 アプリはマウントイベントを、フレームワークのAPIを直接呼び出すことで通知します。しかし、このAPIはAndroid SDKでは提供されていない“非公開API”であるため、必然的にフレームワークとアプリは静的な結合としなければなりません
表2 強い依存関係

 われわれは開発効率を重視し、PCRescuroidの開発と、Androidアプリケーションフレームワーク層の改造を独立して行えるように、アプリとフレームワークとの依存性を低くする手法を採用しました(表3)。

No. アクター イベント 解決手法(ソリューション)と改造内容
フレームワーク USB接続通知 Notificationの設定として、タップ時に起動するアプリを「クラス名の文字列」で指定します。これにより、フレームワークとアプリは動的な結合となるため、同時コンパイルが不要となります。今回の改造では、このアプリ指定をUsbStorageActivityからPCRescuroidに変更します
PCRescuroid マウント通知 アプリのフレームワークのAPIを直接呼び出すのではなく、リフレクションを使用して呼び出すことで動的な結合とします(注3
表3 採用した解決手法

注3:PCRescuroidでは、非公開APIをリフレクションで呼び出す方法を採用しました。しかし、非公開APIは、Androidのバージョンや開発メーカーにより大きくインタフェース仕様が変わることが想定されます。特に、Androidのバージョンアップ時やある特定機種で動作しないといった問題が容易に起こり得るため、一般のアプリ開発で非公開APIを使用する際は、バージョンチェックなどの検討が必要です。


       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.