2010年8月31日火曜日

BeagleBoard-xM届きました

万年金欠どころか、最近では借金まみれとも噂される隠者でございます。
組込みと呼ばれる業界の難しいところは、勉強のためにハードウェアを購入しないとならないことですよね。おかげさまでいつもお財布が悲鳴を上げています。

まぁ、そんなわけで仕入れた、期待の新星 BeagleBoard-xM。この性能でこのお値段はびっくりですよね。


左側が、BeagleBoard RevCで、右側がBeagleBoard-xMのA2です。
ちょっとサイズが大きくなりました。


USBが4つに、そして待望のEthernetが追加されてます。



USB OTG portはBeagleBoardからかわりないですが、以前はピンコネクタのみだったシリアルポートが今回はボードに直付けされてます。これは便利です。はい。


音声の出力とVideoは、前回同様のようです。DVD-D(HDMI)がついてますね。


JTAG pinも以前と同じですが、今回はカメラ用のピンコネクタがついてます。その右上にちっちゃくあるのはGNDピンですね。今回は豪勢にピンやコネクタが付きまくりです。裏面はというと


ついてます。右上にLCD関連ピンコネクタ。その下はExpansionコネクタです。Power,McBSP,I2C,MMC2,UART,McSPI,GPIO,PWMがここにでているようです。
ちょっと見づらいですが、左上にあるのが、Micro SDのスロットで、その右にこっそり4pin分のMcBSP2 portも出ています。

その下の方にあるのは、Auxiliary Access Headerで、MMC3, GPIO,ADC,HDQとマニュアルに記載されてます。
Beagle Boardよりも色々用意されているようです。しかもコネクタまで実装してくれている豪勢さ。いやぁ、すばらしいです。

CPUは、Texas Instruments Cortex A8 1GHz processor
Memoryは、Micron 4Gb MDDR SDRA(512MB) 200MHz
今回は、NANDこそ無いものの、かなりリッチな環境になっているのは間違いありません。

ついでに、今回はmicro SDが付属していました。中身は
  • md5Sum.txt
  • MLO
  • ramdisk.gz
  • ramfs.img
  • u-boot.bin
  • uImage
  • user.scr
となっています。これ、テスト起動用ディスクですね。
というわけで、こちらのmicro SDから起動してみました。
電源投入と同時にシリアルコンソールには色々でましたけど、なんだか起動は遅いです。特に、ramdisk.gzの展開に時間がかかるのか、このファイルの読み込みに結構時間がかかりました。

以前は、電源を入れてすぐにHDMIから犬の絵が表示されていましたけど、このMicroSDカードには入ってないようです。おかげで、シリアルをつながないと、途中でとまっているのではないかと、かなり不安に感じます。
こちらは、起動完了後のログイン画面です。


とりあえず、今週は色々と忙しいので、お遊びができるかどうかちょっと怪しい所なんですが。まぁ、時間があれば、まずはAndroidから動かしてみないとなぁと思ってます。

2010年8月30日月曜日

JAG 横浜支部 PF部の勉強会で発表してきました

人前で話すのが苦手な隠者でございます。

でも、こればかりは何時までも避けていてはけして上達しないわけで。とりあえず、PF部くらいの少人数、非Ustな環境なら、多少は話せるのではないかと、第一回目の簡単な発表を行なってきました。

反省点

  1. 時間ばかり気にして、話の「間」がうまく取れてなかったなと思います。聞いてくださってるみなさんが、ちゃんと内容を咀嚼できるように緩急をつけて話すべきなんですが・・・話し始めるとそこを考える余裕はさっぱりありませんでした。
  2. 資料の文字のサイズが小さすぎたかも。まぁ、最初は壁に写していたこともあって、文字が潰れてさっぱり見えませんでした。人数を考えれば、実は紙を数枚用意して回すとか気を使ってみればよかったかも。
  3. もうちょっと終わった後の質問が出やすいようなネタを仕込んでおければよかったのだけど・・・・。一応、みなさんの知識レベルを共有する意味で、これ知ってる人?とか聞いてみたので、今後は、もうちょっと楽しくみんなで考えられるネタが仕込めるといいなぁとか思ってます。
  4. 資料作成が遅くて事前公開できてなかったのは失敗でした。あと、keynoteはとっても素敵なんだけど、keynoteのエフェクトに頼りすぎると後で公開したときに後悔するはめに。
  5. もうちょっと発表するときの自分に余裕が欲しい・・・・。
