2009年4月24日金曜日



ご迷惑をおかけして申し訳ありません。


以前のエントリで告知させていただいたセミナーへ申し込みされた方との連絡が困難な為、申し込みフォームを変更させていただきました。


5/15(金)のセミナーはこちらから


5/16(土)のセミナーはこちらからお申し込みください。


すでにお申し込みいただいた方はこちらからの連絡を試みますが、atnd内でニックネームを割り当てている場合はメールアドレスが不明になる為、連絡ができません。


当方より連絡がない場合は大変お手数おかけして申し訳ありませんが、


brilliant.android@gmail.com(@は半角にしてください)


までご連絡ください。m(_ _)m





2009/5/15(金)、5/16(土)のAndroidアプリ開発セミナーの申し込みフォームを変更しました



ご迷惑をおかけして申し訳ありません。


以前のエントリで告知させていただいたセミナーへ申し込みされた方との連絡が困難な為、申し込みフォームを変更させていただきました。


5/15(金)のセミナーはこちらから


5/16(土)のセミナーはこちらからお申し込みください。


すでにお申し込みいただいた方はこちらからの連絡を試みますが、atnd内でニックネームを割り当てている場合はメールアドレスが不明になる為、連絡ができません。


当方より連絡がない場合は大変お手数おかけして申し訳ありませんが、


brilliant.android@gmail.com(@は半角にしてください)


までご連絡ください。m(_ _)m





2009年4月18日土曜日



f:id:bs-android:20090416143038p:image


簡易テキストエディタ TextEditorLite を作ってみました。


ソースファイルはここからダウンロードしてください。


入門資料としてお使いくださいませ。





勉どろいどチーム 和泉憲二


アプリケーションの使用方法


 アプリケーション起動後、画面全面が編集画面になっています。ファイルの読み込み・保存を行う場合は、MENUキーを押下します。


現在、以下の項目について操作が可能です。




  • 新規作成(New)

  • ファイルを開く(Open)

  • 保存(Save)

  • 名前を付けてファイルを保存(Save as..)


デフォルトの読み込み・保存場所をSDとしているので、エミュレータで動作させる場合はSDカードイメージを用意した上、起動してください。


エミュレータ上でのSDカードの利用についてはadamrockerさんが詳しく解説されていますので、こちらをご覧下さい。


なお、日本語のテキストをあらかじめ用意する場合はUTF-8で保存してください。





アプリケーションの解説


メニューのアイコンは、システムリソース(android.R.drawable)で用意されているものを利用しています。


ファイルを開くアイコンが用意されていないので、ファイル保存のアイコンで代用しました。


今回のアプリケーション作成におけるテーマは以下の2点です




  • アクティビティ間のデータの受け渡し(インテントの使用)

  • ファイルリスト表示画面の作成


それでは、順を追って解説していきます。





アクティビティ間のデータの受け渡し(インテントの使用)


 編集画面アクティビティ(TxtEditLite)とファイルリスト表示画面アクティビティ(FileList)間でファイル名等を受け渡すために、インテントを使用します。


本アプリケーションにおける、インテントの仕様は以下の通りです。










インテント名
MODE“OPEN” ファイルを開く “SAVE” ファイルを保存
DIRPATH文字列 ディレクトリパス名
FILENAME文字列 ファイル名
FILEPATH文字列 ファイルフルパス名(DIRPATH+FILENAME)

ファイルリスト表示画面アクティビティへ遷移する前に、インテントMODEに値(“OPEN”または”SAVE”)を設定する事により、ファイルリスト表示画面アクティビティのタイトル名を切り替えています。


また、ファイル選択後、OKボタンを押下する事により、インテントDIRPATH,FILENAME,FILEPATH にそれぞれ選択結果の値を設定し、呼び出し元アクティビティ(本アプリケーションの場合は編集画面アクティビティ)で設定された値を参照する事が出来ます。





ファイルリスト表示画面の作成


 ファイルリスト表示画面は、ListActivityを拡張する形でファイルリスト表示画面アクティビティとして実装しています。(FileList.java)


ファイルリストの構築・表示は以下の手順で行っています。




  1. ArrayAdapterに対し、java.io.Fileで用意されているFileクラスで取得したディレクトリ・ファイルのリストを設定。

  2. ListActivityに対し、1で作成したArrayAdaptorを設定(setListAdapter)。

  3. ListActivityに定義されているListViewにファイルリストが表示される。


解説は以上です。


もし、内容に間違い等がありましたらご指摘いただけると幸いです。





簡易テキストエディタ TextEditorLite を作ってみました



f:id:bs-android:20090416143038p:image


簡易テキストエディタ TextEditorLite を作ってみました。


ソースファイルはここからダウンロードしてください。


入門資料としてお使いくださいませ。





勉どろいどチーム 和泉憲二


アプリケーションの使用方法


 アプリケーション起動後、画面全面が編集画面になっています。ファイルの読み込み・保存を行う場合は、MENUキーを押下します。


現在、以下の項目について操作が可能です。




  • 新規作成(New)

  • ファイルを開く(Open)

  • 保存(Save)

  • 名前を付けてファイルを保存(Save as..)


デフォルトの読み込み・保存場所をSDとしているので、エミュレータで動作させる場合はSDカードイメージを用意した上、起動してください。


エミュレータ上でのSDカードの利用についてはadamrockerさんが詳しく解説されていますので、こちらをご覧下さい。


なお、日本語のテキストをあらかじめ用意する場合はUTF-8で保存してください。





アプリケーションの解説


メニューのアイコンは、システムリソース(android.R.drawable)で用意されているものを利用しています。


ファイルを開くアイコンが用意されていないので、ファイル保存のアイコンで代用しました。


今回のアプリケーション作成におけるテーマは以下の2点です




  • アクティビティ間のデータの受け渡し(インテントの使用)

  • ファイルリスト表示画面の作成


それでは、順を追って解説していきます。





アクティビティ間のデータの受け渡し(インテントの使用)


 編集画面アクティビティ(TxtEditLite)とファイルリスト表示画面アクティビティ(FileList)間でファイル名等を受け渡すために、インテントを使用します。


本アプリケーションにおける、インテントの仕様は以下の通りです。










インテント名
MODE“OPEN” ファイルを開く “SAVE” ファイルを保存
DIRPATH文字列 ディレクトリパス名
FILENAME文字列 ファイル名
FILEPATH文字列 ファイルフルパス名(DIRPATH+FILENAME)

ファイルリスト表示画面アクティビティへ遷移する前に、インテントMODEに値(“OPEN”または”SAVE”)を設定する事により、ファイルリスト表示画面アクティビティのタイトル名を切り替えています。


また、ファイル選択後、OKボタンを押下する事により、インテントDIRPATH,FILENAME,FILEPATH にそれぞれ選択結果の値を設定し、呼び出し元アクティビティ(本アプリケーションの場合は編集画面アクティビティ)で設定された値を参照する事が出来ます。





ファイルリスト表示画面の作成


 ファイルリスト表示画面は、ListActivityを拡張する形でファイルリスト表示画面アクティビティとして実装しています。(FileList.java)


ファイルリストの構築・表示は以下の手順で行っています。




  1. ArrayAdapterに対し、java.io.Fileで用意されているFileクラスで取得したディレクトリ・ファイルのリストを設定。

  2. ListActivityに対し、1で作成したArrayAdaptorを設定(setListAdapter)。

  3. ListActivityに定義されているListViewにファイルリストが表示される。


解説は以上です。


もし、内容に間違い等がありましたらご指摘いただけると幸いです。





2009年4月17日金曜日



f:id:bs-android:20090322095729p:image


最近、Androidの案件自体がかなり増えてきています。


「Androidの開発案件を請けたいがAndroidアプリ開発経験がない」とお悩みの企業様のお話や、「自社でAndroidアプリを開発したいが取っ掛かりが欲しい」という要望もあり、弊社では技術者向けのプライベートセミナーなども行っております。


OHAに加入しているDoCoMoさんからAndroid端末が今年中に発売されるとウワサされており、今後一層Android案件が増えるのは間違いありません。


そこで、2009/5/15(金)、5/16(土)に弊社主催でAndroidアプリ開発のセミナーを開催する運びとなりました。


Androidアプリケーション開発初心者向けの内容ですが、このセミナーでAndroidの基本的な仕組みを学習し、実際のアプリケーション開発にすんなり入れるようになります。


2009/5/15(金)


時間

13:00~17:30


定員

20名


参加費

30,000円


内容



  • Androidアプリケーション開発初級編


    • Androidの概要説明

    • 開発環境の構築

    • 基礎編前編


      • Hello World

      • アクティビティ

      • インテント

      • ライフサイクル



    • 基礎編中編


      • レイアウト

      • ウィジェット

      • パーミッション

      • インテントフィルタ

      • アクティビティの遷移、値の受け渡し



    • 基礎編後編


      • 画面の回転

      • メニュー

      • ログ出力



    • 実践編


      • Twitterクライアントを作ってみる






講演者



  • 株式会社クレイジーワークス 代表取締役総裁 村上福之さん

  • 株式会社ブリリアントサービス 代表取締役 杉本礼彦

  • 株式会社ブリリアントサービス 技術部研究開発科Android担当リーダ 近藤昭雄


申込みフォーム






2009/5/16(土)


時間

13:00~17:30


定員

20名


参加費

30,000円


内容

5/15(金)と同じ内容。


講演者



  • 株式会社クレイジーワークス 代表取締役総裁 村上福之さん

  • 株式会社ブリリアントサービス 代表取締役 杉本礼彦

  • 株式会社ブリリアントサービス 技術部研究開発科Android担当リーダ 近藤昭雄


申込みフォーム






開催場所



大きな地図で見る




  • 交通:電車


    • 地下鉄東京メトロ丸ノ内線・南北線「後楽園」駅より徒歩7分

    • JR中央線・総武線「飯田橋」駅より徒歩8分

    • (地下鉄東京メトロ東西線・南北線・有楽町線・都営大江戸線「飯田橋」駅が連結)



  • 交通:都バス バス停留所表


    • 都営バス 飯64・上69「大曲」バス停下車 正面

    • (「高田馬場駅前」より17分 「江戸川橋より」5分「飯田橋駅前」より4分 「上野公園」より14分)






  • 所在地


    • 〒112-0004 東京都文京区後楽2-23-12 Holic House2F




スタジオ・フェザーのスタジオAです。


「美容にいいビタミンC放出の空気清浄機」が設置されています。


必要なもの




  • Eclipseがそれなりの速度で使用できるノートパソコン


必要ないもの




  • Javaの経験


あると良いもの




  • やる気


その他


セミナー資料と開発環境がセットになったUSBメモリをプレゼントいたします。





2009/5/15(金)、5/16(土)にAndroidアプリ開発セミナーを開催します



f:id:bs-android:20090322095729p:image


最近、Androidの案件自体がかなり増えてきています。


「Androidの開発案件を請けたいがAndroidアプリ開発経験がない」とお悩みの企業様のお話や、「自社でAndroidアプリを開発したいが取っ掛かりが欲しい」という要望もあり、弊社では技術者向けのプライベートセミナーなども行っております。


OHAに加入しているDoCoMoさんからAndroid端末が今年中に発売されるとウワサされており、今後一層Android案件が増えるのは間違いありません。


そこで、2009/5/15(金)、5/16(土)に弊社主催でAndroidアプリ開発のセミナーを開催する運びとなりました。


Androidアプリケーション開発初心者向けの内容ですが、このセミナーでAndroidの基本的な仕組みを学習し、実際のアプリケーション開発にすんなり入れるようになります。


2009/5/15(金)


時間

13:00~17:30


定員

20名


参加費

30,000円


内容



  • Androidアプリケーション開発初級編


    • Androidの概要説明

    • 開発環境の構築

    • 基礎編前編


      • Hello World

      • アクティビティ

      • インテント

      • ライフサイクル



    • 基礎編中編


      • レイアウト

      • ウィジェット

      • パーミッション

      • インテントフィルタ

      • アクティビティの遷移、値の受け渡し



    • 基礎編後編


      • 画面の回転

      • メニュー

      • ログ出力



    • 実践編


      • Twitterクライアントを作ってみる






講演者



  • 株式会社クレイジーワークス 代表取締役総裁 村上福之さん

  • 株式会社ブリリアントサービス 代表取締役 杉本礼彦

  • 株式会社ブリリアントサービス 技術部研究開発科Android担当リーダ 近藤昭雄


申込みフォーム






2009/5/16(土)


時間

13:00~17:30


定員

20名


参加費

30,000円


内容

5/15(金)と同じ内容。


講演者



  • 株式会社クレイジーワークス 代表取締役総裁 村上福之さん

  • 株式会社ブリリアントサービス 代表取締役 杉本礼彦

  • 株式会社ブリリアントサービス 技術部研究開発科Android担当リーダ 近藤昭雄


申込みフォーム






開催場所



大きな地図で見る




  • 交通:電車


    • 地下鉄東京メトロ丸ノ内線・南北線「後楽園」駅より徒歩7分

    • JR中央線・総武線「飯田橋」駅より徒歩8分

    • (地下鉄東京メトロ東西線・南北線・有楽町線・都営大江戸線「飯田橋」駅が連結)



  • 交通:都バス バス停留所表


    • 都営バス 飯64・上69「大曲」バス停下車 正面

    • (「高田馬場駅前」より17分 「江戸川橋より」5分「飯田橋駅前」より4分 「上野公園」より14分)






  • 所在地


    • 〒112-0004 東京都文京区後楽2-23-12 Holic House2F




スタジオ・フェザーのスタジオAです。


「美容にいいビタミンC放出の空気清浄機」が設置されています。


必要なもの




  • Eclipseがそれなりの速度で使用できるノートパソコン


必要ないもの




  • Javaの経験


あると良いもの




  • やる気


その他


セミナー資料と開発環境がセットになったUSBメモリをプレゼントいたします。





2009年4月16日木曜日



Think ITさんのサイトで、弊社杉本が組み込み開発のススメ第3回:Androidによる開発の記事を書きました。


アクティビティのライフサイクルについての解説と動画再生アプリについて書いています。


アプリの領域ですが、よろしければご覧くださいませ。





Think ITさんでAndroid開発の記事を書きました



Think ITさんのサイトで、弊社杉本が組み込み開発のススメ第3回:Androidによる開発の記事を書きました。


アクティビティのライフサイクルについての解説と動画再生アプリについて書いています。


アプリの領域ですが、よろしければご覧くださいませ。





2009年4月15日水曜日



f:id:bs-android:20090414162235p:image


SDK 1.5のプレビュー版がリリースされました。


http://developer.android.com/sdk/preview/


今回から過去のヴァージョンのSDKを含むようになっていて、1.1のヴァージョンも含まれています。


プレビュー版だけの仕様かどうかはわかりませんが、


従来のエミュレータと大分使い方が変わっています。


ダウンロードして解凍しただけでは、今までのようにemulatorを起動することができません。


エミュレータの起動方法


エミュレータを起動させるには、まずAVD(Android Virtual Device)と呼ばれる仮想マシンを作成する手順が必要になっています。


SDK1.1の仮想デバイスを作成する場合は


android-sdk-windows-1.5_pre/toolsディレクトリで



android create avd --target 1 --name sdk1.1


と入力して仮想マシンを作成します。


SDK1.5の仮想デバイスを作成する場合は


同じくandroid-sdk-windows-1.5_pre/toolsディレクトリで



android create avd --target 2 --name sdk1.5


と入力して仮想マシンを作成します。


sdk1.1、sdk1.5の部分は好きなように名前をつけることが出来ます。


エミュレータを起動する時には以下のように仮想マシンを指定してやる必要があります。



emulator -avd sdk1.5


これでcupcake版のSDK1.5のエミュレータが起動します。


f:id:bs-android:20090414151659p:image


ブートのアニメーションが変わっています。


なお、タオソフトウェアさんがで新しいEclipseのプラグインについて詳しく解説されています。


待受け画面


f:id:bs-android:20090414151749p:image


タブを引っ張ったところ


f:id:bs-android:20090414151841p:image


Camcorder


起動してみましたが、ダミー画像も用意されていないようで上手く動かないようです。


#一度エミュレータを落とさないと元に戻れない場合もあります。


f:id:bs-android:20090414152011p:image


Cameraも同じくダメでした。


インプットメソッド


f:id:bs-android:20090414152101p:image


中国語の入力が出来るようになっていました。


f:id:bs-android:20090414152142p:image


f:id:bs-android:20090414152140p:image


ロケール


f:id:bs-android:20090414154008p:image


長押しするとApplyのポップアップがでます。


f:id:bs-android:20090414154007p:image


f:id:bs-android:20090414154003p:image


f:id:bs-android:20090414154002p:image


