わかった気になる気になるandroid
先日ariel社内で行なわれたandroid勉強会の発表資料を公開します。
あいかわらず正確性については無保証です。
概要
androidって何?
AndroidとはOHAが中心となって開発を行っている、携帯端末用ソフトウェアプラットフォーム。
もうちょっと具体的に言うとOSやユーザーインターフェイス、ミドルウェア、その上で動作するアプリケーション、開発環境などことです。
オープンソース(Apache License, Version 2.0)
ターゲットCPUはARM(X86へのポーティングは現在作業中?)
日本では2009年7月10日にdocomoからPRO series HT-03A が発売予定。
携帯だけではなく、組み込みの標準的なプラットフォームとしても注目されています。
Android SDKの歴史
- 2008/09/23 Android SDK Ver1.0
- 2009/04/28 Android SDK Ver1.5
- 2009/05/22 Android SDK Ver1.5 r2 (SDKの最新)
- 2009/06/25 Android NDK Ver1.5 r1 <- いまここ
- JNI経由でC/C++のnativeコードが実行できるようになりました。
特徴
以下本家の和訳より
- コンポーネントの再利用と置き換えを可能にするアプリケーションフレームワーク
- モバイル端末に最適化したダルヴィーク(Dalvik)ヴァーチャルマシン
- オープンソース WebKit エンジンに基づく統合化されたブラウザ
- カスタム2Dグラフィックライブラリによる最適化されたグラフィックス
- 3DグラフィックはOpenGL ES 1.0の仕様準拠(ハードウェアアクセラレーションは任意)
- 構造化されたデータ領域のためのSQLite搭載
- 一般的なオーディオ、ビデオと静止画フォーマットをサポート(MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF)
- GSM通話(ハードウェア依存)
- Bluetooth、EDGE、3G、WiFiに対応(ハードウェア依存)
- カメラ、GPS、コンパス、加速度計(ハードウェア依存)
- リッチな開発環境、端末エミュレーター、デバッグ、メモリー、パフォーマンスのプロファイリングのツール、およびEclipse IDE用のプラグイン
アーキテクチャ
参考
アプリケーション
いわゆる電子メールクライアント、SMSプログラム、カレンダー、地図、ブラウザーなどこと。
記述する言語はJavaで記述します。
特徴的な点としてはシステムアプリケーションを含め全てのアプリケーションが対等です。
標準のアプリケーションの代りに自作のアプリケーションを使用するようandroidに指示することもできるそうです。
アプリケーションフレームワーク
アプリケーション開発のための各種フレームワーク。 例えば以下の通り
- アクティビティマネージャ
- アクティビティのライフサイクル管理
- ビューシステム
- UIの制御
- リソースマネージャ
- リソースの管理
- 位置マネージャ
- 位置情報の取得や更新
- 通知マネージャ
- メッセージの到着や時間、近接アラーム、外部からの新入などのイベント通知
Androidランタイム
標準ライブラリ
javaで書かれたandroidのコアライブラリ。
内容は以下の通り
- java SE5.0ライブラリのサブセット
- 広域をサポートしているがswingなどは非サポート
- Android専用ライブラリ
- サードパーティ
- org.apache.http
- org.json
- org.xml.sax
- org.xmlpull.v1
Dalvik(ダルヴィーク)
- JavaVMをもとに低メモリ環境向けに最適化されたVM
- Apache License, Version 2.0
- これによってメーカーがVM改変をソースコードの提供なしに行なえる
- ベースは[Apache Harmony]
- SunのOpen JDKはGPLv2なんで
- JVM≠Dalvik
- 動作するコードがjavaバイトコードではなく独自のバイトコード
(中間ファイルは.dex .classをリコンパイルして作成)
- 動作するコードがjavaバイトコードではなく独自のバイトコード
- レジスタベースのVM
- 制限されたメモリ内で複数のバーチャルマシンのインスタンスを同時に動作可能
- 一つ一つの Dalvikアプリケーションが別々のLinuxプロセスとして動作
ライブラリ
主なライブラリ
- システムCライブラリ
- 標準的なCシステムライブラリ(libc)
- (組み込み向けLinuxベースのデバイスのために調整した)BSDから派生した実装です
- メディアライブラリ
- PacketVideo社のOpenCOREがベース
- ライブラリは、多くの一般的なオーディオとビデオ形式(MPEG4、H.264、MP3、AAC、AMR、JPGとPNGのような静止画を含む)の再生とレコーディングをサポート
- Surface Manager
- 表示サブシステムへのアクセスを管理して、複数のアプリケーションからシームレスに2Dと3Dグラフィックレイヤーを合成します
- LibWebCore
- Androidブラウザーと組み込み可能なウェブ表示を可能にする最新のウェブブラウザエンジン
- SGL
- 下位層にある2Dグラフィックエンジン
- 3Dライブラリ
- OpenGL ES 1.0のAPIに準拠
- ライブラリはハードウェア3Dアクセラレーション(ハードウェア依存)、あるいは標準装備の高度に最適化された3Dソフトウェアラスタライザーを使用
- FreeType
- ビットマップとベクターフォントのレンダリング
- SQLite
- すべてのアプリケーションで利用可能な強力で軽量なリレーショナルデータベースエンジン
Linux カーネル
Linux Kernel 2.6
- セキュリティ
- メモリ管理
- プロセス管理
- ネットワークスタック
- 各種ドライバ
- etc
Tools
アーキテクチャじゃないですが、開発用のツールも紹介しておきます。- emulator(Android Emulator)
- qemuベース
- ARM CPUのバイナリ互換を実現
- ddms(Dalvik Debug Monitor Service)
- デバッガ
- adb(Android Debug Bridge)
- デバイスやエミュレータの状態を管理
- dx
- .classファイルをAndroid実行用バイナリコードに変換
- android.el
- emacsからアプリのインストールやエミュレータの実行などが可能
- おそらく推奨開発環境に違いない
- ADT(Android Development Tools plugin)
- Eclipse Plugin
- きっと非推奨開発環境にきまってる
- 今回は紹介しません:p
他のツールや詳細はこちら
クイックスタート
下準備
開発環境
- Java SE 5.0 以上
- Apache Ant
- Android SDK
- windows, linux, mac os x
- emacs
- ADT(option) - eclipse update site
環境変数の追加
$ export JAVA_HOME=/path/to/java
$ export ANDROID_HOME=/path/to/android
$ export PATH=.:${JAVA_HOME}/bin:${ANDROID_HOME}/tools
アプリケーションの作成
プロジェクトの雛形作成
$ android create project \
--target 2 \
--path hello \
--activity HelloAndroid \
--package com.arielnetworks.hello
target に渡す値は以下のコマンドで確認可能。
$ android list
Available Android targets:
id: 1
Name: Android 1.1
Type: Platform
API level: 2
Skins: HVGA-L, HVGA-P, QVGA-P, HVGA (default), QVGA-L
id: 2
Name: Android 1.5
Type: Platform
API level: 3
Skins: HVGA-L, HVGA-P, QVGA-P, HVGA (default), QVGA-L
id: 3
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Description: Android + Google APIs
Based on Android 1.5 (API level 3)
Libraries:
* com.google.android.maps (maps.jar)
API for Google Maps
Skins: QVGA-P, HVGA (default), HVGA-L, QVGA-L, HVGA-P
Available Android Virtual Devices:
以降の作業はプロジェクトのルートディレクトリで行ないます。
cd hello
プロジェクトの構成
- AndroidManifest.xml
- このアプリ自体の一般的な定義を行うXML。バージョンとか使用するActivityとか
- build.xml
- ご存知
- default.properties
- デフォルトの設定
- 編集不要
- build.properites
- 自分のbuild環境に併せて編集しよう
- src/
- HelloAndroid.java
- 雛形として生成されたActivityクラス
- HelloAndroid.java
- gen/
- R.java
- リソースIDの定数定義クラス
- resフォルダ配下のリソースを読みとって自動生成
- R.java
- res/
- layout/
- main.xml
- GUIレイアウトの定義XML
- main.xml
- values/
- strings.xml
- 文字列リソースの定義XML
- strings.xml
- layout/
- tests/
- テスト用フォルダ
- bin/
- 出力用フォルダ
- libs/
- 各種ライブラリ
HelloWorld
HelloAndroid.java
package com.arielnetworks.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
ActivityクラスのonCreateをオーバーライドしてます。
onCreate
ビルド
debug用ビルド
$ ant debug
release用ビルド
$ ant release
ビルドの流れは以下の通り
- Javaソースコード(.java)をコンパイル
- Javaクラスファイル(.class)をリコンパイル
- Dalvik Executable(.dex)をパッケージング
- Android Package(.apk)の生成
ビルドが完了するとbin/の下にapkファイルが作成されます。
アプリケーションの実行
AVD(Android Virtual Device)の作成
エミュレータを実行するための、androidの仮想デバイスを作成します。$ android create avd --name myAVD --target 2
エミュレータの起動
先程作った「myAVD」をエミュレータで起動させます。最初の起動には時間がかかるのでコーヒーでも飲んで待ちましょう。
emulator -avd myAVD
アプリケーションのインストール
エミュレータが起動したら以下のコマンドでアプリケーションをインストール。$ adb install ./bin/HelloAndroid.apk
無事にインストールできたらメニューからHelloAndroidを起動させてみましょう。
「Hello, Android!」と書かれた画面が表示されるはずです。
HelloWorld2
無事画面に出力できましたが、MVC的にも微妙なコードが出来あがりました。
そこで、layoutリソースを使用してUI構築部分をActivityから切り離してみましょう。
res/layout/main.xml
また、文字列もリソース管理する為にtextの内容は「@string/hello」としてあります。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>
res/values/strings.xml
3行目が先程の「@string/hello」で読みこまれる箇所です。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello, Android!</string>
<string name="app_name">Hello, Android</string>
</resources>
HelloAndroid.java
リソースをからレイアウトを読み込むよう修正します。
package com.arielnetworks.hello;
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
R.java
R.javaはantを使用してビルドをすれば自動的に更新されます。
今回は下記のような感じ。リソースIDを定数しているだけですね。
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.arielnetworks.hello;
public final class R {
public static final class attr {
}
public static final class layout {
public static final int main=0x7f020000;
}
public static final class string {
public static final int app_name=0x7f030000;
public static final int hello=0x7f030001;
}
}
実行すると表示される画面は一緒ですが、ActivityからUIを構築するコードが排除できました。
デバッグ on emacs
おまけとして ddms を経由して emacs からデバッガ接続する方法を載せておきます。
- ddms を起動する
- ddms のプロセスリストからデバッグしたいプロセスのポート番号を調べる
- M-x jdb を実行
jdb -sourcepath ./src -attach localhost:<port number>
ddmsの使い方は以下の松山さんのエントリーを参照してください。
Emacs で Java アプリケーションをデバッグする — ありえるえりあ
Androidアプリケーションの基礎
主要クラス
Activity(アクティビティ)
- アプリ本体から送られてくるイベントの処理や及びUIの構築が役割です
- 通常は一つの画面に一つのActivityを持ちます
View(ビュー)
- ButtonやLabelなどのUI部品です
- res/layoutにxmlで記述する方法とjavaで記述する方法の二種類の方法があります
- 主にActivityクラスから生成されます
Intent(インテント)
- ActivityやServiceなどの間で送受信するメッセージです
Intent Receiver(インテントレシーバー)
- 着信やネットワークの開通、時間等の何らかの外部通知の待ち受けを行ないます
Service(サービス)
- UIを持たずにバックグラウンドで動作させたい場合に使用します
- 音楽の再生や通信などスレッド的な用途に近いです
Content Provider(コンテンツプロバイダ)
- データストレージの管理を行ないます
Activityのライフサイクル
参考
作成、可視、対話中 という3つの状態を遷移
onCreate
Activityの初回作成時に呼び出されます。
onStart
Activityの表示開始時に呼び出されます。
onRestart
Activityの表示再開時に呼び出されます。
onResume
Activityがユーザとの対話開始時に呼び出されます。
ここまでのイベントで初回と二回目以降の呼び出しの流れは以下の通りです。
- 初回 : onCreate()→onStart() →onResume()
- 二回目以降 : onStop()→onStart()→onRestart()→onResume()
onPause
Activityがユーザとの対話中断時に呼び出されます。
onStop
Activityの表示中断時に呼び出されます。
onDestroy
Activityの破棄時に呼び出されます。
finish()からも呼ばれるため、区別のために isFinishing() メソッドが用意されています。
メモリが足りなくなるとandroidが勝手にkillしちゃいます。
その時はonStopやonDestroyなどは呼ばれないので注意が必要です。
まとめ
個人的な感想
- ユーザーとしての感想を上げるならまだiphoneのほうが魅力的
- アプリケーション充実っぷり
- 勢いあるし
- iPhone 3GS買っちゃったし
- でも今後の可能性としてはandroidのほうが期待してます
- auやsoftbankからもandroid携帯は発売の見込み
- 各種携帯メーカーからfelicaや赤外線などを今後対応してくるはず
- オープンソースの強みがどう発揮されるかが楽しみ
- 個人的にはプログラマ天国っぽい所が一番の魅力
- オープンソースだったり
- 過去のしがらみが無かったり
- 無料で開発環境構築できたり
- マッシュアップ楽しそう
- アプリケーションから他のアプリケーションを呼び出すことでマッシュアップできる
- 開発者向けのライブラリなどもマーケットに登録できそう(未調査)
- アプリケーションから他のアプリケーションを呼び出すことでマッシュアップできる
さらに知るために
- Android Developers
- Android | Market
- FrontPage - 日本Androidの会(日本アンドロイドの会)
- android情報まとめ @ ウィキ - トップページ
- Android Docsについて (Android Docs(初級編))
「620」 待ちわびた心の平和を皆さんに。
- Category(s)
- android
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/iwanaga/android-intro/tbping