とまぁ、反省すべき点が多々ある発表ではございましたが・・・。とりあえず、この週末を乗りきれて何よりです。9月は色々忙しいですし、でしゃばって発表しすぎるのもなんなので、9月の集まりは他の方々の発表を楽しみにしつつ、何かのネタを温めておきます。はい。

一応、こちらが発表資料のPDF版です。
Blogとほとんどかぶってますし、大したものではないのでお役に立つかわかりませんが、興味があればお持ち下さい。

2010年8月27日金曜日

Androidのソースの構成を軽くおさらいしてみる

珍しく割とこまめに投稿している隠者でございます。
いやまぁ、今週末のネタ作りのために色々考えなくてはならないわけで・・・・。考えたネタをさらにkeynoteにまとめなければなので、時間も、ネタも足りない気がしてならないですが。
しかも、話す内容まで考えないと・・・うわぁぁん。てな状況です。はい、まだ資料になってません。

さて、今回のおはなしの肝は、最初のAndroidネタの日記の絵が3枚でほぼ全てなんですが、それだけだと持ち時間30分程度なんて時間はつぶせません。いや、話すのは最後なので、もしかしたら時間が押していて、軽く終わるという可能性もあるのですけど。

# 誰ですか?みんなあまり話すことがなくて、時間が大きく余ってるかもよとかいう人は!

ともかく、とりあえずPF部的アーキテクチャ図について軽くお話した後、ソースの構成まで立ち入って軽く見て、最後に、ソースを追いかける時に便利な、envsetup.shのお話をして、後は、アーキテクチャ図にいちゃもんをつけていただいて、議論がいい感じになったあたりで、ちゃんちゃんと行きたいなと思ってまして。そういう意味では、ちょっと日記が前後してしまいますが、まぁ、今日はソースの構成を軽くおさらいです。

というわけで、Android 2.2のソースコードでトップディレクトリを見てみましょう。
ソースコードは大きく分けると、Androidのシステムを構成するソース・ファイル群と開発環境を構成するファイル群とに分けられます。

* Androidのコード群
種別 ディレクトリ概要
Applicationspackagesアプリケーション
Application FrameworkframeworkAndroid Framework
Android RuntimedalvikDalvik VM
Library externalサードパーティ製ライブラリ(正確には、qemuのようなSDK用のプログラムや、pingのようなインストールするコマンドも含まれる)
HAL hardwareハードウェア抽象化レイヤのコード
System systembluetooth tools, システムファイル, wlan等システムに必要なファイル類
Bionicbioniclibcおよびローダ等、基本となるライブラリ・プログラムのコード

* 開発環境コード
種別ディレクトリ概要
Build関連buildビルド用のMakefile,シェルスクリプト等
prebuiltバイナリ提供のツール類(クロスコンパイラ等)
deviceデバイス固有のMakeファイル、スクリプト関連
SDK関連sdkSoftware Development Kit code
NDK関連ndkNative Development Kit code
ツール関連developmentPlatform engineering tools
テスト関連ctsAndroid CTS (Compatibility Test Suite)
Bootloader関連bootableブートローダリファレンスコード

ポーティングを意識してコードを読んでいくとすると、目を通しておくべき箇所を敢えて選ぶとすると。
  • hardware
    ハードウェアを有効に利用できるようにするのに実装が必要
  • system
    デバイスファイルを作っているinit等、いくつかのプログラムに手を入れる必要があるかも。init.rcのオリジナルも置いてあるので個々は意外とよく探索することになります。
  • device
    デバイスに合わせたビルド環境の構築のために必要
  • framework
    トラブルが起きた時に、logcatの内容からコードを追いかけて行くのによく読む場所

といった所でしょうか。もう少し詳しく踏み込みたい所ですが、まぁ、アーキテクチャの概要という趣旨から外れるので、PF部での発表ではここまででしょうかねぇ。というわけで、今日、明日は、資料作りに専念するため、更新はなしかと思いますので、あしからず。