電話帳


f:id:bs-android:20090414154133p:image


設定画面


f:id:bs-android:20090414154209p:image


f:id:bs-android:20090414154206p:image


f:id:bs-android:20090414154205p:image





Android SDK 1.5プレビュー版最速レポート



f:id:bs-android:20090414162235p:image


SDK 1.5のプレビュー版がリリースされました。


http://developer.android.com/sdk/preview/


今回から過去のヴァージョンのSDKを含むようになっていて、1.1のヴァージョンも含まれています。


プレビュー版だけの仕様かどうかはわかりませんが、


従来のエミュレータと大分使い方が変わっています。


ダウンロードして解凍しただけでは、今までのようにemulatorを起動することができません。


エミュレータの起動方法


エミュレータを起動させるには、まずAVD(Android Virtual Device)と呼ばれる仮想マシンを作成する手順が必要になっています。


SDK1.1の仮想デバイスを作成する場合は


android-sdk-windows-1.5_pre/toolsディレクトリで



android create avd --target 1 --name sdk1.1


と入力して仮想マシンを作成します。


SDK1.5の仮想デバイスを作成する場合は


同じくandroid-sdk-windows-1.5_pre/toolsディレクトリで



android create avd --target 2 --name sdk1.5


と入力して仮想マシンを作成します。


sdk1.1、sdk1.5の部分は好きなように名前をつけることが出来ます。


エミュレータを起動する時には以下のように仮想マシンを指定してやる必要があります。



emulator -avd sdk1.5


これでcupcake版のSDK1.5のエミュレータが起動します。


f:id:bs-android:20090414151659p:image


ブートのアニメーションが変わっています。


なお、タオソフトウェアさんがで新しいEclipseのプラグインについて詳しく解説されています。


待受け画面


f:id:bs-android:20090414151749p:image


タブを引っ張ったところ


f:id:bs-android:20090414151841p:image


Camcorder


起動してみましたが、ダミー画像も用意されていないようで上手く動かないようです。


#一度エミュレータを落とさないと元に戻れない場合もあります。


f:id:bs-android:20090414152011p:image


Cameraも同じくダメでした。


インプットメソッド


f:id:bs-android:20090414152101p:image


中国語の入力が出来るようになっていました。


f:id:bs-android:20090414152142p:image


f:id:bs-android:20090414152140p:image


ロケール


f:id:bs-android:20090414154008p:image


長押しするとApplyのポップアップがでます。


f:id:bs-android:20090414154007p:image


f:id:bs-android:20090414154003p:image


f:id:bs-android:20090414154002p:image


電話帳


f:id:bs-android:20090414154133p:image


設定画面


f:id:bs-android:20090414154209p:image


f:id:bs-android:20090414154206p:image


f:id:bs-android:20090414154205p:image





2009年4月11日土曜日



f:id:bs-android:20090322095729p:image


4/11(土)に行われたGoogle App Engineのハッカソンに参加してきました。


実機のAndroidから簡単に呼び出せるアカウント管理のバックエンドサーバーを作成しました。


Pythonはほぼ初心者の状態で、前半はかなりとまどいましたが、後半2割ぐらいで追い上げ、アカウント登録、削除、オンラインオフラインの更新の機能などを入れることが出来ました。


そして、Android側のアプリも作成してDevPhone1を使用してプレゼンを行いました。


Web系の方が多く、Android端末を見たことがない方も多かったようで、なかなか好評でした。


Google App Engineの基本は理解できたので、AndroidとGAEサーバーを連携したアプリが、今後楽に開発できるようになりました。


Androidで気軽にオンラインのアカウント管理が使えるフレームワークを育てていきたいと思います。


ソースコードと使い方は整理し次第公開しようと思います。





Google App EngineのハッカソンでAndroidのバックエンドサーバーを作りました



f:id:bs-android:20090322095729p:image


4/11(土)に行われたGoogle App Engineのハッカソンに参加してきました。


実機のAndroidから簡単に呼び出せるアカウント管理のバックエンドサーバーを作成しました。


Pythonはほぼ初心者の状態で、前半はかなりとまどいましたが、後半2割ぐらいで追い上げ、アカウント登録、削除、オンラインオフラインの更新の機能などを入れることが出来ました。


そして、Android側のアプリも作成してDevPhone1を使用してプレゼンを行いました。


Web系の方が多く、Android端末を見たことがない方も多かったようで、なかなか好評でした。


Google App Engineの基本は理解できたので、AndroidとGAEサーバーを連携したアプリが、今後楽に開発できるようになりました。


Androidで気軽にオンラインのアカウント管理が使えるフレームワークを育てていきたいと思います。


ソースコードと使い方は整理し次第公開しようと思います。





2009年3月29日日曜日



f:id:bs-android:20090122021549g:image


日本Androidの会の関西支部の活動報告です。


2009/3/28に第2回ハンズオンセミナーin大阪を開催しました。


会場提供していただいた株式会社パソナテックさま、どうもありがとうございました。




  • 公演内容



「OpenGL事始め」(宮川彬央さん)


OpenGLの入門編で取っ掛かり安い内容でした。


 講演資料


 プロジェクトファイル一式


「GPSはじめの一歩」(山本慎也さん)


GPSの入門編です。2点間の距離の計算やDDMSでのGPSエミュレーションの方法等、はじめの一歩以上の充実した内容でした。


 講演資料


 プロジェクトファイル一式


PIAX(P2P Interactive Agent eXtensions) on Androidの挑戦」(吉田幹さん)


PIAXとAndroidの熱いお話し。60ページ近くに及ぶ膨大なドキュメントは圧巻です。


「個人の技術者が世界を変える!」という熱い話は聞き応えがありました。


 講演資料


「もっとServiceしよう」(有山圭二さん)


AIDLを使用してサービスを実装するハンズオン。


サービスについて知れば知るほど使い道が難しいとおっしゃっていたのが印象的でした。


 講演資料


 プロジェクト一式


「動画再生アプリ」(杉本礼彦)


簡単な動画再生アプリ作成のハンズオンを行いました。うまく再生できるか心配でしたが、うまく行ってよかったです。


 講演資料


 サンプル動画



参加された皆様、どうもありがとうございました。


お疲れ様でした。


4月には弊社は新事務所に引越しいたします。


引越し後には弊社オフィスのあるビルの会議室を利用して


弊社主催でセミナーを開催したいと思います!


よろしくおねがいします。





第2回Androidハンズオンセミナーin大阪レポート



f:id:bs-android:20090122021549g:image


日本Androidの会の関西支部の活動報告です。


2009/3/28に第2回ハンズオンセミナーin大阪を開催しました。


会場提供していただいた株式会社パソナテックさま、どうもありがとうございました。




  • 公演内容



「OpenGL事始め」(宮川彬央さん)


OpenGLの入門編で取っ掛かり安い内容でした。


 講演資料


 プロジェクトファイル一式


「GPSはじめの一歩」(山本慎也さん)


GPSの入門編です。2点間の距離の計算やDDMSでのGPSエミュレーションの方法等、はじめの一歩以上の充実した内容でした。


 講演資料


 プロジェクトファイル一式


PIAX(P2P Interactive Agent eXtensions) on Androidの挑戦」(吉田幹さん)


PIAXとAndroidの熱いお話し。60ページ近くに及ぶ膨大なドキュメントは圧巻です。


「個人の技術者が世界を変える!」という熱い話は聞き応えがありました。


 講演資料


「もっとServiceしよう」(有山圭二さん)


AIDLを使用してサービスを実装するハンズオン。


サービスについて知れば知るほど使い道が難しいとおっしゃっていたのが印象的でした。


 講演資料


 プロジェクト一式


「動画再生アプリ」(杉本礼彦)


簡単な動画再生アプリ作成のハンズオンを行いました。うまく再生できるか心配でしたが、うまく行ってよかったです。


 講演資料


 サンプル動画



参加された皆様、どうもありがとうございました。


お疲れ様でした。


4月には弊社は新事務所に引越しいたします。


引越し後には弊社オフィスのあるビルの会議室を利用して


弊社主催でセミナーを開催したいと思います!


よろしくおねがいします。





2009年3月24日火曜日



AndroidでJNIを使う方法をドキュメントにまとめました。


PDF版はこちら


Androidのコンパイル環境を構築されていることが前提です。


よろしければAndroidのコンパイル環境を整える方法にあるPDFのコンパイル環境構築資料をご覧ください。



AndroidでJNI – Android meets JNI


株式会社ブリリアントサービス 勉どろいどチーム 


                   和泉憲二


                   門口敏広


                   藤田竜史





 このドキュメントでは、androidアプリケーション(Dalvik VM)からJNI(Java Native Interface)を使用して、C/C++言語で作成した共有ライブラリのJNIメソッドをコールする、一連の方法について解説します。


開発環境

本ドキュメントでは、以下の開発環境が用意されている事を前提に、説明を進めます。








用意する環境本ドキュメントにおける確認済みの環境
androidアプリケーション開発環境(eclipse + android ADT)WindowsXP SP3上
JDK開発環境WindowsXP SP3上のJDK 1.6.0.12
android build環境*1WindowsXP SP3のVMware上にUbuntu Linux 8.04日本語版で構築

本ドキュメントで作成する、サンプルアプリケーションの説明


androidアプリ側からJNIメソッドをコールし、JNIメソッドより返却された文字列をandroidアプリのTextViewで描画します。







androidアプリケーションJNItestJNIメソッドから返却された文字列をTextViewを使用して画面上に表示する。
共有ライブラリモジュールlibJNItestNativeコールされた戻り値として、文字列を返却する。

また今回作成するネイティブメソッドの仕様は、以下の通りとします。









ネイティブメソッド名getTestStringFromNative
引数なし
戻り値String
説明戻り値として、“from Native Code String”という文字列を返却します。




1.android アプリケーション JNItest の作成

androidアプリケーションの作成

まず、JNIヘッダの生成を行うために、ライブラリのロードとネイティブメソッド定義を含むソースコードを作成します。


eclipseのandroid ADTを使用し、以下の構成で新規プロジェクトの作成を行います。









プロジェクト名JNItest
パッケージ名jp.co.brilliantservice.JNItestPkg
アクティビティー名JNItest
アプリケーション名JNItest

f:id:bs-android:20090324114821p:image


次に、TextViewにJNIメソッドからの返却文字列を設定するために、レイアウトファイル(main.xml)の編集を行います。


パッケージエクスプローラーの [JNItest]-[res]-[layout]-main.xmlを以下のように編集します。



01 : <?xml version="1.0" encoding="utf-8"?>
02 : <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03 : android:orientation="vertical"
04 : android:layout_width="fill_parent"
05 : android:layout_height="fill_parent"
06 : >
07 : <TextView
08 : android:id="@+id/txtTest"
09 : android:layout_width="fill_parent"
10 : android:layout_height="wrap_content"
11 : />
12 : </LinearLayout>


8行目にandroid id txtTest定義を付加し、ウィザードで自動生成されるhello world文字列の表示を削除します。


次に、JNItest.javaの編集を行います。



01 : package jp.co.brilliantservice.JNItestPkg;
02 :
03 : import android.app.Activity;
04 : import android.os.Bundle;
05 : import android.widget.TextView;
06 :
07 : public class JNItest extends Activity {
08 : static {
09 : // ライブラリをロード
10 : System.loadLibrary("JNItestNative");
11 : }
12 : // ネイティブメソッドを定義
13 : public native String getTestStringFromNative();
14 :
15 : /** Called when the activity is first created. */
16 : @Override
17 : public void onCreate(Bundle savedInstanceState) {
18 : super.onCreate(savedInstanceState);
19 : setContentView(R.layout.main);
20 :
21 : // ネイティブメソッドをコールして文字列を取得
22 : String strText = getTestStringFromNative();
23 :
24 : // 取得文字列をTextViewに設定
25 : TextView txtTest = (TextView)findViewById(R.id.txtTest);
26 : txtTest.setText(strText);
27 : }
28 : }


10行目で共有ライブラリのロードを行います。また、13行目ではネイティブメソッドの定義を行っています。





JNIヘッダファイルの生成

「androidアプリケーションの作成」で、eclipse上でのコンパイルが正常に行われ、以下のディレクトリにJNItest.classが生成されている事を確認します。


JNItest\bin\jp\co\brilliantservice\JNItestPkg\


次に、javah(JDK付属のJNIヘッダ作成ツール)を使用して、JNI実装用のC/C++言語ヘッダを生成します。


コマンドプロンプトを起動し、eclipseプロジェクトのJNItestディレクトリにcd で移動の上、以下のコマンドを実行します。



JNItest>javah -classpath bin -d jni jp.co.brilliantservice.JNItestPkg.JNItest


ディレクトリJNItest\jniにjp_co_brilliantservice_JNItestPkg_JNItest.h が生成されます。このファイルが、JNIヘッダファイルです。



JNIヘッダファイル jp_co_brilliantservice_JNItestPkg_JNItest.h



01 : /* DO NOT EDIT THIS FILE - it is machine generated */
02 : #include <jni.h>
03 : /* Header for class jp_co_brilliantservice_JNItestPkg_JNItest */
04 :
05 : #ifndef _Included_jp_co_brilliantservice_JNItestPkg_JNItest
06 : #define _Included_jp_co_brilliantservice_JNItestPkg_JNItest
07 : #ifdef __cplusplus
08 : extern "C" {
09 : #endif
10 : /*
11 : * Class: jp_co_brilliantservice_JNItestPkg_JNItest
12 : * Method: getTestStringFromNative
13 : * Signature: ()Ljava/lang/String;
14 : */
15 : JNIEXPORT jstring JNICALL Java_jp_co_brilliantservice_JNItestPkg_JNItest_getTestStringFromNative
16 : (JNIEnv *, jobject);
17 :
18 : #ifdef __cplusplus
19 : }
20 : #endif
21 : #endif






2.共有ライブラリ libJNItestNative.so の作成

文字列を返却するメソッドを、android build環境上にC言語で実装します。


その際、「JNIヘッダファイルの生成」 で自動生成した、JNIヘッダで宣言されているJNI関数プロトタイプに合わせて実装します。





本ドキュメントにおける、android build環境(ソースコードツリー)のビルドルート及び共有ライブラリ作成位置は以下の通りとします。








ビルドルート~/mydroid
共有ライブラリ作成位置~/mydroid/external/libJNItestNative
共有ライブラリファイル名libJNItestNative.so

上記共有ライブラリ作成位置には以下のファイルを作成または用意します。本項ではJNIメソッドの実装・Makefileの作成方法について説明します。








JNIメソッドソースファイル名GetTestStringFromNative.c
MakefileAndroid.mk
JNIヘッダファイルjp_co_brilliantservice_JNItestPkg_JNItest.h




JNIメソッドの実装

JNIのメソッドは以下のようなソースになります。


メソッド実行時に、単純に文字列を返却するのみのコードです。



getTestStringFromNative.c



1 : #include "jp_co_brilliantservice_JNItestPkg_JNItest.h"
2 :
3 : JNIEXPORT jstring JNICALL Java_jp_co_brilliantservice_JNItestPkg_JNItest_getTestStringFromNative
4 : ( JNIEnv *env, jobject obj )
5 : {
6 : return (*env)->NewStringUTF(env, (char *)"from Native Code String");
7 : }






Makefile 「Android.mk」の作成

androidの個別ビルド用Makefile 「Android.mk」 の作成を行います。



Android.mk



01 : LOCAL_PATH:= $(call my-dir)
02 :
03 : include $(CLEAR_VARS)
04 :
05 : LOCAL_SRC_FILES := \
06 : getTestStringFromNative.c
07 :
08 : LOCAL_C_INCLUDES := \
09 : $(JNI_H_INCLUDE) \
10 :
11 : LOCAL_MODULE := libJNItestNative
12 :
13 : LOCAL_PRELINK_MODULE := false
14 :
15 : include $(BUILD_SHARED_LIBRARY)



5・6行目にソースファイル名、11行目にライブラリモジュール名を定義しています。


上記をふまえ、androidでJNIを実現する上において、最も注目すべき点は、以下の3点です。




  • JNIヘッダをインクルードするための定義(9行目)

  • prelinkを解除するための定義(13行目)

  • 共有ライブラリをビルドするための定義(15行目)


prelink関連の情報については、後述のNote:でまとめます。





共有ライブラリのビルド

端末コンソールを起動の上、以下のコマンドを実行し、ディレクトリ内のみのビルドを行えるように、~/mydroid/build/ にある、envsetup.sh を評価しておきます。



$cd ~/mydroid
$. build/envsetup.sh


続いて、以下のコマンドを実行し、共有ライブラリ位置のビルドを行います。



$cd external/libJNItestNative/
$mm


ビルドが成功すると、以下のようにログが表示されます。



