********************************************************************** セッションS4-d/S5-d テーマ:Androidアプリワークショップ 講師:富永勉(日本Androidの会名古屋支部長)    ナガセさん 日時:2010/9/3 13:00〜16:55 参加人数:8名 ********************************************************************** ■アジェンダ ○はじめに ○Android全体概要 ○Androidアプリケーション概要 ○Androidセキュリティモデル概要 ○ワークショップ実習(Twitterクライアント作成) ○最後に ■はじめに 全体の概要から初めて実習に入ります。 HT03a,Xperia, N1, IS-01,dynabook AZ などお持ちしていますので、 触りたければご自由にどうぞ。 Android 端末持っていますか?いわゆるスマートフォン以外にも Beagleボードなどもあります。 スケルトンを作っているのでコピーしてください。 全部をやっているとこの時間では間に合いませんので。 スケルトンに肉付けをして感じをつかんでもらいます。 質問がある方は心置きなく挙手でお願いします。 ■Android全体概要 主に携帯電話向けのプラットフォーム、 といいつつ dynabook なんかにも使われています。 でっかいホーム画面が表示されます。 画面は必須ではありません。Beagle ボードもその1つ。 セットトップボックスなんかにも使えます。 ペイパービューを見るためのボックスにもやろうと思えば使えます。 ○Android Developpers のサイト ADC の案内であるとか SDK, ドキュメントへのリンクがあります。 ほとんど日本語化されていない。英語とお友達にならないと開発できないですよ。 ソースコードは Google code で公開されています。 その気があれば、ソースコードを落として、beagle ボード等に移植できます。 ロイヤリティは発生しません。 ○特徴3つ ・ソフトウェア 置き換えることが可能。 Android Market を使用しようとすると Google の認証を通らなければいけない。 APad は Market への接続ができない。 でも android は android。入れ替え、取り外し自由。 基本的にすべてのアプリケーションは Java で記述された Dalvik 上で動く実行ファイル。 Dalvik,OpenGL,SQlite はもっと下層のもの。 ・ハードウェア依存 bluetooth,3g,WiFi,カメラ,GPS,コンパス これらは必須ではない。端末によってあったりなかったりする。 日本では、ハイエンド機への需要が高く、ローエンド、ミドルエンドが売れないので、 日本で販売されているものはまず bluetooth, GPS が搭載されている。 ・開発環境 eclipse IDE, DDMS, etc... 従来の組み込み開発環境に比べてかなり充実している。 ○アーキテクチャ (Android Architecture の図を示しながら) この図を見たことがありますか? 下がLinuxカーネル、ライブラリ・ランタイムがあり、 続いてフレームワーク、アプリケーション層となる。 アプリケーションは例えば、Gmailクライアント,Googleマップのクライアント等がある。 with Google の文字がついているものを選べば Gmail クライアントやgoogleマップなど のGoogle のクライアントアプリが入った状態。 ホームアプリ:デスクトップに該当するもの。 これ自身も入れ替えることが可能。 dynabook と xperia は両方とも標準ではなくホームアプリが差し替えられている。 N1はもともとのもの。 Desire は Sense UI という独自のもの。 標準のブラウザも入っていますが、iphone で使用しているのと同じ Webkitと呼ばれる ライブラリが使用されている。Safariのコアもwebkit。 とはいっても、Android はエミュレータで確認することが簡単なので、基本的には エミュレータで確認することになる。 Opera を持ってきて使用することも可能。 ・アプリケーションフレームワーク(Architecture の図の青色の箇所) Androidアプリを作成する場合は、勝手に使用される。 特別に意識する必要はない。 開発する際に eclipse で Android 1.6, 2.0等のバージョンを指定する。 Location manager : GPS等から位置情報を提供 Activity manager : 画面1枚1枚を管理するもの。 ・ライブラリ(Architecture の図の緑色の箇所) ほとんどオープンソース freeType, openGL, sQLite libc は gnu の libc ではない。 bionic と呼ばれるもので1から作成されている。 gnu だとGPL に引っかかるので、わざわざ1から作成されている。 gnuのlibc と違って、携帯電話などのフットプリントを小さくしないといけない環境を 想定して作成されている。 libc だからといって、gnuでビルド済みのものを持ってきても動かないかも。 linux からバイナリをもってくることはやめたほうがいいです。glibc での動作を想定 しているので。 linux でない gnu っていうと1つしかありませんが(Mac OS? Unix?)、そちらから持って くるのであれば、動くことが多いと聞いています。 ライブラリの中で1番注意しないといけない点は libc! glibc ではないので、必ずソースコードからリビルドして使用してください。 ・Android Runtime(Architecture の図の黄色の箇所) Dalvik VM Dalvik を想定してコンパイルされたものを動作させるもの。 PC に比べてメモリが少なく、CPUも遅い環境で動作できるように工夫されている。 いわゆるiアプリに比べると、かなり使えるライブラリがそろっている。 JavaIO, JavaSecurity 等ほとんどフルに使える。 通常のdesktop java とほとんど同じライブラリ環境でプログラムの作成ができる。 形態環境向けといいつつ、かなりフルスペック。 組み込み向けといいつつ2.0,2.2 では512MB以上ないと厳しい。 スマートフォン向け。 ARM 1GHz 以上ないと 2.x は動かすことが難しい。 dynabook はデュアルコアでたしか1GHz。 ・Linux Kernel(Architecture の図の赤色の箇所) 2.6系。Linux Kernelそのまま。 ========================================================== 13:36 少し休憩。端末を触ってみてください。 13:45 再開(予定) ========================================================== 端末を触りながら軽く雑談・質疑応答 IS01,docomoだとlynx。lynx を買いたいなら今月中に。 不確定情報ですが、端末がなくなるといううわさが。 (議事録注:「9月18日に販売再開する」ことが docomo からアナウンスされました。) au なら ISデビュー割の一番安いコースにすると、2年縛りだけど、ほとんどただ。 IrDAを使いたかったら今のところ IS01 でしか使えない。 素直にbluetoothを使ったほうがいい。 ■Androidアプリケーション概要 ○国際化 一般的な国際化:メッセージのみ Androidの国際化:メッセージに加え、画面レイアウトも変更可能。 例:11-10-09 America:2009年11月10日 England:2009年10月11日 実際には、国際化だけでなく解像度・dpi の違いなども 吸収できるようになっている。 キーボードがついていて横が標準なら横にする、キーボードがなくて縦が標準なら 縦レイアウトにする。 つまり環境に応じたレイアウトにできる。 Android のレイアウトを作るときには条件を指定してやると、そのとき用のレイアウトが 作れる。何も選択していない状態がデフォルトのレイアウト。 xperia は縦標準、IS-01 は横標準。解像度も違う。AZ はタッチパネルではない。 そういった情報をちゃんと用意しておいてやれば、ちゃんとレイアウトが勝手に切り替 わる。 言語だけではない。1個のアプリケーションでさまざまな環境に対応可能。 ○Intent Android アプリケーションは複数の activity で構成される。 iphone との違いでよくあげられるのは、 たとえば、ブラウザでツイッターのリンクをクリックしたときに、 twicca というアプリが開く。(同じブラウザ上でやることも可能) twicca から画像の共有サイトへ飛んだりできる。 バックボタンを押すと、ちゃんと戻れる。 iphone では難しい。ブラウザが最初に戻ってしまう。 1つのアプリケーションの中である Activity から 別のActivity を開く形になっている。 別のアプリケーションであっても、 Activity のスタックがそのまま積みあがっていき、 戻ることができる。これがAndroidの画面遷移。 バックボタンは標準でついている。 逆に順番をすっ飛ばそうと思うと手で書かないといけない。 アプリケーションがわかっていれば、呼び出し先を明示することも可能。 逆に、ブラウザから twicca を呼び出す場合、ブラウザはtwitterクライアントを知ら ないので「twitter のリンクを処理するもの」が呼び出される。 ブラウザを呼び出す場合、ブラウザが2個入っているとどちらのブラウザを使用するか の選択画面が出てくる。テキストエディタ等でも同様。 明示的に呼び出すのは面倒なのであまりやらない? 他のアプリに自分のアプリの設定画面はいじられたくないですよね。 いじられたくない場合、明示的に intent を選択します。 第1引数:アプリケーションの実行状態を保持するcontext 第2引数:呼び出すActivity 主に設定画面等で明示的に指定する。 暗黙的な intent ではたとえば、URI を渡して見られるものを選択してもらう。 第1引数:呼び出し先でする動作 第2引数:動作に対する対象 将来的に他のアプリが出てきたらそちらのアプリと組み合わせることができるという利点 がある。逆に言うと、自分のアプリケーションがどういった動作に対応しているかを宣言 しないといけない。 ○Preference データ永続化の1つ データ永続化の方法は3つあります。 ・ファイル(SDカードなどに入れる) ・SQLite ・Preference(実態はXMLファイル) Preference keyは任意。value は限定。 設定画面もPreferenceで実装されている。 設定を保持するのをかなり楽に作れる。 ファイルを置けるのは実質外部ストレージのみ。 参照権限が問題になる。 セキュリティが問題になる場合は SQLite or Preference。 単純に key, value でよければ preference。 SQLiteはちょっと癖がある。 ・サイズが大きくなりがち。 ・まだちょっとバグが残っている。 作り方によっては延々と処理が戻ってこなくなる。 負荷のかかる使い方をするならきちんとテストしないといけない。 通常 RDB では Open,Close がセットで使うのが普通ですが、 タイミングが悪いと障害が発生することがあり、その結果そのプロセスが生きている間は 2度と open ができなくなることがある。 DBインスタンスをcloseすると、ハマるのでやめましょう。openだけでいきましょう。 参照に関してはちゃんとcloseすること。 詳しくは「はてな Android SQLite」でぐぐってください。 Preference も国際化・環境対応が可能。 これらを使用して実際に作る形になります。 ■Androidセキュリティモデル概要 大まかに言うと2つで構成されています。 ・Linuxカーネル2.6系 のもの。 UID, GID で実行されるので、プロセスレベルで保護される。 インストールディレクトリにも適用される。SQLite, リソースファイルがここに入る。 SDカードなどの外部ストレージに入ったものには適用されません。 外部ストレージを使用する際には、セキュリティについては自分で対策を取らなければ いけない。 ・パーミッション機構 ネットワークや電話の機能を使用する際には、 「インストール時」にその機能を使用してもよいかどうかを確認する。 ちゃんと宣言をしていないと、その機能にアクセス時に、 エラーが発生する。 インストール時には宣言したものが一覧になって確認が取られる。 2つのセキュリティを組み合わせて Android のセキュリティが構成されている。 iphone に比べて審査がないので変なアプリも作れてしまう。 インストール時にちゃんと確認すること。 ========================================================== 14:34 休憩 14:45 まで休憩 ========================================================== AndroidZaurus さんのサイトで報告。 壁紙アプリがスパイウェアだった。 ネットを通じて壁紙を取得する以外にも個人情報(端末のID等、すぐには個人につなが らないものですが)を送付していた。 現在は Market から削除されている。 パーミッションがたくさん並んでいたり、意味不明な英語が書いてあったりする場合は、 気をつけましょう。 ■ワークショップ実習(Twitterクライアント作成) アーカイブを file->import としてプロジェクトを読み込んでください。 AVD:エミュレータを作りましょう。 AVDマネージャーでは バージョン(1.6, 2.0)や GoogleAPI を含むか含まないかを選択可能。 スキンは解像度等を選択できる。 最初の起動はちょっと時間がかかります。 通常のJavaでやると bin が出てきますが、Androidでは gen になります。 ・MainActivity.java 画面について記述したファイル。 ・R.java は自動生成される。逆に言うと手動で編集してはだめです。 ・layout 最初はGUIでやればOK。手打ちでも書ける。慣れたら手打ちが速い。 ・menu.xml @+id 自動生成されるR.java に 追加される。 ・ライフサイクル 起動するとどれが呼ばれるということが決まっている。 MainActivity に記述されている。 ・エミュレータで実行 Run を押して実行。 ・設定画面を作る 設定ボタンを押したときに出てくるメニューも すべて PreferenceActivity が使用されている。 設定画面を作るのは非常に簡単。 ========================================================== 15:36 休憩開始 15:40 ========================================================== まだonCreateしか作っていない。 画面が破棄される際の動作も記述できる。 ・設定を保存する onDestroyを作ってその中で commit する。 非常に簡単に作れます。 ・twitterクライアントの認証について twitterは以前はbasic認証が使用可能だったのですが、 現在はOAuth が必要です。 twitter4j(BSDライセンスなので明示すればOK) OAuth は基本的には http を使用した認証プロトコル。 現在は実は通信部分でエラーが発生しています。 Perspective->other->DDMS logが吐き出されています。 エラーを出す前にlogをクリアすると、見やすいです。 ・パブリックタイムラインを表示する TableLayout の下に、TableRow を作って、 さらにtextViewを作る。 行数が分かっていない場合は、プログラムの中でTableRow を 必要なだけ生成する。 ・findViewByID ID を指定することでその要素を取得できる。 ・textview テキストを表示するための ・ユーザー名を表示するためのもの table に追加するためにこれらを addveiw で追加する。 これでタイムラインがずらずらっと表示されるはず。 スクリーン名が表示されました。 ユーザー名と同じようにしてほかも表示できる。 ちゃんとスクロールもできる。更新も可能。 R.id から定数が取れる。逆に、設定することもできる。 動的に生成する場合に必要。 何かを押した時に、それに対応して何かを動作させるのであれば、イベントハンドラを 作って対応します. 実用的なtwiccaのようなものを作ろうとすると、もっとレイアウトにこらないといけない。 ■最後に 基本的にはJavaで書ける。ほとんどデスクトップでの Java と同じ。 画面要素の更新等はAndroidに従わないといけない。 Menuはもともと用意されているので、それを使用。 menu.xml を編集することで、メニューを押したときのボタンの数も変更可能。 文字列だけでなくイメージも使える。 動的に処理を書ける部分は実際に試してみないと、どうするべきかは簡単にはわからない。 今回のように子要素に追加していくなど。 レイアウトはたくさんの種類が用意されているので、興味のある方は調べて使ってみて ください。 実際にいろいろ置いてみて試してもらうのがよいかと思います。 デバッグに関してはほとんど話せませんでしたが、エミュレータを使用して、 ブレークポイントを指定したり、ログ等を取ったり出来るので、 非常に充実しています。 Androidでは 「厳密にはこれが必ず入っている」と断言できるものは無い。 Android Market に追加するのに、全部のプラットフォームで動くことを目指すのは 非常に困難。 今日のワークショップでこんな感じなんだ、ということは伝わったかと思います。 名古屋支部や、大阪への参加も時々しています。 スライド・ソースコードはSWEST12のサイトに置く予定です。 ■議事録まとめ はじめに、実際の Android 端末に触れながら、Android全体と Android アプリの概要について学んだ。 実習では、用意されたスケルトンを元にしてパブリックタイムラインを表示できる 簡単な twitter クライアントを作成した。実習を通して、twitter で必要な認証方式や Android アプリ開発で重要な概念となる Activity、Intent、Layout 等について学んだ。 以上。