2010年8月25日水曜日

ソースを追うのに便利なenvsetup.shのコマンド

Javaはあまり詳しくない隠者でございます。

言い訳から始めるのもどうかなと思いますが、とりあえず、Javaは、かなり昔に独学でかじった程度なんです。そんなわけで、出展もはっきり覚えていませんが、Javaというのは、ソースツリーのディレクトリもまたアーキテクチャの一つとしてとらえている言語だったように記憶しています。

隠者は、もともとTags系(etagsとかgtagsとか)を使いません。隠者は、ソースコードを格納するディレクトリも、アーキテクチャをしっかり考え、意味あるものにすべきだと考えてきており、ディレクトリ構成も含めて「アーキテクチャ」として考えられているのであれば、おおよそコードのある位置を覚えてしまう方が、都合がよいからです。そんなわけで、どこに目的のコードがあるかを意識しにくくなるタグジャンプは、記憶力の悪い隠者に便利すぎるツールになってしまうからです。

そのような理由から、普段からソースコードは手作業で追いかけているわけですが、この場合、主にgrepを使う事になります。
ただし、ファイル数が多かったりディレクトリが深くなったりすると、find等もいろいろ組み合わせ結構コマンドを打つのも手間になったりします。
そんなgrepに関して、Androidのbuild/envsetup.shの中に、少しだけ便利になる関数が定義されています。それは

  • cgrep PATTERN
  • jgrep PATTERN
  • resgrep PATTERN
  • sgrep PATTERN

です。それぞれ、Cソースコード、Javaソースコード、Resourceファイル、すべてのソースファイルにPATTERNでgrepをかけて、検索したキーワードを色分けして表示してくれるというコマンドです。長々とgrepコマンドを書くことなく、grepがかけられるので、grepで解析する派のあなたには重宝するツールになるでしょう。

ちなみに、他にもいくつかのコマンドが定義されています。ビルド時に使われるものもあれば、開発作業に有用なものもありますので、中身を一度チェックしてみるとよいかもしれません。
なお、以下にコマンドの一覧と、わかるものには簡単な解説なり、コメントの抜書きなりを記載しておきます。

ずいぶん大量に穴があいてますが、穴埋めは今後の課題ということでお許しください。

help

helpを表示する(一部のコマンドのみ)

get_abs_build_var

Get the value of a build variable as an absolute path.

get_build_var

Get the exact value of a build variable.

check_product

check to see if the supplied product is one we can build

check_variant

check to see if the supplied variant is valid

setpaths


printconfig


set_stuff_for_environment


set_sequence_number


settitle


choosesim


choosetype


chooseproduct


choosevariant


choosecombo


add_lunch_combo


print_lunch_menu


lunch


tapas

Configures the build to build unbundled apps.Run tapas with one ore more app names (from LOCAL_PACKAGE_NAME)

gettop

topディレクトリを表示する

m

プロジェクトのトップディレクトリでmakeを行う。

findmakefile

現在のディレクトリを上に遡りながら、Android.mkファイルを見つける

mm

現在のディレクトリのAndroid.mk内のモジュールをトップディレクトリからmakeする

mmm dirname

dirnameで指定したディレクトリのAndroid.mk内のモジュールをトップディレクトリからmakeする

croot

トップディレクトリに移動する

cproj

ディレクトリを上に遡りAndroid.mkのあるディレクトリに移動する

pid program

adb接続した先のprogramのPIDを取得する

systemstack

systemstack - dump the current stack trace of all threads in the system process to the usual ANR traces file

gdbclient [EXE] [PORT] [PROG]

arm-eabi-gdbを起動し、各種シンボルを読み込んでgdbserverへ接続する

sgrep PATTERN

.*\.(c|h|cpp|S|java|xml|sh|mk)に対してPATTERNでgrepをかける

jgrep PATTERN

.*\.javaに対してPATTERNでgrepをかける

cgrep PATTERN

.*\.cに対してPATTERNでgrepをかける

resgrep PATTERN

*\.xmlに対してPATTERNでgrepをかける

mgrep PATTERN

.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk)に対してPATTERNでgrepをかける

treegrep PATTERN

