Androidアプリケーションフレームワークを改造してPCRescuroidを追加する:実践しながら学ぶ Android USBガジェットの仕組み(10)(1/2 ページ)
起動不能になったPCを救出する「PCRescuroid」の開発を進める本連載。今回は、Androidアプリケーションフレームワークに強く依存するアプリを開発する際に役立つ手法を紹介する。
1.はじめに
前回と前々回は本題から少し横道にそれて、AndroidエミュレータでUSB接続環境を提供するソリューションを紹介しました。こうした環境があると、Android端末(実機)を使わなくてもエミュレータ上でUSBドライバの開発ができるため、現在、われわれが試作中のUSBアプリケーション(アプリ)/ドライバ開発にも大いに役立てることができます。
というわけで、今回から本来の目的である「PCRescuroid(ピーシーレスキュロイド)」の開発に戻りたいと思います。
PCRescuroidをAndroidに組み込むには、連載第7回で説明した通り、大きく分けて以下の3つの層の改造が必要となります。
- アプリケーション層
- アプリケーションフレームワーク層
- Linuxカーネル層
各層の改造概要をざっとまとめると、図1のようになります。その中から今回は、①と②について解説します。
一般的に、Androidアプリケーションフレームワーク層を改造すると、Androidの全ソースコードをリコンパイルすることになり、開発効率があまり良くありません。同様に、Androidアプリケーションフレームワークに強く依存するアプリ開発の場合も、Androidアプリケーションフレームワーク層の改造と同等扱いとなるため、アプリの開発といえども、開発効率の面で“やや難あり”といえます。
今回は、Androidアプリケーションフレームワークに強く依存するアプリを開発する際に役立つ手法を紹介します。この手法を採用すると、具体的に以下のようなメリットを享受できます。
- Windowsマシンでアプリ開発できる
- 通常のアプリと同様に統合開発環境(Eclipse)で開発できる
- Androidアプリケーションフレームワーク層の改造による影響を受けずにアプリ開発できる(注1)
- アプリのコンパイル時間が短くて済む
2.Androidアプリケーションフレームワークの改造とアプリ開発を分離
Androidアプリケーションフレームワーク層の改造と同フレームワークに強く依存するアプリの開発を独立して行うには、これらの間にある“つなぎ部分”、つまりインタフェースをしっかりと把握してから、その解決方法を模索する必要があります。
まずは、われわれが開発するアプリ(PCRescuroid)の分析からはじめましょう。
PCRescuroidは、Android端末がUSB接続された時に、SDカード/CDイメージのいずれかをマウントできるようにするためのアプリです(注2)。PCRescuroidの基本的な画面遷移は、以下の通りです(図2)。
続いて、図2の画面遷移を基に、Androidアプリケーションフレームワーク層とのインタフェースを整理した結果を表1に示します。
No. | アクター | イベント | イベント発行先 | トリガ |
---|---|---|---|---|
① | フレームワーク | USB接続通知 | PCRescuroid | ユーザーがAndroid端末とPCをUSB接続する |
② | PCRescuroid | マウント通知 | フレームワーク | ユーザーがマウントを選択する |
表1 Androidアプリケーションフレームワーク層とのインタフェース |
上記2つのインタフェースがAndroidアプリケーションフレームワーク層との“つなぎ部分”となります。なお、Androidに標準で組み込まれているUsbStorageActivity(PCRescuroidと同じ位置付けのアプリ)の場合は、さらに強い依存関係にあります。
詳細を表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 採用した解決手法 |
Copyright © ITmedia, Inc. All Rights Reserved.