make: ディレクトリ `/home/kenken/mydroid' に入ります
build/core/product_config.mk:211: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
build/core/main.mk:180: implicitly installing apns-conf_sdk.xml
target thumb C: libJNItestNative <= /home/kenken/mydroid/external/libJNItestNative/getTestStringFromNative.c
target SharedLib: libJNItestNative (out/target/product/generic/obj/SHARED_LIBRARIES/libJNItestNative_intermediates/LINKED/libJNItestNative.so)
target Non-prelinked: libJNItestNative (out/target/product/generic/symbols/system/lib/libJNItestNative.so)
target Strip: libJNItestNative (out/target/product/generic/obj/lib/libJNItestNative.so)
Install: out/target/product/generic/system/lib/libJNItestNative.so
Finding NOTICE files: out/target/product/generic/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/target/product/generic/obj/NOTICE.html
gzip -c out/target/product/generic/obj/NOTICE.html > out/target/product/generic/obj/NOTICE.html.gz
make: ディレクトリ `/home/kenken/mydroid' から出ます


共有ライブラリ libJNItestNative.so は以下のディレクトリに格納されます。


~mydroid/out/target/product/generic/system/lib/





Note: prelink map 及び、共有ライブラリにおけるprelink定義について

androidの共有ライブラリはデフォルトでprelink mapというテキストファイルに、メモリマップテーブルに固定アドレスでマッピングするように構成されています。


(~/mydroid/build/core/prelink-linux-arm.map)


これは、メモリ上への頻繁なロード・アンロードを避け、速度アップをするための処置となっています。



~/mydroid/build/core/prelink-linux-arm.map (抜粋)



001 :
002 : # 0xC0000000 - 0xFFFFFFFF Kernel
003 : # 0xB0100000 - 0xBFFFFFFF Thread 0 Stack
004 : # 0xB0000000 - 0xB00FFFFF Linker
005 : # 0xA0000000 - 0xBFFFFFFF Prelinked System Libraries
006 : # 0x90000000 - 0x9FFFFFFF Prelinked App Libraries
007 : # 0x80000000 - 0x8FFFFFFF Non-prelinked Libraries
008 : # 0x40000000 - 0x7FFFFFFF mmap'd stuff
009 : # 0x10000000 - 0x3FFFFFFF Thread Stacks
010 : # 0x00000000 - 0x0FFFFFFF .text / .data / heap
011 :
012 : # core system libraries
013 : libdl.so 0xAFF00000



112 : libctest.so 0x9A700000
113 : libUAPI_jni.so 0x9A500000
114 : librpc.so 0x9A400000
115 : libtrace_test.so 0x9A300000
116 : libsrec_jni.so 0x9A200000



上記のように、prelink mapに登録するモジュール名及び固定アドレスを列挙して定義を行います。


しかし、固定アドレスにマッピングされるという事は、ビルドの度にシステムイメージまで作成し、入れ替えないといけないという事を意味しています。


これではJNIを使用するアプリケーションはインストールを自由に行うことが極めて困難であると言わざるを得ません。


Android.mkでは、デフォルト動作がprelink map有効となっており、prelink mapに共有ライブラリを登録しないと、ビルドエラーが発生してしまいます。



ビルドエラーの例



01 : ~/mydroid/external/libJNItestNative$ mm
02 : make: ディレクトリ `/home/kenken/mydroid' に入ります
03 : build/core/product_config.mk:211: WARNING: adding test OTA key
04 : ============================================
05 : TARGET_PRODUCT=generic
06 : TARGET_BUILD_VARIANT=eng
07 : TARGET_SIMULATOR=
08 : TARGET_BUILD_TYPE=release
09 : TARGET_ARCH=arm
10 : HOST_ARCH=x86
11 : HOST_OS=linux
12 : HOST_BUILD_TYPE=release
13 : BUILD_ID=
14 : ============================================
15 : build/core/main.mk:180: implicitly installing apns-conf_sdk.xml
16 : target thumb C: libJNItestNative <= /home/kenken/mydroid/external/libJNItestNative/getTestStringFromNative.c
17 : target SharedLib: libJNItestNative (out/target/product/generic/obj/SHARED_LIBRARIES/libJNItestNative_intermediates/LINKED/libJNItestNative.so)
18 : target Prelink: libJNItestNative (out/target/product/generic/symbols/system/lib/libJNItestNative.so)
19 : build/tools/apriori/prelinkmap.c(137): library 'libJNItestNative.so' not in prelink map
20 : make: *** [out/target/product/generic/symbols/system/lib/libJNItestNative.so] エラー 1
21 : make: ディレクトリ `/home/kenken/mydroid' から出ます



上記のビルドエラーの場合、19行目に、「prelink mapに含まれていない」(library 'libJNItestNative.so' not in prelink map)というエラーが確認できます。


prelink mapに登録せず、ビルドを行うためには、Android.mkに以下の1行を追加し、ビルドを行います。(prelink 無効化の定義)



LOCAL_PRELINK_MODULE := false





3.アプリケーションの実行

androidアプリ実行の前に、共有ライブラリ libJNItestNative.so を、あらかじめエミュレータの/sysytem/lib ディレクトリにコピーします。


1. コマンドプロンプトを起動し、androidエミュレータを以下のコマンドで起動します。



>start emulator


2. エミュレータ上のディレクトリ /system/lib への書き込みを有効にするために、以下のコマンドを実行します。



>adb remount


3. 共有ライブラリを /system/lib ディレクトリにコピーします。カレントディレクトリに、「2. 共有ライブラリ libJNItestNative.so の作成」で作成したモジュールをあらかじめ用意した上、以下のコマンドを実行します。



>adb push libJNItestNative.so /system/lib


4. androidエミュレータの起動を維持したままの状態で、eclipseからandroidアプリJNItestを


起動します。


起動に成功すると、以下のように実行結果が表示されます。


f:id:bs-android:20090324120809p:image



以上です。


もし、記述間違いなどがありましたらご指摘いただけると幸いです。




*1:androidのソースコードツリーでシステムイメージがbuild出来る環境。ソースの入手方法・ビルド環境構築方法については、こちらを参照。





AndroidでJNIを使う方法



AndroidでJNIを使う方法をドキュメントにまとめました。


PDF版はこちら


Androidのコンパイル環境を構築されていることが前提です。


よろしければAndroidのコンパイル環境を整える方法にあるPDFのコンパイル環境構築資料をご覧ください。



AndroidでJNI – Android meets JNI


株式会社ブリリアントサービス 勉どろいどチーム 


                   和泉憲二


                   門口敏広


                   藤田竜史





 このドキュメントでは、androidアプリケーション(Dalvik VM)からJNI(Java Native Interface)を使用して、C/C++言語で作成した共有ライブラリのJNIメソッドをコールする、一連の方法について解説します。


開発環境

本ドキュメントでは、以下の開発環境が用意されている事を前提に、説明を進めます。








用意する環境本ドキュメントにおける確認済みの環境
androidアプリケーション開発環境(eclipse + android ADT)WindowsXP SP3上
JDK開発環境WindowsXP SP3上のJDK 1.6.0.12
android build環境*1WindowsXP SP3のVMware上にUbuntu Linux 8.04日本語版で構築

本ドキュメントで作成する、サンプルアプリケーションの説明


androidアプリ側からJNIメソッドをコールし、JNIメソッドより返却された文字列をandroidアプリのTextViewで描画します。







androidアプリケーションJNItestJNIメソッドから返却された文字列をTextViewを使用して画面上に表示する。
共有ライブラリモジュールlibJNItestNativeコールされた戻り値として、文字列を返却する。

また今回作成するネイティブメソッドの仕様は、以下の通りとします。









ネイティブメソッド名getTestStringFromNative
引数なし
戻り値String
説明戻り値として、“from Native Code String”という文字列を返却します。




1.android アプリケーション JNItest の作成

androidアプリケーションの作成

まず、JNIヘッダの生成を行うために、ライブラリのロードとネイティブメソッド定義を含むソースコードを作成します。


eclipseのandroid ADTを使用し、以下の構成で新規プロジェクトの作成を行います。









プロジェクト名JNItest
パッケージ名jp.co.brilliantservice.JNItestPkg
アクティビティー名JNItest
アプリケーション名JNItest

f:id:bs-android:20090324114821p:image


次に、TextViewにJNIメソッドからの返却文字列を設定するために、レイアウトファイル(main.xml)の編集を行います。


パッケージエクスプローラーの [JNItest]-[res]-[layout]-main.xmlを以下のように編集します。



01 : <?xml version="1.0" encoding="utf-8"?>
02 : <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03 : android:orientation="vertical"
04 : android:layout_width="fill_parent"
05 : android:layout_height="fill_parent"
06 : >
07 : <TextView
08 : android:id="@+id/txtTest"
09 : android:layout_width="fill_parent"
10 : android:layout_height="wrap_content"
11 : />
12 : </LinearLayout>


8行目にandroid id txtTest定義を付加し、ウィザードで自動生成されるhello world文字列の表示を削除します。


次に、JNItest.javaの編集を行います。



01 : package jp.co.brilliantservice.JNItestPkg;
02 :
03 : import android.app.Activity;
04 : import android.os.Bundle;
05 : import android.widget.TextView;
06 :
07 : public class JNItest extends Activity {
08 : static {
09 : // ライブラリをロード
10 : System.loadLibrary("JNItestNative");
11 : }
12 : // ネイティブメソッドを定義
13 : public native String getTestStringFromNative();
14 :
15 : /** Called when the activity is first created. */
16 : @Override
17 : public void onCreate(Bundle savedInstanceState) {
18 : super.onCreate(savedInstanceState);
19 : setContentView(R.layout.main);
20 :
21 : // ネイティブメソッドをコールして文字列を取得
22 : String strText = getTestStringFromNative();
23 :
24 : // 取得文字列をTextViewに設定
25 : TextView txtTest = (TextView)findViewById(R.id.txtTest);
26 : txtTest.setText(strText);
27 : }
28 : }


10行目で共有ライブラリのロードを行います。また、13行目ではネイティブメソッドの定義を行っています。





JNIヘッダファイルの生成

「androidアプリケーションの作成」で、eclipse上でのコンパイルが正常に行われ、以下のディレクトリにJNItest.classが生成されている事を確認します。


JNItest\bin\jp\co\brilliantservice\JNItestPkg\


次に、javah(JDK付属のJNIヘッダ作成ツール)を使用して、JNI実装用のC/C++言語ヘッダを生成します。


コマンドプロンプトを起動し、eclipseプロジェクトのJNItestディレクトリにcd で移動の上、以下のコマンドを実行します。



JNItest>javah -classpath bin -d jni jp.co.brilliantservice.JNItestPkg.JNItest


ディレクトリJNItest\jniにjp_co_brilliantservice_JNItestPkg_JNItest.h が生成されます。このファイルが、JNIヘッダファイルです。



JNIヘッダファイル jp_co_brilliantservice_JNItestPkg_JNItest.h



01 : /* DO NOT EDIT THIS FILE - it is machine generated */
02 : #include <jni.h>
03 : /* Header for class jp_co_brilliantservice_JNItestPkg_JNItest */
04 :
05 : #ifndef _Included_jp_co_brilliantservice_JNItestPkg_JNItest
06 : #define _Included_jp_co_brilliantservice_JNItestPkg_JNItest
07 : #ifdef __cplusplus
08 : extern "C" {
09 : #endif
10 : /*
11 : * Class: jp_co_brilliantservice_JNItestPkg_JNItest
12 : * Method: getTestStringFromNative
13 : * Signature: ()Ljava/lang/String;
14 : */
15 : JNIEXPORT jstring JNICALL Java_jp_co_brilliantservice_JNItestPkg_JNItest_getTestStringFromNative
16 : (JNIEnv *, jobject);
17 :
18 : #ifdef __cplusplus
19 : }
20 : #endif
21 : #endif






2.共有ライブラリ libJNItestNative.so の作成

文字列を返却するメソッドを、android build環境上にC言語で実装します。


その際、「JNIヘッダファイルの生成」 で自動生成した、JNIヘッダで宣言されているJNI関数プロトタイプに合わせて実装します。





本ドキュメントにおける、android build環境(ソースコードツリー)のビルドルート及び共有ライブラリ作成位置は以下の通りとします。








ビルドルート~/mydroid
共有ライブラリ作成位置~/mydroid/external/libJNItestNative
共有ライブラリファイル名libJNItestNative.so

上記共有ライブラリ作成位置には以下のファイルを作成または用意します。本項ではJNIメソッドの実装・Makefileの作成方法について説明します。








JNIメソッドソースファイル名GetTestStringFromNative.c
MakefileAndroid.mk
JNIヘッダファイルjp_co_brilliantservice_JNItestPkg_JNItest.h




JNIメソッドの実装

JNIのメソッドは以下のようなソースになります。


メソッド実行時に、単純に文字列を返却するのみのコードです。



getTestStringFromNative.c



1 : #include "jp_co_brilliantservice_JNItestPkg_JNItest.h"
2 :
3 : JNIEXPORT jstring JNICALL Java_jp_co_brilliantservice_JNItestPkg_JNItest_getTestStringFromNative
4 : ( JNIEnv *env, jobject obj )
5 : {
6 : return (*env)->NewStringUTF(env, (char *)"from Native Code String");
7 : }






Makefile 「Android.mk」の作成

androidの個別ビルド用Makefile 「Android.mk」 の作成を行います。



Android.mk



01 : LOCAL_PATH:= $(call my-dir)
02 :
03 : include $(CLEAR_VARS)
04 :
05 : LOCAL_SRC_FILES := \
06 : getTestStringFromNative.c
07 :
08 : LOCAL_C_INCLUDES := \
09 : $(JNI_H_INCLUDE) \
10 :
11 : LOCAL_MODULE := libJNItestNative
12 :
13 : LOCAL_PRELINK_MODULE := false
14 :
15 : include $(BUILD_SHARED_LIBRARY)



5・6行目にソースファイル名、11行目にライブラリモジュール名を定義しています。


上記をふまえ、androidでJNIを実現する上において、最も注目すべき点は、以下の3点です。




  • JNIヘッダをインクルードするための定義(9行目)

  • prelinkを解除するための定義(13行目)

  • 共有ライブラリをビルドするための定義(15行目)


prelink関連の情報については、後述のNote:でまとめます。





共有ライブラリのビルド

端末コンソールを起動の上、以下のコマンドを実行し、ディレクトリ内のみのビルドを行えるように、~/mydroid/build/ にある、envsetup.sh を評価しておきます。



$cd ~/mydroid
$. build/envsetup.sh


続いて、以下のコマンドを実行し、共有ライブラリ位置のビルドを行います。



$cd external/libJNItestNative/
$mm


ビルドが成功すると、以下のようにログが表示されます。



make: ディレクトリ `/home/kenken/mydroid' に入ります
build/core/product_config.mk:211: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
build/core/main.mk:180: implicitly installing apns-conf_sdk.xml
target thumb C: libJNItestNative <= /home/kenken/mydroid/external/libJNItestNative/getTestStringFromNative.c
target SharedLib: libJNItestNative (out/target/product/generic/obj/SHARED_LIBRARIES/libJNItestNative_intermediates/LINKED/libJNItestNative.so)
target Non-prelinked: libJNItestNative (out/target/product/generic/symbols/system/lib/libJNItestNative.so)
target Strip: libJNItestNative (out/target/product/generic/obj/lib/libJNItestNative.so)
Install: out/target/product/generic/system/lib/libJNItestNative.so
Finding NOTICE files: out/target/product/generic/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/target/product/generic/obj/NOTICE.html
gzip -c out/target/product/generic/obj/NOTICE.html > out/target/product/generic/obj/NOTICE.html.gz
make: ディレクトリ `/home/kenken/mydroid' から出ます


共有ライブラリ libJNItestNative.so は以下のディレクトリに格納されます。


~mydroid/out/target/product/generic/system/lib/





Note: prelink map 及び、共有ライブラリにおけるprelink定義について

androidの共有ライブラリはデフォルトでprelink mapというテキストファイルに、メモリマップテーブルに固定アドレスでマッピングするように構成されています。


(~/mydroid/build/core/prelink-linux-arm.map)


これは、メモリ上への頻繁なロード・アンロードを避け、速度アップをするための処置となっています。



~/mydroid/build/core/prelink-linux-arm.map (抜粋)