.*\.(c|h|cpp|S|java|xml)に対して、grep -iをかける

getprebuilt

ANDROID_PREBUILTS変数の値を取得する

tracedmdump tracename

tracenameのdmtraceを実行する

runhat [ -d | -e | -s serial ] target-pid [output-file]

communicate with a running device or emulator, set up necessary state,and run the hat command.

getbugreports

/sdcard/bugreportsのバグレポートファイルを取得する

startviewserver


stopviewserver


isviewserverstarted


smoketest

SmokeTestApp.apk SmokeTest.apkを再インストールし実行する?

runtest args

argsを引数として/development/testrunner/runtest.pyを実行する

godir regexp

PATTERNにマッチするディレクトリのリストを表示し、選択されたディレクトリに移動する

set_java_home

JAVA_HOME環境変数がない場合に固定値を設定する

2010年8月23日月曜日

Androidのバージョン

なんというかあっという間に一週間だった隠者でございます。
いやぁ、私事でもろもろございまして、早速三日坊主みたいな状況に。

まぁ、でも、実際、発表は来週という状況で、そろそろ色々話の流れを考えなくてはならない状況で、意外と切羽詰ってまいりました。

さて、Androidには、実は大きな弱点がありまして。それは進化が速すぎた事。

日本Androidの会でAndroid関連の書籍の著者の方々も書いてる間にバージョンが上がってしまってというような苦労話をされていました。最近でこそかなり落ち着いている感がありますが、以前は、バージョンの変更に伴いAPIも結構変わったりして、アプリ開発の書籍を買ってきてそのとおりに打ち込んだのに動かないなんて話もよく耳にしたものです。

プラットフォームの移植を考えるときでも、やはりバージョンというのは悩みものです。でまぁ、話をする時には、どのバージョンの話なのか明確にできるように、きちんと把握しておきたいなと思ってます。

実は、バージョンについて、各特徴というのは、wikipediaに出てました。

プロジェクト名バージョン公開日Linux Kernel新機能
Cupcake 1.5 2009/04/40 2.6.27
  • Ability to record and watch videos through camcorder mode
  • Uploading videos to YouTube and pictures to Picasa directly from the phone
  • A new soft-keyboard with text-prediction
  • Bluetooth A2DP and AVRCP support
  • Ability to automatically connect to a Bluetooth headset within a certain distance
  • New widgets and folders that can populate the Home screens
  • Animated screen transitions
Donut 1.6 2009/09/15 2.6.29
  • An improved Android Market experience
  • An integrated camera, camcorder, and gallery interface
  • Gallery now enables users to select multiple photos for deletion
  • Updated Voice Search, with faster response and deeper integration with native applications, including the ability to dial contacts
  • Updated search experience to allow searching bookmarks, history, contacts, and the web from the home screen
  • Updated technology support for CDMA/EVDO, 802.1x, VPNs, and a text-to-speech engine
    Support for WVGA screen resolutions
  • Speed improvements in searching and camera applications
  • Gesture framework and GestureBuilder development tool
Eclair 2.0 2009/10/26
  • Optimized hardware speed
  • Support for more screen sizes and resolutions
  • Revamped UI
  • New Browser UI and HTML5 support
  • New contact lists
  • Better white-black ratio for backgrounds
  • Improved Google Maps 3.1.2
  • Microsoft Exchange support
  • Built in flash support for Camera
  • Digital Zoom
  • MotionEvent class enhanced to track multi-touch events
  • Improved virtual keyboard
  • Bluetooth 2.1
2.1 2010/01/12
  • Live Wallpapers
Froyo 2.2 2010/05/20 2.6.32
  • General Android OS speed, memory, and performance optimizations
  • Additional application speed improvements courtesy of JIT implementation
  • Integration of Chrome's V8 JavaScript engine into the Browser application
  • Increased Microsoft Exchange support (security policies, auto-discovery, GAL look-up, calendar synchronization, remote wipe)
  • Improved application launcher with shortcuts to Phone and Browser applications
    USB tethering and WiFi hotspot functionality
  • Added an option to disable data access over mobile network
  • Updated Market application with batch and automatic update features
  • Quick switching between multiple keyboard languages and their dictionaries
    Voice dialing and contact sharing over Bluetooth
  • Support for numeric and alphanumeric passwords
  • Support for file upload fields in the Browser application
  • Browser can now display animated GIFs (instead of just the first frame)
  • Support for installing applications to the expandable memory
  • Adobe Flash 10.1 support

