Androidアプリケーションフレームワーク層を改造しよう!:実践しながら学ぶ Android USBガジェットの仕組み(7)(2/2 ページ)
引き続き、起動不能になったPCを救出する「PCRescuroid」の開発を進める。今回は、CDイメージをマウントすべく、アプリケーションフレームワーク層の修正ポイントを詳しく見ていく。
Android USBマスストレージクラスのアーキテクチャ【改造後】
では、Androidの階層アーキテクチャを、どうやって改造していくのかを考えていきましょう。
まず、アプリケーション層ですが、既存のUsbMassStorageNotificationでは、CDイメージをマウントするようにはできていません。よって、これを図5のようにPCRescuroidに置き換えます。
続いて、PCRescuroidに置き換えた際の、CDイメージをマウントする処理シーケンスを眺めてみましょう(図6)。
変更点 | 変更内容 |
---|---|
変更点 1. | ユーザーは、SDカードの自動マウント設定ではなく、自動マウントするCDイメージを設定する |
変更点 2. | アプリケーションフレームワーク層では、SDカードをアンマウントしたが、CDイメージの場合はそもそもマウントされていないので、アンマウントは不要。その代り、CDイメージファイルを仮想デバイス化するために、ループバックデバイスを作成する。そして、ドライバ層に、そのループバックデバイスパスを通知する |
変更点 3. | ドライバは、SCSIコマンドのINQUIRY要求に対して、接続している機器がCD-ROMデバイスであることを通知する |
表1 シーケンスの変更点説明 |
表1の通り、オリジナルの処理シーケンスからの変更点は3点(図6でいう緑色、紫色、黄色の枠内)だけで済みます。基本的に、既存のシーケンスの流れはほぼそのまま踏襲し、改造範囲を減らすよう工夫しています。
ここまでの内容で、改造すべきポイントの大枠は見えてきました。これからさらに深掘りし、その詳細を見ていきます。
まずは、アプリケーションフレームワーク層です。なお、改造対象となるAndroidのバージョンですが、本稿で使用しているターゲットボードのバージョンがEclairであるため、Eclairベースで進めていくことにします。
アプリケーションフレームワーク層(Eclair)の詳細
アプリケーションフレームワーク層で改造対象となる論理クラス、UsbMassStorageServiceは、Eclairの実装ではJava言語で記述されているクラス(MountListener、MountService)とC言語で記述されているデーモン(vold)に分けられます。(図7)。
Androidのアプリケーション層は、Java言語で記述されています。一方、Linuxカーネル層はC言語で記述されています。MountService、MountListenerは、それらの言語間の壁を超えるために存在しています。
ここで、アプリケーションフレームワーク層の2つのタスクは上記のJavaクラスに実装するという考え方もありますが、AndroidではC言語で記述されたvoldというデーモンがその役割を担っています(注2)。
その理由としては、Linuxカーネル層との通信が、C言語で記述した方が実装しやすいことが考えられます。そして、UNIX系のOSでデバイスを自動でマウント/アンマウントするデーモンvold(Volume Daemon)のソースコードを利用する方が、機能実現が容易だったから……なのかもしれません。
ちなみに、ホストPC内に存在していたvoldは、デバイスとしての役割を担うAndroid端末に移植されたため、新たな責務として、デバイス視点での自動マウント機能が追加されました。すなわち、USB接続時にPC側からSDカードを見えるようにする機能のことです。
アプリケーションフレームワーク層(Eclair)の改造詳細
図8に改造後のクラス間の関係を示します。また、CDイメージをマウントするシーケンスを図9に示します。
処理シーケンスの大枠は、既に図6で示していますので、細かな説明は割愛します。改造後は、シーケンス上のタスクを適切なクラスに振り分けただけですので、それほど苦労せずに読解できると思います。
以下に、既存のEclairからの変更点をまとめます。
(1)Java層
・PCRescuroidからのCDイメージの設定リクエストを追加する
・USB接続時のCDイメージの自動マウント処理を追加する
(2)vold
・Java層からのCDイメージマウント要求に対して、CDイメージを仮想デバイス化する
・仮想デバイス化したループバックデバイスのパスをドライバ制御ファイルに書き込む
以上が、アプリケーションフレームワーク層に対する改造すべきポイントの詳細になります。後は、このシーケンスに添って実装すればよいだけですが、いきなりターゲットボードに実装してもデバッグが大変になるだけです……。
というわけで、次回は、アプリケーションフレームワーク層の修正をエミュレータ上で疑似的にデバッグする方法を紹介します。ご期待ください! (次回に続く)
関連キーワード
組み込みAndroid開発 | 実践しながら学ぶ Android USBガジェットの仕組み | USB | Android | 組み込み | Androidケータイ | アプリケーション開発 | Androidがもたらす組み込み開発の新たな可能性 | 組み込み開発 | 作りながら理解するファイルシステムの仕組み
Copyright © ITmedia, Inc. All Rights Reserved.