Androidアプリケーションフレームワーク層を改造しよう!実践しながら学ぶ Android USBガジェットの仕組み(7)(2/2 ページ)

» 2012年09月18日 10時00分 公開
[中垣内勇祐、村上雅彦、森崇、中谷洋一(永和システムマネジメント),@IT MONOist]
前のページへ 1|2       

Android USBマスストレージクラスのアーキテクチャ【改造後】

 では、Androidの階層アーキテクチャを、どうやって改造していくのかを考えていきましょう。

 まず、アプリケーション層ですが、既存のUsbMassStorageNotificationでは、CDイメージをマウントするようにはできていません。よって、これを図5のようにPCRescuroidに置き換えます。


改造後のAndroid USBマスストレージの論理クラス構造 図5 改造後のAndroid USBマスストレージの論理クラス構造

 続いて、PCRescuroidに置き換えた際の、CDイメージをマウントする処理シーケンスを眺めてみましょう(図6)。

CDイメージをマウントするシーケンス 図6 CDイメージをマウントするシーケンス 【画像クリックで拡大表示】
変更点 変更内容
変更点 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)。

アプリケーションフレームワーク層(Eclair)のアーキテクチャ詳細【改造前】 図7 アプリケーションフレームワーク層(Eclair)のアーキテクチャ詳細【改造前】 【画像クリックで拡大表示】

 Androidのアプリケーション層は、Java言語で記述されています。一方、Linuxカーネル層はC言語で記述されています。MountService、MountListenerは、それらの言語間の壁を超えるために存在しています。

 ここで、アプリケーションフレームワーク層の2つのタスクは上記のJavaクラスに実装するという考え方もありますが、AndroidではC言語で記述されたvoldというデーモンがその役割を担っています(注2)。

※注2:Java層のクラス(MountService、MountListener)とvoldとの通信手段としては、ソケット通信(UNIXドメイン)を採用しています。


 その理由としては、Linuxカーネル層との通信が、C言語で記述した方が実装しやすいことが考えられます。そして、UNIX系のOSでデバイスを自動でマウント/アンマウントするデーモンvold(Volume Daemon)のソースコードを利用する方が、機能実現が容易だったから……なのかもしれません。

 ちなみに、ホストPC内に存在していたvoldは、デバイスとしての役割を担うAndroid端末に移植されたため、新たな責務として、デバイス視点での自動マウント機能が追加されました。すなわち、USB接続時にPC側からSDカードを見えるようにする機能のことです。

アプリケーションフレームワーク層(Eclair)の改造詳細

 図8に改造後のクラス間の関係を示します。また、CDイメージをマウントするシーケンスを図9に示します。

アプリケーションフレームワーク層(Eclair)のアーキテクチャ詳細【改造後】 図8 アプリケーションフレームワーク層(Eclair)のアーキテクチャ詳細【改造後】 【画像クリックで拡大表示】
アプリケーションフレームワーク層(Eclair)におけるCDイメージのマウントシーケンス 図9 アプリケーションフレームワーク層(Eclair)におけるCDイメージのマウントシーケンス 【画像クリックで拡大表示】

 処理シーケンスの大枠は、既に図6で示していますので、細かな説明は割愛します。改造後は、シーケンス上のタスクを適切なクラスに振り分けただけですので、それほど苦労せずに読解できると思います。

 以下に、既存のEclairからの変更点をまとめます。

(1)Java層 
・PCRescuroidからのCDイメージの設定リクエストを追加する 
・USB接続時のCDイメージの自動マウント処理を追加する

(2)vold 
・Java層からのCDイメージマウント要求に対して、CDイメージを仮想デバイス化する 
・仮想デバイス化したループバックデバイスのパスをドライバ制御ファイルに書き込む



 以上が、アプリケーションフレームワーク層に対する改造すべきポイントの詳細になります。後は、このシーケンスに添って実装すればよいだけですが、いきなりターゲットボードに実装してもデバッグが大変になるだけです……。

 というわけで、次回は、アプリケーションフレームワーク層の修正をエミュレータ上で疑似的にデバッグする方法を紹介します。ご期待ください! (次回に続く)


Android コーナー

Androidコーナー
「Android(アンドロイド)」の組み込み機器への適用からアプリ開発、レポート、ニュースなどさまざまな技術情報・最新動向をお届けする!!

>>コーナーTOPはこちらから


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.