長くなりましたが、wikipedia英語版から概ね抜粋させていただきました。ちょっとLinux Kernelについて別の列に分けたので若干見にくいかもしれませんが。
プロジェクト名という呼び方が公式にされているかどうかはわかりません。ただ、海外でのプロダクト開発の場合、あるリリースに向けた開発に「プロジェクト名」をつけるのが一般的なようです。そのプロジェクトの成果物としてブラッシュアップしたものが、リリース版になるわけです。
git上にも、プロジェクトを指すタグと、リリースした製品バージョンを示すタグがあることから、そういった一般的な流れに沿って開発が行われているんじゃないかと思います。

ちなみに、この表の発表年月日を見ると、1.5から2.0までの進化の速さは異様でしょう。丁度かなり盛り上がりを見せ始めたところでしたし、この頃はバージョンアップの速さに悲鳴がちらほら聞こえていたものです。

なお、今後については、ソースが見当たらないのでうる覚えな情報ですが、今後は、短気のスパンで出すのではなく、一定のスパンで出すようにしたいという方向にあったはずです。ですので、ここまで無茶な出方は今後しないはずです。

ところで、AndroidのバージョンとLinux Kernelのバージョンの更新は別段同期していません。Android用のLinux Kernelには、いくつかGoogleの独自追加した機能やドライバが必要になるのですが、これはLinux本家で行われているわけでもなく、アップストリームへの還元もいまいちうまくいっていないようです。

PF部として移植の対象として考える場合は、どうしても、Linuxのカーネルと、Androidのユーザーランドの2種類を念頭に入れる必要があります。

なお、面白い事に、Kernel依存の機能というのは、HALをのぞけばほとんどないようで、たとえば、EclairとLinux Kernel 2.6.27の組み合わせでも、基本的な機能の動作は可能です。おそらく、カメラ周りや、センサー周り等、HALを適切に実装していけば、異なるKernelでもそれなりの動きはするのでしょう。

ただし、最近のinit.rc等を読むと、Control Group等のカーネルのごく最近の機能なども積極的に使われていることから、真面目なポーティングを考えるのであれば、できるだけカーネルのバージョンも公式に発表されている製品に合わせてポーティングしたいものです。

2010年8月14日土曜日

Androidのアーキテクチャ図を描いてみる

日本Androidの会 横浜支部 プラットフォーム部参加中の隠者<hermit4>でございます。
さて、栄えある第一回の勉強会で、何か簡単な発表をすることになりました。

初回顔合わせの会で集まったメンバーは、必ずしもAndroidの下回りに精通している人たち・・・というわけではなく、これから学びたいと思っていらっしゃる方もいて安心しました。正直、仕事としてはAndroidとは無縁のアプリばかりをやってる人なので、場違いだったらどうしようかとも思ってたもので。

まぁ、でも、そういうわけなので、まだまだ初学者な隠者が、同じくこれから勉強をと思う方に初回らしく示せるものが無いかなと色々考えた末、これから、どこを学んでいきたいか、その指針の一助にでもなればと、Androidのアーキテクチャ構成について、簡単に説明してみようかなと考えています。ま、そんなわけで、まずはお手軽に図からということで、アーキテクチャ図を描いてみました。

Androidのアーキテクチャといえば、大方の人が思い浮かべるのが以下の図でしょう。公式のWebページで公開されているアーキテクチャ図はこんな感じです。あ、まだサイズ調整等はしていないので、いまいち見難いのは勘弁してください。

アプリケーション、アプリケーションフレームワーク、ライブラリ、アンドロイドランタイム、Linuxカーネルの5つの層から成り立っています。ところで、実は2008年のGoogle IOで公開されたアーキテクチャ図には、もう一層あって、なお且つ、ポーティング等下周りに着目する人にはそれこそ重要な層なわけです。その層を足した図が、以下のような感じになります。