001 :
002 : # 0xC0000000 - 0xFFFFFFFF Kernel
003 : # 0xB0100000 - 0xBFFFFFFF Thread 0 Stack
004 : # 0xB0000000 - 0xB00FFFFF Linker
005 : # 0xA0000000 - 0xBFFFFFFF Prelinked System Libraries
006 : # 0x90000000 - 0x9FFFFFFF Prelinked App Libraries
007 : # 0x80000000 - 0x8FFFFFFF Non-prelinked Libraries
008 : # 0x40000000 - 0x7FFFFFFF mmap'd stuff
009 : # 0x10000000 - 0x3FFFFFFF Thread Stacks
010 : # 0x00000000 - 0x0FFFFFFF .text / .data / heap
011 :
012 : # core system libraries
013 : libdl.so 0xAFF00000



112 : libctest.so 0x9A700000
113 : libUAPI_jni.so 0x9A500000
114 : librpc.so 0x9A400000
115 : libtrace_test.so 0x9A300000
116 : libsrec_jni.so 0x9A200000



上記のように、prelink mapに登録するモジュール名及び固定アドレスを列挙して定義を行います。


しかし、固定アドレスにマッピングされるという事は、ビルドの度にシステムイメージまで作成し、入れ替えないといけないという事を意味しています。


これではJNIを使用するアプリケーションはインストールを自由に行うことが極めて困難であると言わざるを得ません。


Android.mkでは、デフォルト動作がprelink map有効となっており、prelink mapに共有ライブラリを登録しないと、ビルドエラーが発生してしまいます。



ビルドエラーの例



01 : ~/mydroid/external/libJNItestNative$ mm
02 : make: ディレクトリ `/home/kenken/mydroid' に入ります
03 : build/core/product_config.mk:211: WARNING: adding test OTA key
04 : ============================================
05 : TARGET_PRODUCT=generic
06 : TARGET_BUILD_VARIANT=eng
07 : TARGET_SIMULATOR=
08 : TARGET_BUILD_TYPE=release
09 : TARGET_ARCH=arm
10 : HOST_ARCH=x86
11 : HOST_OS=linux
12 : HOST_BUILD_TYPE=release
13 : BUILD_ID=
14 : ============================================
15 : build/core/main.mk:180: implicitly installing apns-conf_sdk.xml
16 : target thumb C: libJNItestNative <= /home/kenken/mydroid/external/libJNItestNative/getTestStringFromNative.c
17 : target SharedLib: libJNItestNative (out/target/product/generic/obj/SHARED_LIBRARIES/libJNItestNative_intermediates/LINKED/libJNItestNative.so)
18 : target Prelink: libJNItestNative (out/target/product/generic/symbols/system/lib/libJNItestNative.so)
19 : build/tools/apriori/prelinkmap.c(137): library 'libJNItestNative.so' not in prelink map
20 : make: *** [out/target/product/generic/symbols/system/lib/libJNItestNative.so] エラー 1
21 : make: ディレクトリ `/home/kenken/mydroid' から出ます



上記のビルドエラーの場合、19行目に、「prelink mapに含まれていない」(library 'libJNItestNative.so' not in prelink map)というエラーが確認できます。


prelink mapに登録せず、ビルドを行うためには、Android.mkに以下の1行を追加し、ビルドを行います。(prelink 無効化の定義)



LOCAL_PRELINK_MODULE := false





3.アプリケーションの実行

androidアプリ実行の前に、共有ライブラリ libJNItestNative.so を、あらかじめエミュレータの/sysytem/lib ディレクトリにコピーします。


1. コマンドプロンプトを起動し、androidエミュレータを以下のコマンドで起動します。



>start emulator


2. エミュレータ上のディレクトリ /system/lib への書き込みを有効にするために、以下のコマンドを実行します。



>adb remount


3. 共有ライブラリを /system/lib ディレクトリにコピーします。カレントディレクトリに、「2. 共有ライブラリ libJNItestNative.so の作成」で作成したモジュールをあらかじめ用意した上、以下のコマンドを実行します。



>adb push libJNItestNative.so /system/lib


4. androidエミュレータの起動を維持したままの状態で、eclipseからandroidアプリJNItestを


起動します。


起動に成功すると、以下のように実行結果が表示されます。


f:id:bs-android:20090324120809p:image



以上です。


もし、記述間違いなどがありましたらご指摘いただけると幸いです。




*1:androidのソースコードツリーでシステムイメージがbuild出来る環境。ソースの入手方法・ビルド環境構築方法については、こちらを参照。







VMWareとUbuntuを使ってWindows上でAndroidのコンパイル環境を整える方法を書いたドキュメントをPDFで用意しました。


スクリーンショットが多く、82ページある為、今回はエントリのほうには書きません。


Windows側とUbuntuとのファイル共有方法も盛り込んであります。





Androidのコンパイル環境を整える方法



VMWareとUbuntuを使ってWindows上でAndroidのコンパイル環境を整える方法を書いたドキュメントをPDFで用意しました。


スクリーンショットが多く、82ページある為、今回はエントリのほうには書きません。


Windows側とUbuntuとのファイル共有方法も盛り込んであります。





2009年3月22日日曜日



f:id:bs-android:20090322095729p:image


3/19、20に開催されたAndroid Hackathon(ハッカソン)にチューターとして参加させていただきました。


3/10、11にIdeathon(アイディアソン)として事前ミーティングも実施されており、3/10のミーティングにも参加させていただいています。


今回はITファームさんが協賛しており、よいアイディアがあれば会社設立や投資も行ってくれるという夢のあるイベントになっていました。


Ideathon 3/10


3/19のHackathonの事前ミーティングです。


全員参加必須ではありませんでしたが、ほとんどの方が出席していました。


事前に決められていた



1. News & Weather


2. Specific Device


3. Multimedia


4. Tutorial


5. Lifestyle & Travel



のリストから各自参加するカテゴリを選び、各カテゴリに集まった人どうしでアイディアを考えます。


そして各アイディア毎にプレゼンを行い、当日のトップアイディアを決めるという流れです。


当日出たアイディアは



Lifestyle & Travel

 位置情報と行動履歴を基にしたアプリケーション。次の予定にどのような経路で行くべきかを現在位置を参考にナビゲートしてくれる。


Multimedia

 タッチ操作による画像のスライドショー。コメント入力機能もあり。端末を回転させると文字も追従する。


News & Weather

 画面を見ないで使えるRSSリーダー。Listen& Shake


Specific Device

 モーションジェスチャーのライブラリ化。モーションジェスチャーを利用した、アプリケーション。特定動作で撮影した画像を特定のあて先に送信する、など。


Tutorial

 加速度センサーを利用した占いアプリケーション。



という内容でした。


この作業が終わっていれば、当日まで他のメンバーと作業できる為、事前にかなり作業を進めておくことが出来ます。


去年Hackathonに参加した時は、作成するアプリを決めるだけでかなりの時間をとられてしまい、アプリを作っている時間がほとんど取れなかった為、事前にIdeathonを行っておくのは当日のアプリ製作に時間が割けるので、非常によい構成だと思います。





そして、この日は日本Androidの会から参加したチューターが、一人ずつ各カテゴリのテーブルに分かれてアドバイスを行いました。


私はSpecific Deviceチームのテーブルで一緒にアイディアを考えていました。


30分という短い時間でアイディアを考え、各チームそれぞれアイディアをプレゼンしていきました。


そして投票でトップアイディアが決まったのですが、トップはなんと私が担当していたSpecific Deviceチームでした。


みんなと一緒に、景品としてTシャツをいただきました!


f:id:bs-android:20090322103138j:image


Hackathon 3/19


 Hackathon1日目です。事前に行われたIdeathonで出たアイディアを元にアプリ作成を行います。


当日はHackathon-jpのGoogle Codeのサイトを使い、Subversionでコード共有を行って開発を行いました。


SubclipseというEclipseのSubversionプラグインがオススメということでしたが、インストールしているEclipseの種類によってはインストールが上手くいかない場合が結構ありました。


今後Hackathonに参加される方は事前にインストールして準備をしておくか、普段からSubversionに慣れておくといいと思います。


※もちろん、コード共有ツールはSubversionしか駄目という訳ではありません。


環境設定もIdeathonで済ませておくと、Hackathon当日もスムーズに開発できるのではないかと思いました。


以下は当日のアプリの一覧です。


Ideathonの時よりも少し増えています。



Tutorial

 ・タロット占い。振るとカードがランダム表示。


 ・万歩計


 ・アプリケーション起動時に現在位置をTwitterに発信。


News & Weather

 ・見ないで使えるインターフェース。ポケットの中で使える。


 ・見ないで使える読み上げインターフェース


 ・朝日コムからRSSフィード読み込み


Multimedia

 音楽つきスライドショー。地名やテロップを表示。


Specific Device

 加速度センサーを利用した、かめはめ波。移動の向きを2次元で認識するところまで。


Lifestyle & Travel

 LifeNavi。Google Calendar の予定をもとにリマンダーとナビゲーション。



この日もSpecific Deviceチームのテーブルに張り付いて、アドバイスや環境構築のサポートを行い、アプリで使う画像データやサウンドデータの作成も担当しました。


Subversionの設定が上手くいかなかったり、加速度センサで常に認識する重力加速度が邪魔になったりと難航しましたが、プレゼンまでには何とか、端末を動かした方向を認識して上下左右斜めの8方向の矢印を表示させるところまで動作させることが出来ました。


そして、トップアプリはTutorialチームの「アプリケーション起動時に現在位置をTwitterに発信するアプリ」が優勝となりました。


Androidくん(正式名称は無いそうです)のぬいぐるみが景品として送られました。


写真を撮ってなかったのは残念。


会場の様子は安生さんのレポートをどうぞ。


この日のお弁当です。


f:id:bs-android:20090322112752j:image


この日のコードは


Android20090319から閲覧できます。


Hackathon 3/20


 Hackathon2日目です。(Hackathon1日目とは違う参加者です。)


この日の参加者は休日ということもあって非常に多かったです。


この日開発されたアプリは以下の通りです。



Game

 ・サムライチェス Android 版


Tutorial

 ・トランプシャッフル。手品もできる。


 ・Android 負荷モニタリング


 ・JNI で Hellow World


 ・Google Data APIs の利用を試みた


Social

 ・SNS の Activity をOpenSocialを用いてAndoriodで取得


GPS

 ・ニコンUP + Android(Web Server) を用いたスカウター


Lifestyle

 ・日英・英日テキスト翻訳


Tool

 ・加速度センサーを利用したランチャー。事前に登録したアプリを特定動作で起動。



3/11のIdeathonに参加していなかったのと、各テーブルに顔見知りの猛者がちらばっていた為、この日は全体的なサポートに勤めました。


この日も環境設定でつまずくケースが結構多かったです。


優勝はToolの「加速度センサーを利用したランチャー」アプリでした。


ジェスチャーを認識するサービスを起動させておき、待受け画面などで端末をシェイクすると、ブラウザが起動するというデモが行われ、会場が沸きました。


この日のお弁当


f:id:bs-android:20090322113842j:image


この日のコードは


Android20090320から閲覧できます。


Hackathonを終えて


2日間ともAndroid Devphone 1を所持している方が非常に多かったです。


会場は和気あいあいとした雰囲気で、Hackathonが終わった後も連絡を取り合ったりしており、非常に有意義かつ楽しく過ごせました。


このようなイベントを弊社でも開催したいと常々思っていたので、GoogleのChrisさんにAndroid Devphone 1をカスタマイズするHackathonを弊社で開催したいと申し出たところ、協力していただけるとのことでした。


Chrisさんは4月中はアメリカの為、5月に開催したいと思います!


乞うご期待!!





最後に


2日間ともお弁当おいしかったです!





2009/3/19、20 Android Hackathon レポート



f:id:bs-android:20090322095729p:image


3/19、20に開催されたAndroid Hackathon(ハッカソン)にチューターとして参加させていただきました。


3/10、11にIdeathon(アイディアソン)として事前ミーティングも実施されており、3/10のミーティングにも参加させていただいています。


今回はITファームさんが協賛しており、よいアイディアがあれば会社設立や投資も行ってくれるという夢のあるイベントになっていました。


Ideathon 3/10


3/19のHackathonの事前ミーティングです。


全員参加必須ではありませんでしたが、ほとんどの方が出席していました。


事前に決められていた



1. News & Weather


2. Specific Device


3. Multimedia


4. Tutorial


5. Lifestyle & Travel



のリストから各自参加するカテゴリを選び、各カテゴリに集まった人どうしでアイディアを考えます。


そして各アイディア毎にプレゼンを行い、当日のトップアイディアを決めるという流れです。


当日出たアイディアは



Lifestyle & Travel

 位置情報と行動履歴を基にしたアプリケーション。次の予定にどのような経路で行くべきかを現在位置を参考にナビゲートしてくれる。


Multimedia

 タッチ操作による画像のスライドショー。コメント入力機能もあり。端末を回転させると文字も追従する。


News & Weather

 画面を見ないで使えるRSSリーダー。Listen& Shake


Specific Device

 モーションジェスチャーのライブラリ化。モーションジェスチャーを利用した、アプリケーション。特定動作で撮影した画像を特定のあて先に送信する、など。


Tutorial

 加速度センサーを利用した占いアプリケーション。



という内容でした。


この作業が終わっていれば、当日まで他のメンバーと作業できる為、事前にかなり作業を進めておくことが出来ます。


去年Hackathonに参加した時は、作成するアプリを決めるだけでかなりの時間をとられてしまい、アプリを作っている時間がほとんど取れなかった為、事前にIdeathonを行っておくのは当日のアプリ製作に時間が割けるので、非常によい構成だと思います。





そして、この日は日本Androidの会から参加したチューターが、一人ずつ各カテゴリのテーブルに分かれてアドバイスを行いました。


私はSpecific Deviceチームのテーブルで一緒にアイディアを考えていました。


30分という短い時間でアイディアを考え、各チームそれぞれアイディアをプレゼンしていきました。


そして投票でトップアイディアが決まったのですが、トップはなんと私が担当していたSpecific Deviceチームでした。


みんなと一緒に、景品としてTシャツをいただきました!


f:id:bs-android:20090322103138j:image


Hackathon 3/19


 Hackathon1日目です。事前に行われたIdeathonで出たアイディアを元にアプリ作成を行います。


当日はHackathon-jpのGoogle Codeのサイトを使い、Subversionでコード共有を行って開発を行いました。


SubclipseというEclipseのSubversionプラグインがオススメということでしたが、インストールしているEclipseの種類によってはインストールが上手くいかない場合が結構ありました。


今後Hackathonに参加される方は事前にインストールして準備をしておくか、普段からSubversionに慣れておくといいと思います。


※もちろん、コード共有ツールはSubversionしか駄目という訳ではありません。


環境設定もIdeathonで済ませておくと、Hackathon当日もスムーズに開発できるのではないかと思いました。


以下は当日のアプリの一覧です。


Ideathonの時よりも少し増えています。



Tutorial

 ・タロット占い。振るとカードがランダム表示。


 ・万歩計


 ・アプリケーション起動時に現在位置をTwitterに発信。


News & Weather

 ・見ないで使えるインターフェース。ポケットの中で使える。


 ・見ないで使える読み上げインターフェース


 ・朝日コムからRSSフィード読み込み


Multimedia

 音楽つきスライドショー。地名やテロップを表示。


Specific Device

 加速度センサーを利用した、かめはめ波。移動の向きを2次元で認識するところまで。


Lifestyle & Travel

 LifeNavi。Google Calendar の予定をもとにリマンダーとナビゲーション。



この日もSpecific Deviceチームのテーブルに張り付いて、アドバイスや環境構築のサポートを行い、アプリで使う画像データやサウンドデータの作成も担当しました。


Subversionの設定が上手くいかなかったり、加速度センサで常に認識する重力加速度が邪魔になったりと難航しましたが、プレゼンまでには何とか、端末を動かした方向を認識して上下左右斜めの8方向の矢印を表示させるところまで動作させることが出来ました。


そして、トップアプリはTutorialチームの「アプリケーション起動時に現在位置をTwitterに発信するアプリ」が優勝となりました。


Androidくん(正式名称は無いそうです)のぬいぐるみが景品として送られました。


写真を撮ってなかったのは残念。


会場の様子は安生さんのレポートをどうぞ。


この日のお弁当です。


f:id:bs-android:20090322112752j:image


この日のコードは


Android20090319から閲覧できます。


Hackathon 3/20


 Hackathon2日目です。(Hackathon1日目とは違う参加者です。)


この日の参加者は休日ということもあって非常に多かったです。


この日開発されたアプリは以下の通りです。



Game

 ・サムライチェス Android 版


Tutorial

 ・トランプシャッフル。手品もできる。


 ・Android 負荷モニタリング


 ・JNI で Hellow World


 ・Google Data APIs の利用を試みた


Social

 ・SNS の Activity をOpenSocialを用いてAndoriodで取得


GPS

 ・ニコンUP + Android(Web Server) を用いたスカウター


Lifestyle

 ・日英・英日テキスト翻訳


