2011年3月6日日曜日

Android 開発入門

はじめに

BlackBerry と iPhone はどちらも魅力的で大容量のモバイル・プラットフォームですが、それぞれの対象はまったく対照的です。BlackBerry はエンタープライズ・ビジネス・ユーザー向けの堅実なプラットフォームである一方、一般ユーザー用の機器としては iPhone の使い易さと「クールな要素」に太刀打ちすることはできません。登場したばかりの Android はまだ実証されていないプラットフォームですが、モバイル・フォンのビジネス・ユーザーと一般ユーザーの両方の世界で活躍する可能性を秘めているだけでなく、仕事と遊びを分け隔てている深い溝を埋めることになるかもしれません。

最近では、ネットワーク・ベースあるいはネットワーク対応のアプリケーションの多くが Linux カーネルのフレーバーを実行しています。それは、Linux カーネルが安定したプラットフォームで、デプロイするにもサポートするにもコスト効果が高く、デプロイメントに好ましい設計アプローチとして快く受け入れられているからです。ネットワークに対応した機器の UI は大抵 HTML ベースなので、Mac を含め PC ブラウザーで表示することができますが、すべての電化製品が汎用のコンピューティング・デバイスによって制御されなければならないわけではありません。コンロや電子レンジ、パン焼き器などのこれまでの電化製品を考えてみてください。家庭用電化製品が Android で制御されていて、カラーのタッチ・スクリーンを自慢にしていたとしたらどうなるでしょうか。例えばコンロの上に Android の UI があったとしたら、私でも料理を作れるようになるかもしれません。

この記事では、Android プラットフォームの概要、そしてモバイル・アプリケーションだけでなくそれ以外のアプリケーションでも Android を使用する方法を説明するために、Android SDK をインストールして単純なアプリケーションを作成します。この記事に記載するサンプル・アプリケーションのソース・コードをダウンロードしてください。

Android の略歴

Android プラットフォームは、Open Handset Alliance の産物です。Open Handset Alliance はより優れたモバイル・フォンを作成することを目指して連携する企業のグループで、Google を中心に、携帯電話事業者、携帯電話機メーカー、コンポーネント・メーカー、ソフトウェア・ソリューションおよびプラットフォームのプロバイダー、そしてマーケティング企業で組織されています。ソフトウェア開発の観点から見ると、Android はオープンソースの世界の真っ只中に位置します。

初めて市場に登場した Android 対応の携帯電話は、HTC (訳注: 台湾に本社を持つスマートフォンや PDA 端末のメーカー) によって製造され、T-Mobile (訳注: 欧米で移動体通信サービスを提供している事業者) から提供された G1 です。この機器は、約 1 年に及ぶ憶測の末にリリースされました。その頃に利用可能だったソフトウェア開発ツールは、段階的に改善途中の SDK リリースがいくつかあるだけでしたが、G1 のリリース日が近づいた頃、Android チームが SDK V1.0 をリリースしました。これを機に、この新しいプラットフォームのアプリケーションが浮上してくるようになりました。

技術革新に拍車を掛けるため、Google は上位出展作品に何百万ドルもの賞金を懸けた 2 回の「Android Developer Challenges」(Android 用のアプリケーション開発コンテスト) を開催しました。G1 が登場してから数か月後には Android Market がリリースされ、ユーザーが自分の携帯電話から直接アプリケーションをブラウズしたり、ダウンロードしたりできるようになりました。およそ 18 ヶ月をかけて、新たなモバイル・プラットフォームが公の場に姿を現すようになったわけです。

Android プラットフォーム

その広範な機能から、Android はデスクトップ・オペレーティング・システムと混同されがちかもしれませんが、Android は Linux カーネルをベースに豊富な機能を組み込んだ階層型環境です。Android の UI サブシステムには以下のものが含まれます。

  • ウィンドウ
  • ビュー
  • ウィジェット (編集ボックス、リスト、ドロップダウン・リストなどの共通要素を表示)

Android には、WebKit をベースにした組み込み可能なブラウザーが含まれています。WebKit はオープンソースのブラウザー・エンジンで、iPhone の Mobile Safari にもこのブラウザー・エンジンが採用されています。