その層は、Hardware Abstruction Layer - 通称HAL です。まぁ、そのまま、ハードウェア抽象レイヤですね。Dalvik VMより上の層からハードウェアを利用する場合に、直接カーネルにアクセスするのではなく、ユーザー空間に一層設けて、そこでハードウェアへのアクセスを吸収しています。

私見ですが、このような層が設けられている理由としては

・Linud DriverではGPLになるが、HAL部分はカーネルとリンクしないのでGPLに縛られない
・Linuxへの依存をここで吸収することで、上位の層をLinux Kernelに依存しすぎないようにする

等が考えられるかなと思っています。実際、LinuxのドライバだとGPLなの、いやだなぁ・・・と思うベンダーさんもまだいるのではないかと思います。まぁ、隠者はハード屋ではないので、ドライバのコード読まれる事のリスクがどれほどのものなのかはわかりませんが。
何か、特殊な技術が読み取られかねないというなら、ドライバは、至極一般的な作りにして、本当に守りたいアルゴリズムは、ユーザー空間に置く事も可能なのかもしれません。
まぁ、ユーザー空間だけに、パフォーマンス的な制約が気になるところですけど。

ところで、このHAL、ソースコード上では、libhardware.so等になり、Dalvik VMにロードされます。まぁ、つまり一般的な動的ライブラリです。そして、libcはライブラリの中でも少し特殊な立場にあるわけなのは、プログラマな方ならお分かりの事かと思います。ソースコードを調べると、libcはbionicというディレクトリにまとめられています。他にはローダーであるLinkerや、pthread等、Nativeのライブラリ、アプリケーションを作るときに必要なライブラリ群はBionic の下にまとめられているわけです。

というわけで、どうせなので、アーキテクチャ図もちょっと変えてみました。



うーん、どうでしょう。やっぱりいまいちですかねぇ。まぁ、隠者は、HALの部分に大分興味があったりするので、心の声を反映してHALがかなり大きくなってしまってますし。バランスも悪いですね。なかなかどうして難しいものです。まぁ、プラットフォーム関係者向けの資料としては、これくらいの大きさを占めておいてもよいかもしれません。

実際、Androidのポーティングというと、実は、いくつかの段階を踏む事になります。

(1) Android向けドライバの入ったLinux Kernelをターゲット上で動作するようにする
(2) ターゲットのアーキテクチャ向けにAndroidをビルドする。
(3) init.rc等各種設定ファイルをターゲット向けに書き換える

ちなみに、動作実績があまりない環境だと
(4) Dalvik VMのパフォーマンスチューニング
等も必要になるかもしれませんけど。

で、ここまでで最低限の動作はしますが、これに、
(5) 接続するセンサーやGPS,カメラ等のHALを用意する
 まで行わないと、各種デバイスがAndroidのアプリケーションから動かない状態になってしまいます。
ついでにいうと、HAL層のグラフィック向けの処理を描かないと、すべてがCPUで処理されるためパフォーマンスがグンと落ちるという事になったりもします。
真面目に動くAndroid機器を作るとなると、どうしてもこのHALをきちんと実装する必要がでてくるわけです。


というわけで、次回の日本アンドロイドの会 横浜支部 プラットフォーム部(長いから次回からはPF部って呼ぶかな) では、このアーキテクチャ図をもとに、アーキテクチャと、簡単なディレクトリ構成と、隠者がソースコードを追いかけたり、ポーティングするときに使っている方法やツール等を、簡単にお話しできればいいなぁと思っています。


P.S.
いや、まぁ、ポーティング話で実は一番大変そうなのが
(6) 動作検証
なわけですが、みなさんどうしてるんでしょうねぇ。

2010年8月13日金曜日

初投稿

というわけで、今回ははじめましての隠者でございます。
基本的にぐうたらなプログラマーでして、日記というものが続いた記憶がございません。

恥を書くのもなんなので、ブログはもう二度としないと心に誓っていたのですが、ここ最近、Androidコミュニティにおいても、そろそろ情報を取得する側ではなく、発信する側に回らないとイケない頃合いなんじゃなかろうと思いはじめまして。

そのようなわけで、なんとなくブログに挑戦してみることにしました。
この先いつまで続くかわかりませんが、この、のほほん日記。生暖かい目で見守っていただければ幸いです。