Tool

 ・加速度センサーを利用したランチャー。事前に登録したアプリを特定動作で起動。



3/11のIdeathonに参加していなかったのと、各テーブルに顔見知りの猛者がちらばっていた為、この日は全体的なサポートに勤めました。


この日も環境設定でつまずくケースが結構多かったです。


優勝はToolの「加速度センサーを利用したランチャー」アプリでした。


ジェスチャーを認識するサービスを起動させておき、待受け画面などで端末をシェイクすると、ブラウザが起動するというデモが行われ、会場が沸きました。


この日のお弁当


f:id:bs-android:20090322113842j:image


この日のコードは


Android20090320から閲覧できます。


Hackathonを終えて


2日間ともAndroid Devphone 1を所持している方が非常に多かったです。


会場は和気あいあいとした雰囲気で、Hackathonが終わった後も連絡を取り合ったりしており、非常に有意義かつ楽しく過ごせました。


このようなイベントを弊社でも開催したいと常々思っていたので、GoogleのChrisさんにAndroid Devphone 1をカスタマイズするHackathonを弊社で開催したいと申し出たところ、協力していただけるとのことでした。


Chrisさんは4月中はアメリカの為、5月に開催したいと思います!


乞うご期待!!





最後に


2日間ともお弁当おいしかったです!





2009年2月23日月曜日



f:id:bs-android:20090215001008p:image


2009/2/27(金)に東京恵比寿で開催するAndroidのセミナーが本日締め切り日です。


申し込みフォーム


詳細は以下の通りです。



日程


 ・2009/2/27(金)


  ・開催時間


   19:00~20:50


  ・受付時間


   18:30~19:00


場所


 恵比寿スバルビル会議室407号室


 http://www.ebis303.com/ebisconference/index.html


 ・地図


  http://www.ebis303.com/ebisconference/access.html


  
大きな地図で見る





講演者(敬称略)


 ・日本Androidの会 事務局長


  SIPropプロジェクト 代表


  今村謙之


 ・日本Androidの会 関西支部長


  株式会社ブリリアントサービス代表取締役


  杉本礼彦


 ・日本Androidの会 組み込みWGリーダー


  株式会社ブリリアントサービス 技術部研究開発課Android担当リーダ


  近藤昭雄


内容


 ※敬称略


 ・「Androidと日本の携帯のこれから」 杉本礼彦


 ・「Androidによる世界戦略」 今村謙之


 ・「Androidをカスタマイズする方法」 近藤昭雄


  参加特典DVDの環境を使ってAndroidをカスタマイズしてコンパイルし


  Android Dev Phone 1にバイナリを焼くまでを実演します。


定員


 30名


参加費用


 15000円


 ※銀行振り込みになります。


  参加のご連絡後に振込先の口座を折り返し連絡させていただきます。


  領収書の発行も可能です。


参加特典


 ・オリジナルDVDをプレゼント


  以下の内容を収録する予定です。


  ・開発手順


  ・Android Dev Phone 1


   ・購入手順


   ・アクティベーションの方法


  ・開発環境


  ・当日のセミナー資料


 ※内容に多少の変更がある可能性があります。


主催


 株式会社ブリリアントサービス



定員30名を超えてしまった場合は抽選とさせていただきます。


申込みの締め切りは2009/2/23までです。


※銀行振り込みが2009/2/26までに完了するようにお願いいたします。


セミナー終了後に懇親会を予定しています。


申し込みフォームに参加可否をご記入ください。





第一回Androidセミナー本日締め切り



f:id:bs-android:20090215001008p:image


2009/2/27(金)に東京恵比寿で開催するAndroidのセミナーが本日締め切り日です。


申し込みフォーム


詳細は以下の通りです。



日程


 ・2009/2/27(金)


  ・開催時間


   19:00~20:50


  ・受付時間


   18:30~19:00


場所


 恵比寿スバルビル会議室407号室


 http://www.ebis303.com/ebisconference/index.html


 ・地図


  http://www.ebis303.com/ebisconference/access.html


  
大きな地図で見る





講演者(敬称略)


 ・日本Androidの会 事務局長


  SIPropプロジェクト 代表


  今村謙之


 ・日本Androidの会 関西支部長


  株式会社ブリリアントサービス代表取締役


  杉本礼彦


 ・日本Androidの会 組み込みWGリーダー


  株式会社ブリリアントサービス 技術部研究開発課Android担当リーダ


  近藤昭雄


内容


 ※敬称略


 ・「Androidと日本の携帯のこれから」 杉本礼彦


 ・「Androidによる世界戦略」 今村謙之


 ・「Androidをカスタマイズする方法」 近藤昭雄


  参加特典DVDの環境を使ってAndroidをカスタマイズしてコンパイルし


  Android Dev Phone 1にバイナリを焼くまでを実演します。


定員


 30名


参加費用


 15000円


 ※銀行振り込みになります。


  参加のご連絡後に振込先の口座を折り返し連絡させていただきます。


  領収書の発行も可能です。


参加特典


 ・オリジナルDVDをプレゼント


  以下の内容を収録する予定です。


  ・開発手順


  ・Android Dev Phone 1


   ・購入手順


   ・アクティベーションの方法


  ・開発環境


  ・当日のセミナー資料


 ※内容に多少の変更がある可能性があります。


主催


 株式会社ブリリアントサービス



定員30名を超えてしまった場合は抽選とさせていただきます。


申込みの締め切りは2009/2/23までです。


※銀行振り込みが2009/2/26までに完了するようにお願いいたします。


セミナー終了後に懇親会を予定しています。


申し込みフォームに参加可否をご記入ください。





2009年2月20日金曜日



こちらでアナウンスされているように、3/19(木)、3/20(金)に東京のGoogleオフィスでAndroid Hackathonが開催されます。


3/10(火)、3/11(水)に事前ミーティングでアイディアを出しまくるIdeathon(アイディアソン)も行われます。※こちらは参加必須ではありません。


弊社からは今回のHackathonに運営のサポーターとして参加させていただきます。


30名x2枠ありますが、すぐに埋まってしまうと思いますので、申込みはお早めに。


申込みフォーム





2009/3/19,3/20 Android Hackathon



こちらでアナウンスされているように、3/19(木)、3/20(金)に東京のGoogleオフィスでAndroid Hackathonが開催されます。


3/10(火)、3/11(水)に事前ミーティングでアイディアを出しまくるIdeathon(アイディアソン)も行われます。※こちらは参加必須ではありません。


弊社からは今回のHackathonに運営のサポーターとして参加させていただきます。


30名x2枠ありますが、すぐに埋まってしまうと思いますので、申込みはお早めに。


申込みフォーム





2009年2月19日木曜日



Software Designの3月号が2009/2/18に発売されました。


Androidだけで49ページも確保した充実した特集記事が掲載されています。


内容



1章:今までのプラットフォームとはここが違う~Androidでできること


 嶋是一/中村秀樹


2章:~これだけは押さえておきたい~Androidアプリ開発のための基礎知識


 江川崇


3章:~よくあるトラブルで迷わない~Androidアプリ開発環境構築ガイド


 杉本礼彦


4章:Androidアプリを作ってみよう!~サンプルゲーム/マッシュアップ/拡張現実感~


 安生真/内嶋教人/今村謙之/山崎淳


コラム:Android Marketへの自作アプリ登録手順


 木南英夫


5章:~組込みフレームワークとしてのAndroid~ハードウェア移植のツボ


 安藤恐竜



日本Androidの会の幹事メンバーによる執筆陣となっています。


Androidの概要、開発環境構築、ゲーム作成、マッシュアップ、3Dに加え、


Androidの移植の勘所も掲載されている、とっても贅沢な内容です。


ぜひご覧ください。



Software Design (ソフトウエア デザイン) 2009年 03月号 [雑誌]

Software Design (ソフトウエア デザイン) 2009年 03月号 [雑誌]










Software Design 2009年3月号のAndroid特集



Software Designの3月号が2009/2/18に発売されました。


Androidだけで49ページも確保した充実した特集記事が掲載されています。


内容



1章:今までのプラットフォームとはここが違う~Androidでできること


 嶋是一/中村秀樹


2章:~これだけは押さえておきたい~Androidアプリ開発のための基礎知識


 江川崇


3章:~よくあるトラブルで迷わない~Androidアプリ開発環境構築ガイド


 杉本礼彦


4章:Androidアプリを作ってみよう!~サンプルゲーム/マッシュアップ/拡張現実感~


 安生真/内嶋教人/今村謙之/山崎淳


コラム:Android Marketへの自作アプリ登録手順


 木南英夫


5章:~組込みフレームワークとしてのAndroid~ハードウェア移植のツボ


 安藤恐竜



日本Androidの会の幹事メンバーによる執筆陣となっています。


Androidの概要、開発環境構築、ゲーム作成、マッシュアップ、3Dに加え、


Androidの移植の勘所も掲載されている、とっても贅沢な内容です。


ぜひご覧ください。



Software Design (ソフトウエア デザイン) 2009年 03月号 [雑誌]

Software Design (ソフトウエア デザイン) 2009年 03月号 [雑誌]












Implementing a User Interface」の一部を翻訳しました。


pdf版はこちら



ユーザーインターフェースの実装


 このセクションではAndroidの画面のユーザインタフェースを実装する基本的な方法を記載します。


画面を作る為の基本とXMLで画面を定義してコードからロードする方法、その他ユーザーインタフェースを取り扱う為に必要な色々なタスクについて解説します。





画面構成要素の階層

 Androidアプリケーションの基本的な機能単位としてandroid.app.Activityクラスのオブジェクトがあります。


アクティビティで様々なことをすることができますが、それ自体では画面上に何も表示しません。


アクティビティを画面上に存在させ、UIを設計するには、ViewやViewグループを使います。





Views

 Viewはandroid.view.Viewクラスのオブジェクトです。画面上の特定の矩形領域に対するレイアウトとコンテンツのプロパティを持ちます。


 Viewオブジェクトは画面領域の為に画面サイズ、レイアウト、描画、フォーカス変更、スクロール、キー/ジェスチャーを扱っています。





 Viewクラスはwidgets(インタラクティブに画面要素を描画するサブクラスを実装した集合)用の基本クラスを供給します。


 Widgetsは測定と描画を処理するので、より早くUIを構築することができます。


 利用できるインターフェースには、Text、EditText、InputMethod、MovementMethod、Button、RadioButton、Checkbox、ScrollViewがなどがあります。





Viewgroups

 Viewgroupsはandroid.view.Viewgroupクラスのオブジェクトです。


その名前が示すようにViewgroupsはViewとViewgroup配下のセットを含み、管理するための機能を機能を持つ特別なViewオブジェクトです。


 ViewgroupsはストラクチャをUIに追加し、一つの実体と呼ぶことのできる複雑な画面要素を構成します。


 Viewgroupクラスはレイアウト(一般的な画面レイアウトを提供するサブクラスのセット)の基本クラスを供給し、Viewのセットを構築する方法を提供します。





UIのツリー構造

 Androidプラットホームでは、下記の図で示すようにViewとViewgroupノードのツリーを使っているアクティビティのUIを定義します。ツリーは単純にも複雑にも好きなように作成することができ、あらかじめ定義されたwidgetsとレイアウト、自分でカスタマイズしたviewタイプを使って構成することができます。


f:id:bs-android:20090218163101p:image


 画面にレンダリングしてツリーに関連付けるには、アクティビティで、setContentView()メソッドを呼び、


ルートノードオブジェクトへの参照を渡します。


 一旦Androidシステムがルートノードオブジェクトへの参照を持てば、Androidシステムはノードをダイレクトに操作し、画面の消去、測定、描画を行うことができます。


 アクティビティがアクティブになり、フォーカスを受け取った時、システムはアクティビティに通知し、ルートノードにツリーを測定、描画するように要求を出します。ルートノードは子ノードの描画を要求します。(描画要求を受け取った時、ツリーの各viewgroupのノードは自分の直下の子ノードに対して描画要求する義務があります。)





 上記のように各viewgroupは、利用できるスペースを測定する責任を持ち、子ノードを配置し、各子ノードにレンダリングさせるためににDraw()を呼びます。


 子ノードは親ノードのサイズと位置を要求するかもしれませんが、親オブジェクトが、各子ノードのサイズと位置を最終決定します





子ノードの位置とサイズの指定方法

 すべてのViewgroupクラスは、ViewGroup.LayoutParamsを拡張した入れ子になったクラスを使用します。このサブクラスは子ノードのサイズと位置を定義するプロパティを含んでおり、Viewgroupクラスのプロパティに割り当てられます。


f:id:bs-android:20090218163349p:image





 LayoutParamsサブクラスには値を設定する為に各々の文法があるので注意が必要です。各子要素は、親ノードにふさわしいLayoutParamsを定義しなければなりません。


 しかし、子ノードに異なるLayoutParamsを定義することもできます。





 サイズを合わせるのに頻繁に使うのは、コンテンツのサイズから計算するか、親オブジェクトのサイズまでオブジェクトのサイズを大きくすることを許可する方法です。(訳注:パラメータ指定で親オブジェクトのサイズに合わせることが出来る。)





一般的なレイアウトオブジェクト

 以下は、アプリケーションで使う最も一般的なViewgroupsです。


各タイプについての基本的な情報を解説しています。


(詳細については各項目のリンクされたページを参照してください。)





FrameLayout

 FrameLayoutは、最も簡単なレイアウトオブジェクトです。


FrameLayoutは、空白の、予約された空間としてスクリーン上に用意され、画像などの一つのオブジェクトを入れることができます。


 すべての子要素はスクリーンの左上に配置されます。FrameLayoutでは子要素の位置を指定することはできません。


 子要素は、以前のオブジェクトの上に上書きし、(新しいオブジェクトが透明でなければ)以前のオブジェクトを部分的に、あるいは全体的に覆い隠すことになります。





LinearLayout

 LinearLayoutは、一つの方向にすべての子要素を配置します。


その方向は-垂直または水平があり、LinearLayoutに設定したプロパティによって決まります。


全ての子要素は次々にスタックされ、垂直のリストはどれだけ横幅が広くても、行ごとに一つだけ子要素を持つことになり、水平のリストは高さ(子要素の中で最も長い縦幅+パディング)をもつ一つだけの行を持ちます。


 LinearLayoutは子要素の間のマージンや、重力(子要素のright、center、leftの属性)も考慮します。





 子要素はweight値を指定し、残りのスペースは宣言されたweightの割合で子要素に割り当てられます。


 デフォルトのweightはゼロです。


 例えば3つのテキストボックスがあって、そのうち2つはweightを"1"で宣言している場合、"1"で宣言したテキストボックスは余白のスペースをいっぱいにするために等しく拡張されますが、残りのテキストボックスは拡張されません。





 下図の2つのフォームは、一組の要素(ボタン、ラベル、テキストボックス)をもつLinearLayoutを表しています。


 うまくパディングを調節するために両方ともパディング値を持っています。これらのテキストボックスの幅はFILL_PARENTに設定されています。(その他の要素はWRAP_CONTENTに設定)


重力(gravity)はデフォルトの左に設定されています。


左側のフォームはweight値が設定されていません(デフォルトの0)。


 一方、右側のフォームはCommentsのテキストボックスのweightに"1"が設定されています。


Nameのテキストボックスにも"1"が設定されたら、NameとCommentsのテキストボックスは同じ高さになります。


f:id:bs-android:20090218163847p:image





ヒント:バランスのとれたレイアウトの画面を作るには、fill_parent属性のコンテナオブジェクトを作成し、子要素にゼロの高さ、または幅を割り当て、各要素が取るべき画面の割合に従った相対的なweight値を各子要素に割り当てます。





 水平のLinearLayoutでは、アイテムはテキストのベースライン{最初のリスト要素の最初のライン(一番上、一番左を基準の線とみなす)}の位置に整列されます。


 これはフォーム要素を目で追う時に隣のテキストを読むために視線が上がったり下がったりしないですむようにするためです。XMLのレイアウトで android:baselineAligned="false" を設定することによって取り消すこともできます。





TableLayout

 TableLayoutは行と列に子要素を配置します。TableLayoutはいくつかのTableRowオブジェクトから成りたっています。


 各々が列(以下に説明されるように他の子要素を持つこともできます)を定義します。


 TableLayoutコンテナは、行、列、セルの境界線は表示しません。各列はゼロ以上のセルを持ちます。


(各セルは一つのViewオブジェクトを持つことができます。)


 テーブルは最も多くのセルを持つ行と同じだけの列を持ち、空のままのセルを持つことができます。


セルはHTMLでできるように列全体に広げるようなことはできません。(訳注:tableタグのcolspan属性のようなことはできない。)


 以下のイメージは、点線で表示されている目に見えないセルの境界線としてテーブルレイアウトを示しています。