Android は、WiFi、Bluetooth、そして携帯電話のネットワークを介したワイヤレス・データ接続 (GPRS、EDGE、3G など) といった充実したネットワーク接続機能を誇っています。そして Android アプリケーションでは、Google マップにリンクしてアプリケーション内で直接住所を表示するという手法がよく使われます。Android ソフトウェア・スタックにはロケーション・ベースのサービス (GPS など) と加速度計のサポートも用意されていますが、すべての Android 機器がこれらの機能に必要なハードウェアを搭載しているわけではありません。また、カメラのサポートもあります。

歴史的に見て、モバイル・アプリケーションがこれまでデスクトップ・アプリケーションになかなか追いつけなかった分野には、グラフィック/メディア処理とデータ・ストレージの方法の 2 つがあります。Android はグラフィックの問題に対処するため、2D および 3D グラフィックをサポートする OpenGL ライブラリーを組み込んでいます。データ・ストレージについては、Android プラットフォームには人気の高いオープンソースの SQLite データベースが組み込まれているため、データ・ストレージの負担は軽減されます。図 1 に、Android のソフトウェア・レイヤーの略図を示します。


図 1. Android のソフトウェア・レイヤー
 

アプリケーション・アーキテクチャー

前述のとおり、Android は Linux カーネルをベースに稼働します。Android アプリケーションは Java プログラミング言語で作成され、仮想マシン (VM) 内部で実行されます。重要な点として、この VM はご想像通り JVM ではなく、オープンソース・テクノロジーの Dalvik Virtual Machine であることに注意してください。以下に示すように、それぞれの Android アプリケーションは、Linux カーネルが管理するプロセス内に常駐する Dalvik VM のインスタンス内で実行されます。


図 2. Dalvik VM
 

Android アプリケーションは、以下に分類するコンポーネントの 1 つまたは複数で構成されます。

アクティビティー
可視の UI を持つアプリケーションは、アクティビティーとともに実装されます。ユーザーがホーム画面またはアプリケーション・ランチャーからアプリケーションを選択すると、アクティビティーが開始されます。
サービス
ネットワーク監視や更新チェックのアプリケーションなど、長期間続行する必要のあるアプリケーションにはサービスを使う必要があります。
コンテンツ・プロバイダー
コンテンツ・プロバイダーはいわゆるデータベース・サーバーのようなもので、その役割は永続データ (SQLite データベースなど) へのアクセスを管理することです。極めて単純なアプリケーションには必ずしもコンテンツ・プロバイダーを作成する必要はありませんが、大規模なアプリケーション、あるいは複数のアクティビティーやアプリケーションにデータを使用できるようにするアプリケーションを作成している場合には、コンテンツ・プロバイダーがデータへのアクセス手段となります。
ブロードキャスト・レシーバー
Android アプリケーションは、データの要素を処理するため、またはイベント (例えばテキスト・メッセージの受信など) に応答するために起動することができます。

Android アプリケーションは AndroidManifest.xml というファイルと併せて機器にデプロイされます。AndroidManifest.xml に含まれる情報は、Android アプリケーションを適切に機器にインストールするために必要な構成情報です。これには、必要なクラス名やアプリケーションが処理可能なイベントのタイプ、そしてアプリケーションが実行しなければならない許可などが含まれます。例えば、アプリケーションがネットワークにアクセスしなければならない場合 (例えばファイルをダウンロードするため)、このマニフェスト・ファイルにネットワークへのアクセス許可を明示的に記述する必要があります。多くのアプリケーションでは、このような具体的な許可を有効にすることができます。この宣言型のセキュリティーによって、不正なアプリケーションが機器にダメージを与える可能性が低くなります。

次のセクションでは、Android アプリケーションを作成する上で必要な開発環境について説明します。

必要なツール

Android アプリケーションの開発を始める最も簡単な方法は、Android SDK および Eclipse IDE (「参考文献」を参照) をダウンロードすることです。Android の開発は、Microsoft® Windows®、Mac OS X、または Linux で行えます。