f:id:bs-android:20090218164232p:image





 列を隠すこともでき、その列が残り画面スペースを埋めるように指定することができます。


また、テーブルが画面に合うように強制的にその行を縮めるように指定することもできます。


詳細は、このクラスについてのドキュメントを参照してください。





AbsoluteLayout

 AbsoluteLayoutでは、子要素を画面に表示する正確なx/y座標を指定することができます。(0,0)は左上で、右あるいは下に動くことで値が増加します。


 マージンはサポートされておらず、要素が重なることは(お勧めできないが)許容されます。


 融通が利かず、異なるデバイスの画面表示でうまく機能しない為、正当な理由がない限り、通常AbsoluteLayoutを使うことはお勧めできません。





RelativeLayout

 RelativeLayoutでは、子要素にお互い(IDによる指定)の、あるいは親要素との相対的な位置を指定します。


 右端に2つの要素を並べたり、要素の下に要素を置いたり、画面の中央に配置することができます。


 要素は与えられた順序で描画されるので、最初の要素が画面の中央にあるなら、その要素に対して並べられている他の要素は画面の中央と相対的に並べられることになります。


 このレイアウトを指定する為にXMLを使う場合、参照される(基準となる)要素は、それが参照される前にリストされていなければなりません。





 以下の図は目に見える要素と見えない要素を相対的に配置している例を解説しています。


 ルートの画面のレイアウトオブジェクトはRelativeLayoutオブジェクトを使用しています。


f:id:bs-android:20090218164419p:image





 この図は画面構成要素のクラス名とそれぞれのプロパティのリストを表しています。


 これらのプロパティのいくつかは要素によって直接サポートされ、いくつかはLayoutParamsメンバーによってサポートされます(画面のすべての要素のためのRelativeLayoutサブクラスです。なぜなら全ての要素はRelativeLayout親オブジェクトの子要素だからです。)。


 RelativeLayoutパラメータにはwidth、height、below、alignTop、toLeft、padding、marginLeftがあります。 これらのパラメータのいくつかは他の子要素に対する相対的な値をサポートしていることに注意してください。toLeft、alignTop、belowプロパティは、それぞれ、左(toLeft)、上(alignTop)、下(below)にあるオブジェクトを示します。





重要なViewグループのサマリー

 これらのオブジェクトはすべて子UI要素を持ちます。


 いくつかは目に見えるUIを提供しますが、いくつかは子レイアウトを処理するだけです。




















Class説明
AbsoluteLayout正確な目盛(例えばピクセル)において親オブジェクトに対する相対的な子オブジェクトの位置を指定することができます。
FrameLayout一つのオブジェクトを表示するViewフレームとして振舞うレイアウトです。
Galleryリストからイメージを水平スクロール表示させます。
GridViewm行とn列のスクロールするグリッドを示します。
LinearLayout水平あるいは垂直の列に子要素を配置するレイアウトです。ウインドウの長さがスクリーンの長さを上回る場合は、スクロールバーを生成します。
ListViewスクロールする1列のリストを表示します。
RelativeLayoutお互いの要素の相対的な指定(子Bの左へ子等ど)、親要素との相対的な指定(親のトップに整列する等)を用いて、子オブジェクトの位置を指定することができます。
ScrollView要素を垂直スクロールさせる列です。
Spinner1行のテキストボックスに、リストから一度に一つのアイテムを表示します。水平、または、垂直にスクロールすることができる1列のリストボックスのようなものです。
SurfaceView描画専用のsurfaceへの直接アクセスを提供します。surfaceの上のレイヤーになる子Viewを持つことができますが、widgetsを使うよりも、ピクセルで描画する必要があるアプリケーションで使用される事を目的としています。
TabHostタブのクリックを監視して、アプリケーションが画面を変更するのを可能にするタブ選択リストを提供します。
TableLayout任意の数の行と列を持つ表のレイアウトです。各セルは任意のwidgetを持つ事が出来ます。横列は最大の縦列に合わせてリサイズされます。セルの境界線はありません。
ViewFlipper1列のテキストボックスに1つのアイテムを表示するリストです。スライドショーのように、時間間隔を設定してアイテム表示を入れ替えることが出来ます。
ViewSwitcherViewFlipperと同様のものです。





「Implementing a User Interface」の一部翻訳



Implementing a User Interface」の一部を翻訳しました。


pdf版はこちら



ユーザーインターフェースの実装


 このセクションではAndroidの画面のユーザインタフェースを実装する基本的な方法を記載します。


画面を作る為の基本とXMLで画面を定義してコードからロードする方法、その他ユーザーインタフェースを取り扱う為に必要な色々なタスクについて解説します。





画面構成要素の階層

 Androidアプリケーションの基本的な機能単位としてandroid.app.Activityクラスのオブジェクトがあります。


アクティビティで様々なことをすることができますが、それ自体では画面上に何も表示しません。


アクティビティを画面上に存在させ、UIを設計するには、ViewやViewグループを使います。





Views

 Viewはandroid.view.Viewクラスのオブジェクトです。画面上の特定の矩形領域に対するレイアウトとコンテンツのプロパティを持ちます。


 Viewオブジェクトは画面領域の為に画面サイズ、レイアウト、描画、フォーカス変更、スクロール、キー/ジェスチャーを扱っています。





 Viewクラスはwidgets(インタラクティブに画面要素を描画するサブクラスを実装した集合)用の基本クラスを供給します。


 Widgetsは測定と描画を処理するので、より早くUIを構築することができます。


 利用できるインターフェースには、Text、EditText、InputMethod、MovementMethod、Button、RadioButton、Checkbox、ScrollViewがなどがあります。





Viewgroups

 Viewgroupsはandroid.view.Viewgroupクラスのオブジェクトです。


その名前が示すようにViewgroupsはViewとViewgroup配下のセットを含み、管理するための機能を機能を持つ特別なViewオブジェクトです。


 ViewgroupsはストラクチャをUIに追加し、一つの実体と呼ぶことのできる複雑な画面要素を構成します。


 Viewgroupクラスはレイアウト(一般的な画面レイアウトを提供するサブクラスのセット)の基本クラスを供給し、Viewのセットを構築する方法を提供します。





UIのツリー構造

 Androidプラットホームでは、下記の図で示すようにViewとViewgroupノードのツリーを使っているアクティビティのUIを定義します。ツリーは単純にも複雑にも好きなように作成することができ、あらかじめ定義されたwidgetsとレイアウト、自分でカスタマイズしたviewタイプを使って構成することができます。


f:id:bs-android:20090218163101p:image


 画面にレンダリングしてツリーに関連付けるには、アクティビティで、setContentView()メソッドを呼び、


ルートノードオブジェクトへの参照を渡します。


 一旦Androidシステムがルートノードオブジェクトへの参照を持てば、Androidシステムはノードをダイレクトに操作し、画面の消去、測定、描画を行うことができます。


 アクティビティがアクティブになり、フォーカスを受け取った時、システムはアクティビティに通知し、ルートノードにツリーを測定、描画するように要求を出します。ルートノードは子ノードの描画を要求します。(描画要求を受け取った時、ツリーの各viewgroupのノードは自分の直下の子ノードに対して描画要求する義務があります。)





 上記のように各viewgroupは、利用できるスペースを測定する責任を持ち、子ノードを配置し、各子ノードにレンダリングさせるためににDraw()を呼びます。


 子ノードは親ノードのサイズと位置を要求するかもしれませんが、親オブジェクトが、各子ノードのサイズと位置を最終決定します





子ノードの位置とサイズの指定方法

 すべてのViewgroupクラスは、ViewGroup.LayoutParamsを拡張した入れ子になったクラスを使用します。このサブクラスは子ノードのサイズと位置を定義するプロパティを含んでおり、Viewgroupクラスのプロパティに割り当てられます。


f:id:bs-android:20090218163349p:image





 LayoutParamsサブクラスには値を設定する為に各々の文法があるので注意が必要です。各子要素は、親ノードにふさわしいLayoutParamsを定義しなければなりません。


 しかし、子ノードに異なるLayoutParamsを定義することもできます。





 サイズを合わせるのに頻繁に使うのは、コンテンツのサイズから計算するか、親オブジェクトのサイズまでオブジェクトのサイズを大きくすることを許可する方法です。(訳注:パラメータ指定で親オブジェクトのサイズに合わせることが出来る。)





一般的なレイアウトオブジェクト

 以下は、アプリケーションで使う最も一般的なViewgroupsです。


各タイプについての基本的な情報を解説しています。


(詳細については各項目のリンクされたページを参照してください。)





FrameLayout

 FrameLayoutは、最も簡単なレイアウトオブジェクトです。


FrameLayoutは、空白の、予約された空間としてスクリーン上に用意され、画像などの一つのオブジェクトを入れることができます。


 すべての子要素はスクリーンの左上に配置されます。FrameLayoutでは子要素の位置を指定することはできません。


 子要素は、以前のオブジェクトの上に上書きし、(新しいオブジェクトが透明でなければ)以前のオブジェクトを部分的に、あるいは全体的に覆い隠すことになります。





LinearLayout

 LinearLayoutは、一つの方向にすべての子要素を配置します。


その方向は-垂直または水平があり、LinearLayoutに設定したプロパティによって決まります。


全ての子要素は次々にスタックされ、垂直のリストはどれだけ横幅が広くても、行ごとに一つだけ子要素を持つことになり、水平のリストは高さ(子要素の中で最も長い縦幅+パディング)をもつ一つだけの行を持ちます。


 LinearLayoutは子要素の間のマージンや、重力(子要素のright、center、leftの属性)も考慮します。





 子要素はweight値を指定し、残りのスペースは宣言されたweightの割合で子要素に割り当てられます。


 デフォルトのweightはゼロです。


 例えば3つのテキストボックスがあって、そのうち2つはweightを"1"で宣言している場合、"1"で宣言したテキストボックスは余白のスペースをいっぱいにするために等しく拡張されますが、残りのテキストボックスは拡張されません。





 下図の2つのフォームは、一組の要素(ボタン、ラベル、テキストボックス)をもつLinearLayoutを表しています。


 うまくパディングを調節するために両方ともパディング値を持っています。これらのテキストボックスの幅はFILL_PARENTに設定されています。(その他の要素はWRAP_CONTENTに設定)


重力(gravity)はデフォルトの左に設定されています。


左側のフォームはweight値が設定されていません(デフォルトの0)。


 一方、右側のフォームはCommentsのテキストボックスのweightに"1"が設定されています。


Nameのテキストボックスにも"1"が設定されたら、NameとCommentsのテキストボックスは同じ高さになります。


f:id:bs-android:20090218163847p:image





ヒント:バランスのとれたレイアウトの画面を作るには、fill_parent属性のコンテナオブジェクトを作成し、子要素にゼロの高さ、または幅を割り当て、各要素が取るべき画面の割合に従った相対的なweight値を各子要素に割り当てます。





 水平のLinearLayoutでは、アイテムはテキストのベースライン{最初のリスト要素の最初のライン(一番上、一番左を基準の線とみなす)}の位置に整列されます。


 これはフォーム要素を目で追う時に隣のテキストを読むために視線が上がったり下がったりしないですむようにするためです。XMLのレイアウトで android:baselineAligned="false" を設定することによって取り消すこともできます。





TableLayout

 TableLayoutは行と列に子要素を配置します。TableLayoutはいくつかのTableRowオブジェクトから成りたっています。


 各々が列(以下に説明されるように他の子要素を持つこともできます)を定義します。


 TableLayoutコンテナは、行、列、セルの境界線は表示しません。各列はゼロ以上のセルを持ちます。


(各セルは一つのViewオブジェクトを持つことができます。)


 テーブルは最も多くのセルを持つ行と同じだけの列を持ち、空のままのセルを持つことができます。


セルはHTMLでできるように列全体に広げるようなことはできません。(訳注:tableタグのcolspan属性のようなことはできない。)


 以下のイメージは、点線で表示されている目に見えないセルの境界線としてテーブルレイアウトを示しています。


f:id:bs-android:20090218164232p:image





 列を隠すこともでき、その列が残り画面スペースを埋めるように指定することができます。


また、テーブルが画面に合うように強制的にその行を縮めるように指定することもできます。


詳細は、このクラスについてのドキュメントを参照してください。





AbsoluteLayout

 AbsoluteLayoutでは、子要素を画面に表示する正確なx/y座標を指定することができます。(0,0)は左上で、右あるいは下に動くことで値が増加します。


 マージンはサポートされておらず、要素が重なることは(お勧めできないが)許容されます。


 融通が利かず、異なるデバイスの画面表示でうまく機能しない為、正当な理由がない限り、通常AbsoluteLayoutを使うことはお勧めできません。





RelativeLayout

 RelativeLayoutでは、子要素にお互い(IDによる指定)の、あるいは親要素との相対的な位置を指定します。


 右端に2つの要素を並べたり、要素の下に要素を置いたり、画面の中央に配置することができます。


 要素は与えられた順序で描画されるので、最初の要素が画面の中央にあるなら、その要素に対して並べられている他の要素は画面の中央と相対的に並べられることになります。


 このレイアウトを指定する為にXMLを使う場合、参照される(基準となる)要素は、それが参照される前にリストされていなければなりません。





 以下の図は目に見える要素と見えない要素を相対的に配置している例を解説しています。


 ルートの画面のレイアウトオブジェクトはRelativeLayoutオブジェクトを使用しています。


f:id:bs-android:20090218164419p:image





 この図は画面構成要素のクラス名とそれぞれのプロパティのリストを表しています。


 これらのプロパティのいくつかは要素によって直接サポートされ、いくつかはLayoutParamsメンバーによってサポートされます(画面のすべての要素のためのRelativeLayoutサブクラスです。なぜなら全ての要素はRelativeLayout親オブジェクトの子要素だからです。)。


 RelativeLayoutパラメータにはwidth、height、below、alignTop、toLeft、padding、marginLeftがあります。 これらのパラメータのいくつかは他の子要素に対する相対的な値をサポートしていることに注意してください。toLeft、alignTop、belowプロパティは、それぞれ、左(toLeft)、上(alignTop)、下(below)にあるオブジェクトを示します。





重要なViewグループのサマリー

 これらのオブジェクトはすべて子UI要素を持ちます。


 いくつかは目に見えるUIを提供しますが、いくつかは子レイアウトを処理するだけです。




















Class説明
AbsoluteLayout正確な目盛(例えばピクセル)において親オブジェクトに対する相対的な子オブジェクトの位置を指定することができます。
FrameLayout一つのオブジェクトを表示するViewフレームとして振舞うレイアウトです。
Galleryリストからイメージを水平スクロール表示させます。
GridViewm行とn列のスクロールするグリッドを示します。
LinearLayout水平あるいは垂直の列に子要素を配置するレイアウトです。ウインドウの長さがスクリーンの長さを上回る場合は、スクロールバーを生成します。
ListViewスクロールする1列のリストを表示します。
RelativeLayoutお互いの要素の相対的な指定(子Bの左へ子等ど)、親要素との相対的な指定(親のトップに整列する等)を用いて、子オブジェクトの位置を指定することができます。
ScrollView要素を垂直スクロールさせる列です。
Spinner1行のテキストボックスに、リストから一度に一つのアイテムを表示します。水平、または、垂直にスクロールすることができる1列のリストボックスのようなものです。
SurfaceView描画専用のsurfaceへの直接アクセスを提供します。surfaceの上のレイヤーになる子Viewを持つことができますが、widgetsを使うよりも、ピクセルで描画する必要があるアプリケーションで使用される事を目的としています。
TabHostタブのクリックを監視して、アプリケーションが画面を変更するのを可能にするタブ選択リストを提供します。
TableLayout任意の数の行と列を持つ表のレイアウトです。各セルは任意のwidgetを持つ事が出来ます。横列は最大の縦列に合わせてリサイズされます。セルの境界線はありません。
ViewFlipper1列のテキストボックスに1つのアイテムを表示するリストです。スライドショーのように、時間間隔を設定してアイテム表示を入れ替えることが出来ます。
ViewSwitcherViewFlipperと同様のものです。





2009年2月14日土曜日



f:id:bs-android:20090215001008p:image


タイトルの通り、東京恵比寿でAndroidのセミナーを開催いたします。


申し込みフォーム


詳細は以下の通りです。



・日程
 ・2009/2/27(金)
  ・開催時間
   19:00~20:50
  ・受付時間
   18:30~19:00

・場所
 恵比寿スバルビル会議室407号室
 http://www.ebis303.com/ebisconference/index.html
 ・地図
  http://www.ebis303.com/ebisconference/access.html

・講演者(敬称略)
 ・日本Androidの会 事務局長
  SIPropプロジェクト 代表
  今村謙之

 ・日本Androidの会 関西支部長
  株式会社ブリリアントサービス代表取締役
  杉本礼彦

 ・日本Androidの会 組み込みWGリーダー
  株式会社ブリリアントサービス 技術部研究開発課Android担当リーダ
  近藤昭雄

・内容
 ※敬称略
 ・「Androidと日本の携帯のこれから」 杉本礼彦
 ・「Androidによる世界戦略」 今村謙之
 ・「Androidをカスタマイズする方法」 近藤昭雄
  参加特典DVDの環境を使ってAndroidをカスタマイズしてコンパイルし
  Android Dev Phone 1にバイナリを焼くまでを実演します。

・定員
 30名

・参加費用
 15000円
 ※銀行振り込みになります。
  参加のご連絡後に振込先の口座を折り返し連絡させていただきます。
  領収書の発行も可能です。

・参加特典
 ・オリジナルDVDをプレゼント
  以下の内容を収録する予定です。
  ・開発手順
  ・Android Dev Phone 1
   ・購入手順
   ・アクティベーションの方法
  ・開発環境
  ・当日のセミナー資料
 ※内容に多少の変更がある可能性があります。

・主催
 株式会社ブリリアントサービス

定員30名を超えてしまった場合は抽選とさせていただきます。


申込みの締め切りは2009/2/23までです。


※銀行振り込みが2009/2/26までに完了するようにお願いいたします。


セミナー終了後に懇親会を予定しています。


申し込みフォームに参加可否をご記入ください。





2009/2/27(金)にAndroidセミナーを開催します



f:id:bs-android:20090215001008p:image


タイトルの通り、東京恵比寿でAndroidのセミナーを開催いたします。


申し込みフォーム


詳細は以下の通りです。



・日程
 ・2009/2/27(金)
  ・開催時間
   19:00~20:50
  ・受付時間
   18:30~19:00

・場所
 恵比寿スバルビル会議室407号室
 http://www.ebis303.com/ebisconference/index.html
 ・地図
  http://www.ebis303.com/ebisconference/access.html

・講演者(敬称略)
 ・日本Androidの会 事務局長
  SIPropプロジェクト 代表
  今村謙之

 ・日本Androidの会 関西支部長
  株式会社ブリリアントサービス代表取締役
  杉本礼彦

 ・日本Androidの会 組み込みWGリーダー
  株式会社ブリリアントサービス 技術部研究開発課Android担当リーダ
  近藤昭雄

・内容
 ※敬称略
 ・「Androidと日本の携帯のこれから」 杉本礼彦
 ・「Androidによる世界戦略」 今村謙之
 ・「Androidをカスタマイズする方法」 近藤昭雄
  参加特典DVDの環境を使ってAndroidをカスタマイズしてコンパイルし
  Android Dev Phone 1にバイナリを焼くまでを実演します。

・定員
 30名

・参加費用
 15000円
 ※銀行振り込みになります。
  参加のご連絡後に振込先の口座を折り返し連絡させていただきます。
  領収書の発行も可能です。

・参加特典
 ・オリジナルDVDをプレゼント
  以下の内容を収録する予定です。
  ・開発手順
  ・Android Dev Phone 1
   ・購入手順
   ・アクティベーションの方法
  ・開発環境
  ・当日のセミナー資料
 ※内容に多少の変更がある可能性があります。

・主催
 株式会社ブリリアントサービス

定員30名を超えてしまった場合は抽選とさせていただきます。


申込みの締め切りは2009/2/23までです。


※銀行振り込みが2009/2/26までに完了するようにお願いいたします。


セミナー終了後に懇親会を予定しています。


申し込みフォームに参加可否をご記入ください。





2009年2月4日水曜日



f:id:bs-android:20090122021549g:image


2月21日の大阪の日本Androidの会のハンズオンセミナーの参加者受付フォームが準備できましたのでご連絡いたします。


お申込みはこちらまで


受付時間

14:00~14:30


開催時間

14:30~18:00


申込み期限

2月18日(水)


参加費

無料


講演内容

まだ調整中ですが、随時更新されていく予定です。





定員30名までですので、早期に締め切る場合があります。


参加をご希望の方はお早めにお申込みくださいませ。


追記

1/21のエントリで、会場提供していただく企業様を株式会社パソナユース様と記述しておりましたが、株式会社パソナテック様の間違いです。


関係者の方々にはご迷惑をおかけして申し訳ありませんでした。





大阪の日本Androidの会のハンズオンセミナー受付開始



f:id:bs-android:20090122021549g:image


2月21日の大阪の日本Androidの会のハンズオンセミナーの参加者受付フォームが準備できましたのでご連絡いたします。


お申込みはこちらまで


受付時間

14:00~14:30


開催時間

14:30~18:00


申込み期限

2月18日(水)


参加費

無料


講演内容

まだ調整中ですが、随時更新されていく予定です。





定員30名までですので、早期に締め切る場合があります。


参加をご希望の方はお早めにお申込みくださいませ。


追記

1/21のエントリで、会場提供していただく企業様を株式会社パソナユース様と記述しておりましたが、株式会社パソナテック様の間違いです。


関係者の方々にはご迷惑をおかけして申し訳ありませんでした。





2009年2月3日火曜日



f:id:bs-android:20090204001327p:image


タイトルの通り2009/2/3時点のDDMSの使用方法のドキュメントを邦訳しました。


忠実に翻訳するよりもわかりやすさを優先しています。


デバッグする時に活躍すると思いますので、是非ご活用ください。


翻訳が間違っている部分がある可能性もありますが、その際はご指摘いただけたら幸いです。


PDF版も用意しています。



DDMSツールの使用について


 Androidが搭載するデバッギングツールであるDalvik Debug Monitor Service(DDMS)は、ポート-フォワーディングサービス、スクリーンキャプチャー、デバイス上のスレッドとヒープ情報、logcat、プロセス、そして無線状態の情報、疑似音声着信と疑似SMS、疑似位置情報データなどを提供します。


このページは、DDMS機能に関する概要を提供します。ただしすべての仕様とスペックを完全に記載するわけではありません。





 DDMSは、SDKのtools/ ディレクトリに入っています。コマンドプロンプトからsdkのtoolsディレクトリに入り、"ddms"(⇒Mac/Linuxでは"./ddms")と入力します。DDMSはエミュレーターとデバイスの両方で動作します。両方とも同時に実行、接続されている場合はエミュレーターをデフォルトで選択します。


DDMSはどのように動作するのか


 DDMSはデバイス上で動作するアプリケーションとIDE間の接続の仲介を行います。


Android上のあらゆるアプリケーションは各自のプロセスで動作し、各自のバーチャルマシン(VM)のホストをつとめます。そして、各プロセスは異なるポートでデバッガーを監視をします。





 DDMSは開始時にadbに接続し、デバイス・モニタリング・サービス(デバイス監視サービス)を起動します。


デバイス・モニタリング・サービスはデバイスがいつ接続、切断されたのかをDDMSに通知します。


デバイスが接続されるとき、VMモニタリングサービス(VM監視サービス)がadbとDDMSの間で作成生成され、デバイス上のVMがいつ開始、終了したのかをDDMSに通知します。


 VMが走りだすと、DDMSはadbを経由してVMのプロセスID(pid)を取得し、デバイスのadbデーモン(adbd)を通して、VMのデバッガーへのコネクションをオープンし、カスタムのワイヤープロトコルを使って、VMと通信することができます。





 デバイスのVM毎に、DDMSはデバッガーを監視するポートをオープンします。


DDMSは最初のVMをポート8600に、次のVMを8601に、その次に・・という具合に、デバッガーを監視します。


 デバッガーがこれらのポートの一つと接続した時、すべてのトラフィックがデバッガーと、関連付けられたVMに転送されます。どのようなリモートデバッグセッションでも同様にデバッグをすることが可能です。





 DDMSは別のローカルポート、すなわち、DDMS「ベースポート」(デフォルトで、8700)、もオープンします。


「ベースポート」は、デバッガーの監視も行います。デバッガーがこのベースポートに接続すると、すべてのトラフィックがDDMSで現在選択されているVMへ転送されます。このポートはあなたのデバッガが接続する主なポートです。





 DDMSのポート-フォワーディングの詳細については、Configuring your IDE to attach to port 8700 for debuggingを参照してください。





ヒント: "File > Preferences"で、DDMSの設定を行うことができます。


     設定は、「$HOME/.ddmsrc」に保存されます。


Dalvikに関する既知のデバッグ問題


他のVMと同じように、Dalvik VMでアプリケーションをデバッグできなければなりませんが、同期実行しているソースコードを一度ステップアウトすると、現在行が一気に関数の最後の行へジャンプしてしまうかもしれません。


左ペイン


f:id:bs-android:20090204001326p:image


デバッグモニタの左側には、現在見つかっている各エミュレータ/デバイスがVMのリストとともに表示されます。VMは、自身がホストしているアプリケーションのパッケージ名によって識別されます。





 デバッグしたいアクティビティを走らせているVMへアタッチする為にこのリストを使用します。


リスト表示されているのVMの隣(一番右のカラム)に、「デバッガーパス-スルー」ポートがあります。


デバッガーがリストアップされたポートに接続されている場合、デバイスに対応するVMに接続されます。


しかし、DDMSを使うとき、DDMSは現在選択されたVMにポート8700にある全てのトラフィックを転送するので、ポート8700に接続しさえすればよいです。(注意:リストから選択したVMはポート8700を含みます)


このように、VMを切り替えるたびに、デバッガーのポートを再設定する必要はありません。





 デバイスでアプリケーションが実行され、waitForDebugger()が呼ばれると(または、開発者オプションでこのオプションを選んでいる時)、デバッガーがVMへアタッチするのを待つ間、赤いアイコンがクライアント名の横に表示されます。デバッガーが接続されると緑のアイコンになります。





 消し線の引かれたバグアイコンが表示されたら、VMのローカルポートをオープンすることができずに


デバッガーとVMを関連付けられなかったこと意味します。


デバイス上の全てのVMに対してバグアイコンが表示されたら、それは恐らく別のDDMSのインスタンス(Eclipse pluginを含む)を走らせているからだと思われます。





 アプリケーションパッケージの代わりに疑問符が表示されたら、DDMSがadbからアプリケーションpidを受け取ることができたが、VMプロセスで接続が失敗したことを意味します。もしそうなったらDDMSを再起動してみてください。





右ペイン


ウィンドウの右側のデバッグモニタは、便利な情報とクールなツール群のタブを提供します。


Infoタブ

f:id:bs-android:20090204001328p:image


このタブは、選択中のVMのプロセスID、パッケージ名、VMバージョンなどの一般的な情報がいくつか表示します。


Threadsタブ

f:id:bs-android:20090204001329p:image


スレッドビューではターゲットとなるVMプロセス上で動作しているスレッドのリストを持っています。


ワイヤー上に送られるデータの量を減らすために、ツールバーの「スレッド」ボタンをトグルすることで、スレッド情報を常に更新するかどうかを切り替えることが出来ます。このトグル設定は、VMごとに保持されます。


このタブは以下の情報を含んでいます。


・ID


 DalvikVMに割り当てられたユニークなスレッドID。3からはじまる奇数になっています。


・Tid


 プロセスのメインスレッドのためのLinuxのスレッドID。これはプロセスIDにマッチしています。


・Status


 以下はスレッドのステータスの種類です。(デーモンスレッドは、アスタリスク(*)で示されます。)


 ・running:アプリケーション実行中


 ・sleeping:Thread.sleep()をコールしてスリープ中


 ・monitor:モニターロック待ち


 ・wait:Object.wait()をコールしてオブジェクト待ち


 ・native:ネイティブコード実行中


 ・vmwait:VMリソース待ち


 ・zombie:死にゆくスレッド


 ・init:スレッド初期化中(参照すべきでない)


 ・starting:スレッドスタート処理中(参照すべきでない)


・utime


 このスレッドがユーザコードを実行した累積時間。これはLinux直下のプロセスのみ利用可能です。


・stime


 このスレッドがシステムコードを実行した累積時間。これはLinux直下のプロセスのみ利用可能です。


・Name


 スレッドの名前





スレッド開始時に「ID」と「名前」が設定されます。残りのフィールドは、定期的に更新されます。(デフォルトは4秒毎)


VM Heapタブ


f:id:bs-android:20090204001330p:image


ガーベージコレクションの間に更新されたヒープの統計データを表示します。


VMを選択した時にVM Heap表示がヒープの更新ができない場合は、「Show heap updates」ボタン(左上のツールバーにあります)を押してみてください。VM Heap表示のCause GCボタンを押してガーベージコレクションを実行するとヒープのステータスを更新できます。


Allocation Trackerタブ


f:id:bs-android:20090204001331p:image


このビューでは各々のバーチャルマシンのメモリアロケーションを追跡することができます。


Emulator Controlタブ


f:id:bs-android:20090204001332p:image


これらのコントロールで特別なデバイスの状態とアクティビティをシミュレートすることができます。


以下の機能を含んでいます:


・Telephony Status(電話通信ステータス)


電話のVoiceとDataプラン(ホーム、ローミング、サーチング、その他)の状態を変更できます。そして、異なる種類のネットワークのスピードと待ち時間(GPRS、EDGE、UTMS、その他)をシミュレーションすることができます。


・Telephony Actions


 エミュレーターに電話発信とSMSメッセージを送信することができます。


・Location Controls


GPSマッピングのような場所認識操作を活用することができるように、偽のロケーションデータをエミュレーターに送信することが出来ます。


ロケーションコントロールを使うにはAndroidエミュレーターでアプリケーションを起動してDDMSを起動します。エミュレーターのControlsタブをクリックし、Location Controlsが表示されるまで下にスクロールしてください。


ここから、以下の操作を行うことができます:


・経度/緯度座標のデバイスへの手動送信


f:id:bs-android:20090204003319p:image


 Manualタブを選択後、座標フォーマットを選択し、フィールドを記入して「Send」を押して座標情報を送信します。





・プレイバック用ルートが記述されているGPXファイルの使用


f:id:bs-android:20090204003317p:image


 GPXタブを選択後、"Load GPX"ボタンを押してをGPXファイルをロードします。


 ロードが完了したら、Playボタンを押すとルートのプレイバック情報がロケーション認識のあるアプリケーションに送られます。


 GPXからプレイバックを実行する時、DDMSのパネルからPauseとSkipボタンを使ってプレイバックのスピードを調節することができます。MSは"waypoints"(<wpt>:最初のテーブル)と"tracks"(<trk>:2番目のテーブルにある複数のセグメントをサポートしたもの、<trkseg>:単純に連結されている)の両方を解析します。tracksのみ再生することが可能です。


 再生させようとしているtrackを選択している間、リストの最初にある"waypoint"をクリックすると、デバイスへその座標が送信されます。





・連続プレイバックにKMLファイルを使用する


f:id:bs-android:20090204003318p:image


 KMLタブをクリックして、ファイルをロードさせます。


 ロードが完了したら、Playボタンを押すとロケーション認識のあるアプリケーションに座標が送信されます。


 KMLファイルを使用する際に、<coordinates>エレメントとして解析されます。


 経度、緯度、高度の値が一つのセットになっている必要があります。


 例:



 <coordinates>-122.084143,37.421972,4</coordinates>

 ファイルには複数の<Placemark>要素や<coordinates>要素が含まれるかもしれません。


そのような場合はplacemarksのコレクションはトラックとして加えられます。


DDMSは1秒につき1つのplacemarkをデバイスに送信します。


 適当なKMLファイルを生成するにはGoogle Earthを使う方法があります。


 Google Earthで適当な地点を右クリックすると、左にKmlに設定する保存フォーマットと"Save place as..."が表示されます。



注:DDMSは、以下のメソッドで作成されるルートをサポートしていません。


  <MultiGeometry><LineString>lat1、long1、lat2、long2、...</LineString></MultiGeometry>


  <Placemark>中の<TimeStamp>ノードのサポートはしていません。


  将来のリリースでは一つの座標要素内での時間とメソッドをサポートするかもしれません。



 擬似座標データのその他のメソッドは、


Location-based Service APIsを参照してください。


File Explorer


f:id:bs-android:20090204001333p:image


File Explorerを用いれば、デバイスのファイルシステムを見ることができ、ファイルを置いたり取り出したりする基本的な管理を行うことができます。





これによって、adbのpushやpullコマンドをの使用しないでGUIによる操作が可能です。


ディレクトリをデバイスにドラッグ&ドロップすることはできますが、ディレクトリをドラッグアウトすることはできません。


ファイルをデバイスからコピーするには、ファイルを選んで、ツールバーのDeviceボタンからPull Fileをクリックしてください。


ファイルを削除するには、ツールバーでDeleteボタンを使ってください。