この記事では、読者が Eclipse IDE および Eclipse 用 Android Developer Tools プラグインを使用していることを前提とします。Android アプリケーションは Java 言語で作成しますが、作成したアプリケーションは Dalvik VM (Java 仮想マシンではありません) でコンパイルして実行します。Eclipse での Java 言語を使用したコーディングはとても直観的で、Eclipse はコンテキストに依存したヘルプやコード補完機能などが備わった充実した Java 環境を提供します。Android Developer Tools は、Java コードのコンパイルが正常に完了すると必ず、AndroidManifest.xml ファイルを含めて適切にアプリケーションをパッケージ化します。

Eclipse と Android Developer Tools プラグインを使わないで Android アプリケーションを開発することもできますが、その場合には Android SDK 関連の処理方法を把握していなければなりません。

Android SDK は ZIP ファイルとして配布されるので、このファイルをハード・ドライブのディレクトリーに解凍します。SDK の更新は何回か行われているので、開発環境を上手に整理して、SDK のバージョンを簡単に切り替えられるようにしておくことをお勧めします。SDK には以下のものが含まれています。

android.jar
アプリケーションを作成するために必要なすべての Android SDK クラスが含まれる Java アーカイブ・ファイルです。
documention.html および docs ディレクトリー
SDK ドキュメントはローカルおよび Web 上で提供されます。その大部分は JavaDocs 形式なので、SDK に含まれる多数のパッケージを簡単にナビゲートすることができます。ドキュメントには、開発の概要を記した開発ガイドと、広範な Android コミュニティーへのリンクも含まれています。
samples ディレクトリー
samples サブディレクトリーには、さまざまな API を実際に実行する ApiDemo をはじめ、多種多様なアプリケーションの完全なソース・コードが含まれます。Android アプリケーションの開発を始める際には、まずサンプル・アプリケーションを調べてみることが非常に有効な手段となります。
tools ディレクトリー
Android アプリケーションの作成に使用するすべてのコマンドライン・ツールが含まれます。便利なツールとして最もよく用いられているのは、adb (Android Debug Bridge) ユーティリティーです。
usb_driver
開発環境を G1 や、Android 開発者向けのロックフリーの Android Dev Phone 1 などの Android 対応機器に接続するために必要なドライバーが含まれるディレクトリーです (訳注: ロックフリーとは、SIM ロックやハードウェア・ロックなどを外してどの携帯電話事業者のネットワークでも使えるようにしたもの)。このディレクトリーに含まれるファイルが必要となるのは、Windows プラットフォームを使用する開発者のみです。

Android アプリケーションは実際の機器で実行することも、Android SDK に付属の Android Emulator で実行することもできます。図 3 は、Android Emulator のホーム画面です。


図 3. Android Emulator
 

Android Debug Bridge

adb ユーティリティーがサポートするコマンドライン引数のいくつかのオプションを使用すると、ファイルを Android 機器との間でコピーするといった強力な機能を実行することができます。シェル・コマンドライン引数によって、携帯電話そのものに接続し、基本的なシェル・コマンドを実行することができます。図4 に、USB ケーブルで Windows ラップトップに接続した実際の Android 機器に対する adb シェル・コマンドを示します。


図 4. adb シェル・コマンドの使用
 

図 4 では、adb シェル環境で以下の操作を実行しています。

  • 複数のネットワーク接続が示されたネットワーク構成を表示。ネットワーク接続は複数あることに注意してください。
    • lo は、ローカル接続またはループバック接続です。
    • tiwlan0 は、ローカル DHCP サーバーによって提供されるアドレスを使用した WiFi 接続です。
  • PATH 環境変数の内容を表示。
  • スーパーユーザーに切り替えるために su コマンドを実行。
  • ユーザー・アプリケーションが保存されている /data/app にディレクトリーを変更。
  • /data/app ディレクトリーで、ディレクトリーの一覧を表示してアプリケーションが 1 つあることを確認。Android アプリケーション・ファイルは実際にはアーカイブ・ファイルなので、WinZip などで構成ファイルを表示することができます。拡張子は apk です。
  • ping コマンドを実行して Google.com にアクセスできるかどうかを確認。

この同じコマンド・プロンプト環境から、SQLite データベースを操作したり、プログラムを起動したりするなど、他にも多くのシステム・レベルのタスクを実行することができます。携帯電話に接続していることを考えれば、これはかなり卓越した機能だと言えます。

次のセクションでは、単純な Android アプリケーションを作成してみます。