エミュレーターでSDカードイメージを使うにはイメージを作成するためにmksdcardコマンドを使う必要があります。そして、エミュレーターをブートする時にイメージをマウントさせます。


例えば、以下のようにして/toolsディレクトリから実行します。



$ mksdcard 1024M ./img
$ emulator -sdcard ./img


エミュレーターが動作している間、DDMS File Explorerでsdcardディレクトリに読込み及び書込みを行うことができます。しかし、追加したファイルが、自動的には表示されないかもしれません。


例えば、MP3ファイルをsdcardに追加した時、エミュレーターを再起動するまではメディアプレーヤーはそれらを認識しません。 (コマンドラインからエミュレーターを再起動させる際、必ずもう一度sdcardをマウントさせるようにしてください。)





SDカードイメージの作成方法の詳細については、


Other Toolsを参照してください。


Screen Capture


f:id:bs-android:20090204001334p:image


メニューバーにある Device > Screen capture...を選択する、あるいは、CTRL-Sを押すことによって、デバイスまたはエミュレーターのスクリーン画像をキャプチャーすることができます。


Exploring Processes


f:id:bs-android:20090204001335p:image


メニューバーにある Device > Show process status...を選択すると、選択したVMの"ps -x"出力を見ることができます。


Cause a GC to Occur


f:id:bs-android:20090204001336p:image


ツールバーのゴミ箱ボタンを押すと、ガーベージコレクションを発生させることができます。


Running Dumpsys and Dumpstate on the Device (logcat)


f:id:bs-android:20090204001337p:image


・Dalvikからdumpsys(logcat)を実行させるには、メニューバーから Device > Run logcat...を選択してください。


・Dalvikからdumpstateを実行させるには、メニューバーで Device > Dump device state...を選択してください。


Examine Radio State(無線状態の検査)


デフォルトで、無線状態は標準のlogcatでは出力されません(多くの情報が出る為)。


無線情報を見るには、Device > Dump radio state...をクリックするか、Logging Radio Informationで記述されているように、logcatを実行してください。


Stop a Virtual Machine


Actions > Halt VM を選ぶと、バーチャルマシンを停止することができます。


このボタンを押すと、VMにSystem.exit(1) をコールするさせることになります。


Known issues with DDMS(DDMSの既知の問題)


DDMSには、以下の既知の制限があります:


デバッガーをつないで切断すると、ddmsはクライアントを落として再接続します。


するとVMはデバッガが消えてしまったと認識してしまいます。これは、そのうちFIXされるでしょう。



PDF版はこちらです。





AndroidのDDMSの使用方法のドキュメントを翻訳しました



f:id:bs-android:20090204001327p:image


タイトルの通り2009/2/3時点のDDMSの使用方法のドキュメントを邦訳しました。


忠実に翻訳するよりもわかりやすさを優先しています。


デバッグする時に活躍すると思いますので、是非ご活用ください。


翻訳が間違っている部分がある可能性もありますが、その際はご指摘いただけたら幸いです。


PDF版も用意しています。



DDMSツールの使用について


 Androidが搭載するデバッギングツールであるDalvik Debug Monitor Service(DDMS)は、ポート-フォワーディングサービス、スクリーンキャプチャー、デバイス上のスレッドとヒープ情報、logcat、プロセス、そして無線状態の情報、疑似音声着信と疑似SMS、疑似位置情報データなどを提供します。


このページは、DDMS機能に関する概要を提供します。ただしすべての仕様とスペックを完全に記載するわけではありません。





 DDMSは、SDKのtools/ ディレクトリに入っています。コマンドプロンプトからsdkのtoolsディレクトリに入り、"ddms"(⇒Mac/Linuxでは"./ddms")と入力します。DDMSはエミュレーターとデバイスの両方で動作します。両方とも同時に実行、接続されている場合はエミュレーターをデフォルトで選択します。


DDMSはどのように動作するのか


 DDMSはデバイス上で動作するアプリケーションとIDE間の接続の仲介を行います。


Android上のあらゆるアプリケーションは各自のプロセスで動作し、各自のバーチャルマシン(VM)のホストをつとめます。そして、各プロセスは異なるポートでデバッガーを監視をします。





 DDMSは開始時にadbに接続し、デバイス・モニタリング・サービス(デバイス監視サービス)を起動します。


デバイス・モニタリング・サービスはデバイスがいつ接続、切断されたのかをDDMSに通知します。


デバイスが接続されるとき、VMモニタリングサービス(VM監視サービス)がadbとDDMSの間で作成生成され、デバイス上のVMがいつ開始、終了したのかをDDMSに通知します。


 VMが走りだすと、DDMSはadbを経由してVMのプロセスID(pid)を取得し、デバイスのadbデーモン(adbd)を通して、VMのデバッガーへのコネクションをオープンし、カスタムのワイヤープロトコルを使って、VMと通信することができます。





 デバイスのVM毎に、DDMSはデバッガーを監視するポートをオープンします。


DDMSは最初のVMをポート8600に、次のVMを8601に、その次に・・という具合に、デバッガーを監視します。


 デバッガーがこれらのポートの一つと接続した時、すべてのトラフィックがデバッガーと、関連付けられたVMに転送されます。どのようなリモートデバッグセッションでも同様にデバッグをすることが可能です。





 DDMSは別のローカルポート、すなわち、DDMS「ベースポート」(デフォルトで、8700)、もオープンします。


「ベースポート」は、デバッガーの監視も行います。デバッガーがこのベースポートに接続すると、すべてのトラフィックがDDMSで現在選択されているVMへ転送されます。このポートはあなたのデバッガが接続する主なポートです。





 DDMSのポート-フォワーディングの詳細については、Configuring your IDE to attach to port 8700 for debuggingを参照してください。





ヒント: "File > Preferences"で、DDMSの設定を行うことができます。


     設定は、「$HOME/.ddmsrc」に保存されます。


Dalvikに関する既知のデバッグ問題


他のVMと同じように、Dalvik VMでアプリケーションをデバッグできなければなりませんが、同期実行しているソースコードを一度ステップアウトすると、現在行が一気に関数の最後の行へジャンプしてしまうかもしれません。


左ペイン


f:id:bs-android:20090204001326p:image


デバッグモニタの左側には、現在見つかっている各エミュレータ/デバイスがVMのリストとともに表示されます。VMは、自身がホストしているアプリケーションのパッケージ名によって識別されます。





 デバッグしたいアクティビティを走らせているVMへアタッチする為にこのリストを使用します。


リスト表示されているのVMの隣(一番右のカラム)に、「デバッガーパス-スルー」ポートがあります。


デバッガーがリストアップされたポートに接続されている場合、デバイスに対応するVMに接続されます。


しかし、DDMSを使うとき、DDMSは現在選択されたVMにポート8700にある全てのトラフィックを転送するので、ポート8700に接続しさえすればよいです。(注意:リストから選択したVMはポート8700を含みます)


このように、VMを切り替えるたびに、デバッガーのポートを再設定する必要はありません。





 デバイスでアプリケーションが実行され、waitForDebugger()が呼ばれると(または、開発者オプションでこのオプションを選んでいる時)、デバッガーがVMへアタッチするのを待つ間、赤いアイコンがクライアント名の横に表示されます。デバッガーが接続されると緑のアイコンになります。





 消し線の引かれたバグアイコンが表示されたら、VMのローカルポートをオープンすることができずに


デバッガーとVMを関連付けられなかったこと意味します。


デバイス上の全てのVMに対してバグアイコンが表示されたら、それは恐らく別のDDMSのインスタンス(Eclipse pluginを含む)を走らせているからだと思われます。





 アプリケーションパッケージの代わりに疑問符が表示されたら、DDMSがadbからアプリケーションpidを受け取ることができたが、VMプロセスで接続が失敗したことを意味します。もしそうなったらDDMSを再起動してみてください。





右ペイン


ウィンドウの右側のデバッグモニタは、便利な情報とクールなツール群のタブを提供します。


Infoタブ

f:id:bs-android:20090204001328p:image


このタブは、選択中のVMのプロセスID、パッケージ名、VMバージョンなどの一般的な情報がいくつか表示します。


Threadsタブ

f:id:bs-android:20090204001329p:image


スレッドビューではターゲットとなるVMプロセス上で動作しているスレッドのリストを持っています。


ワイヤー上に送られるデータの量を減らすために、ツールバーの「スレッド」ボタンをトグルすることで、スレッド情報を常に更新するかどうかを切り替えることが出来ます。このトグル設定は、VMごとに保持されます。


このタブは以下の情報を含んでいます。


・ID


 DalvikVMに割り当てられたユニークなスレッドID。3からはじまる奇数になっています。


・Tid


 プロセスのメインスレッドのためのLinuxのスレッドID。これはプロセスIDにマッチしています。


・Status


 以下はスレッドのステータスの種類です。(デーモンスレッドは、アスタリスク(*)で示されます。)


 ・running:アプリケーション実行中


 ・sleeping:Thread.sleep()をコールしてスリープ中


 ・monitor:モニターロック待ち


 ・wait:Object.wait()をコールしてオブジェクト待ち


 ・native:ネイティブコード実行中


 ・vmwait:VMリソース待ち


 ・zombie:死にゆくスレッド


 ・init:スレッド初期化中(参照すべきでない)


 ・starting:スレッドスタート処理中(参照すべきでない)


・utime


 このスレッドがユーザコードを実行した累積時間。これはLinux直下のプロセスのみ利用可能です。


・stime


 このスレッドがシステムコードを実行した累積時間。これはLinux直下のプロセスのみ利用可能です。


・Name


 スレッドの名前





スレッド開始時に「ID」と「名前」が設定されます。残りのフィールドは、定期的に更新されます。(デフォルトは4秒毎)


VM Heapタブ


f:id:bs-android:20090204001330p:image


ガーベージコレクションの間に更新されたヒープの統計データを表示します。


VMを選択した時にVM Heap表示がヒープの更新ができない場合は、「Show heap updates」ボタン(左上のツールバーにあります)を押してみてください。VM Heap表示のCause GCボタンを押してガーベージコレクションを実行するとヒープのステータスを更新できます。


Allocation Trackerタブ


f:id:bs-android:20090204001331p:image


このビューでは各々のバーチャルマシンのメモリアロケーションを追跡することができます。


Emulator Controlタブ


f:id:bs-android:20090204001332p:image


これらのコントロールで特別なデバイスの状態とアクティビティをシミュレートすることができます。


以下の機能を含んでいます:


・Telephony Status(電話通信ステータス)


電話のVoiceとDataプラン(ホーム、ローミング、サーチング、その他)の状態を変更できます。そして、異なる種類のネットワークのスピードと待ち時間(GPRS、EDGE、UTMS、その他)をシミュレーションすることができます。


・Telephony Actions


 エミュレーターに電話発信とSMSメッセージを送信することができます。


・Location Controls


GPSマッピングのような場所認識操作を活用することができるように、偽のロケーションデータをエミュレーターに送信することが出来ます。


ロケーションコントロールを使うにはAndroidエミュレーターでアプリケーションを起動してDDMSを起動します。エミュレーターのControlsタブをクリックし、Location Controlsが表示されるまで下にスクロールしてください。


ここから、以下の操作を行うことができます:


・経度/緯度座標のデバイスへの手動送信


f:id:bs-android:20090204003319p:image


 Manualタブを選択後、座標フォーマットを選択し、フィールドを記入して「Send」を押して座標情報を送信します。





・プレイバック用ルートが記述されているGPXファイルの使用


f:id:bs-android:20090204003317p:image


 GPXタブを選択後、"Load GPX"ボタンを押してをGPXファイルをロードします。


 ロードが完了したら、Playボタンを押すとルートのプレイバック情報がロケーション認識のあるアプリケーションに送られます。


 GPXからプレイバックを実行する時、DDMSのパネルからPauseとSkipボタンを使ってプレイバックのスピードを調節することができます。MSは"waypoints"(<wpt>:最初のテーブル)と"tracks"(<trk>:2番目のテーブルにある複数のセグメントをサポートしたもの、<trkseg>:単純に連結されている)の両方を解析します。tracksのみ再生することが可能です。


 再生させようとしているtrackを選択している間、リストの最初にある"waypoint"をクリックすると、デバイスへその座標が送信されます。





・連続プレイバックにKMLファイルを使用する


f:id:bs-android:20090204003318p:image


 KMLタブをクリックして、ファイルをロードさせます。


 ロードが完了したら、Playボタンを押すとロケーション認識のあるアプリケーションに座標が送信されます。


 KMLファイルを使用する際に、<coordinates>エレメントとして解析されます。


 経度、緯度、高度の値が一つのセットになっている必要があります。


 例:



 <coordinates>-122.084143,37.421972,4</coordinates>

 ファイルには複数の<Placemark>要素や<coordinates>要素が含まれるかもしれません。


そのような場合はplacemarksのコレクションはトラックとして加えられます。


DDMSは1秒につき1つのplacemarkをデバイスに送信します。


 適当なKMLファイルを生成するにはGoogle Earthを使う方法があります。


 Google Earthで適当な地点を右クリックすると、左にKmlに設定する保存フォーマットと"Save place as..."が表示されます。



注:DDMSは、以下のメソッドで作成されるルートをサポートしていません。


  <MultiGeometry><LineString>lat1、long1、lat2、long2、...</LineString></MultiGeometry>


  <Placemark>中の<TimeStamp>ノードのサポートはしていません。


  将来のリリースでは一つの座標要素内での時間とメソッドをサポートするかもしれません。



 擬似座標データのその他のメソッドは、


Location-based Service APIsを参照してください。


File Explorer


f:id:bs-android:20090204001333p:image


File Explorerを用いれば、デバイスのファイルシステムを見ることができ、ファイルを置いたり取り出したりする基本的な管理を行うことができます。





これによって、adbのpushやpullコマンドをの使用しないでGUIによる操作が可能です。


ディレクトリをデバイスにドラッグ&ドロップすることはできますが、ディレクトリをドラッグアウトすることはできません。


ファイルをデバイスからコピーするには、ファイルを選んで、ツールバーのDeviceボタンからPull Fileをクリックしてください。


ファイルを削除するには、ツールバーでDeleteボタンを使ってください。





エミュレーターでSDカードイメージを使うにはイメージを作成するためにmksdcardコマンドを使う必要があります。そして、エミュレーターをブートする時にイメージをマウントさせます。


例えば、以下のようにして/toolsディレクトリから実行します。



$ mksdcard 1024M ./img
$ emulator -sdcard ./img


エミュレーターが動作している間、DDMS File Explorerでsdcardディレクトリに読込み及び書込みを行うことができます。しかし、追加したファイルが、自動的には表示されないかもしれません。


例えば、MP3ファイルをsdcardに追加した時、エミュレーターを再起動するまではメディアプレーヤーはそれらを認識しません。 (コマンドラインからエミュレーターを再起動させる際、必ずもう一度sdcardをマウントさせるようにしてください。)





SDカードイメージの作成方法の詳細については、


Other Toolsを参照してください。


Screen Capture


f:id:bs-android:20090204001334p:image


メニューバーにある Device > Screen capture...を選択する、あるいは、CTRL-Sを押すことによって、デバイスまたはエミュレーターのスクリーン画像をキャプチャーすることができます。


Exploring Processes


f:id:bs-android:20090204001335p:image


メニューバーにある Device > Show process status...を選択すると、選択したVMの"ps -x"出力を見ることができます。


Cause a GC to Occur


f:id:bs-android:20090204001336p:image


ツールバーのゴミ箱ボタンを押すと、ガーベージコレクションを発生させることができます。


Running Dumpsys and Dumpstate on the Device (logcat)


f:id:bs-android:20090204001337p:image


・Dalvikからdumpsys(logcat)を実行させるには、メニューバーから Device > Run logcat...を選択してください。


・Dalvikからdumpstateを実行させるには、メニューバーで Device > Dump device state...を選択してください。


Examine Radio State(無線状態の検査)


デフォルトで、無線状態は標準のlogcatでは出力されません(多くの情報が出る為)。


無線情報を見るには、Device > Dump radio state...をクリックするか、Logging Radio Informationで記述されているように、logcatを実行してください。


Stop a Virtual Machine


Actions > Halt VM を選ぶと、バーチャルマシンを停止することができます。


このボタンを押すと、VMにSystem.exit(1) をコールするさせることになります。


Known issues with DDMS(DDMSの既知の問題)


DDMSには、以下の既知の制限があります:


デバッガーをつないで切断すると、ddmsはクライアントを落として再接続します。


するとVMはデバッガが消えてしまったと認識してしまいます。これは、そのうちFIXされるでしょう。



PDF版はこちらです。





Related Posts Plugin for WordPress, Blogger...