基本的なアプリケーションのコーディング

このセクションでは、Android アプリケーションの作成方法を簡単に説明します。このサンプル・アプリケーションは想像し得る最も単純なアプリケーションで、「Hello Android」アプリケーションを変更しただけです。ここでは画面の背景色を白一色にするというマイナーな変更を加え、携帯電話を懐中電灯として使用できるようにします。独創的とは言えませんが、サンプルとしては役立つはずです。まずは、完全なソース・コードをダウンロードしてください。

Eclipse でアプリケーションを作成するには、「ファイル」 > 「新規」 > 「Android プロジェクト」の順に選択して、「新規 Android プロジェクト」ウィザードを起動します。


図 5. 「新規 Android プロジェクト」ウィザード
 

次に、main.xml に保存された UI レイアウトを使用して、アクティビティーが 1 つしかない単純なアプリケーションを作成します。このレイアウトには、Android FlashLight と表示されるように変更する対象のテキスト要素が含まれます。以下に、この単純なレイアウトを記載します。


リスト 1. FlashLight のレイアウト
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:background="@color/all_white"> <TextView       android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="@string/hello" android:textColor="@color/all_black"     android:gravity="center_horizontal"/> </LinearLayout> 

strings.xml に、色のリソースをいくつか作成します。


リスト 2. strings.xml 内に作成された色
<?xml version="1.0" encoding="utf-8"?> <resources>     <string name="hello">Android FlashLight</string>     <string name="app_name">FlashLight</string>     <color name="all_white">#FFFFFF</color>     <color name="all_black">#000000</color> </resources> 

メイン画面のレイアウトには、all_white として定義された背景色があります。strings.xml ファイルでは、all_white は RGB トリプレット値の #FFFFFF、つまり白一色として定義されています。

レイアウトには TextView が 1 つ含まれていますが、実際には単なる静的テキストなので編集することができません。このテキストは黒に設定されていて、gravity 属性を使って水平方向のセンタリングが行われています。

このアプリケーションには、FlashLight.java という名前の Java ソース・ファイルがあります (以下を参照)。


リスト 3. Flashlight.java
package com.msi.flashlight; import android.app.Activity; import android.os.Bundle; public class FlashLight extends Activity {     /** Called when the activity is first created. */     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);     } } 

上記は「新規 Android プロジェクト」ウィザードによるボイラープレート・コードをそのまま使ったもので、以下の内容になっています。

  • com.msi.flashlight という名前の Java パッケージに含まれます。
  • 以下の 2 つのインポートがあります。
    • アクティビティー・クラスのインポート
    • バンドル・クラスのインポート
  • このアクティビティーが起動されると、onCreate メソッドが呼び出されて savedInstanceState が渡されます。このバンドルは、アクティビティーが中断されてから再開されるときに使用されるものなので、このアプリケーションでは考慮する必要はありません。
  • onCreate メソッドは、これと同じ名前を持つアクティビティー・クラス・メソッドをオーバーライドし、スーパークラスの onCreate メソッドを呼び出します。
  • setContentView() は、main.xmlファイルに定義された UI レイアウトを関連付けるために呼び出します。main.xml および strings.xml に含まれるすべてのものは、R.java ソース・ファイルに定義された定数に自動的にマッピングされます。このファイルはビルドされるたびに変更されるので、直接編集しないでください。

アプリケーションを実行すると、白い画面に黒いテキストが表示されます。


図 6. FlashLight の白い画面
 

以下に、FlashLight アプリケーションに対応する AndroidManifest.xml ファイルの設定内容を記載します。


リスト 4. FlashLight の AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"       package="com.msi.flashlight"       android:versionCode="1"       android:versionName="1.0.0">     <application android:icon="@drawable/icon" android:label="@string/app_name">         <activity android:name=".FlashLight"                   android:label="@string/app_name">             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application> </manifest> 

このファイルは、Eclipse 用 Android Developer Tools プラグインによって自動的に作成されたものです。つまり、何もしなくてもこのファイルが作成されます。

このアプリケーションは確かに目を見張るようなものではありませんが、隣で眠っている連れ合いを起こさずに本を読みたいときや、停電中にブレーカーを探すときに重宝するはずです。


0 件のコメント:

コメントを投稿