android

2010/03/15

choosecombo?

SmartQ5用に何度もビルドしている私であるが、そのやり方はAndroidのページに書いてあるとおりにやっているだけ。

しかし、よそ様のページを見ていると、やり方が少し違う。
そしてOESFのAndroidも、同じようにやり方が違う。


違うのは、make前に手順があること。

# source build/envsetup.sh
# choosecombo

この2つ。
ちなみに、私のところでは、それらをやらなくてもビルドできている。
それはたぶん、ルートにbuildspec.mkを置いているからだろう。

ちなみに、buildspec.mkはこんなファイルだ。

TARGET_PRODUCT:=smartq5

たぶん、どっかのをまねしたのだろう。


sourceの方は、まあいいだろう。
環境変数などの設定をしているんだろうさ。

気になるのは、choosecombo。
字面だけ見ると、コンボボックスから選択するような感じがする。
が、実際はコマンドラインのツールで、カーネルのmake configみたいに数字を選んでいく(4つくらいだけど)。
省略して、

# choosecombo 1 1 omap3beagle 3

みたいな書き方もできる。

さて、choosecombo。
whichで見てみても、そんなコマンドはない。
envsetup.shをやらないと、使えない。
ということは、envsetup.shの中にあるはず。

function choosecombo()
{
choosesim $1

echo
echo
choosetype $2

echo
echo
chooseproduct $3

echo
echo
choosevariant $4

echo
set_stuff_for_environment
printconfig
}

こんなのだ。
SIM(デバイスかシミュレータか)と、タイプ(debugかreleaseか)と、プロダクト(TARGET_PRODUCT)と、eng, eng-user, userとかなんとかを選択する。

これって、PDKのファイルにはあったなぁ。

続きを読む "choosecombo?" »

2010/03/13

[Q5]OESF版実行(cupcake)

昨日ビルドしたOESF版のAndroidを、SmartQ5で動かしてみた。

kernelは、Covia版eclairのものを使った。

あっさり動いた。。。


起動のアニメーション画面がOESF版になっているので、ちょっと派手だ。

まあ、OESF版に特有なアプリは何も動かしていないのだがね。
WiFiが使えないし。
Bluetoothは動くかなー、と思ったが、

E/bluetooth_common.cpp( 1877): dbus_func_args_timeout_valist: D-Bus error in GetMode: org.freedesktop.DBus.Error.ServiceUnknown (The name org.bluez was not provided by any .service files)

E/BluetoothDeviceService.cpp( 1877): startDiscoveryNative: D-Bus error: org.freedesktop.DBus.Error.ServiceUnknown (The name org.bluez was not provided by any .service files)

これは、init.rcがeclair版を使っているためかも。

ドライバを動くようにしないと、あまり遊べないのかねぇ。

[Q5]OESF版ビルド(cupcake)

昨日はビルド中に時間切れ(私が)になったので、今日続きを行った。

Eclair版でビルドできているvendor/coviaをそのままコピーし、system/core/rootfsを少しいじってgoldfish関係をコメントアウトしたくらい。
goldfish関係のソースファイルはコピーしないようにできるのかいな?

ルートにbuildspec.mkをおいて、いざビルド!

うん、何もなく終わりました。
あとは動かしてみるだけ、なのだが・・・

1. 眠たい。非常に。
2. kernelはどれを使うといい?

というわけで、もうおしまい。
今週は疲れたわい。

2010/03/11

OESFの組込みAndroid

OESFが、組込み向けAndroidを公開した。

この件を書くとき、少し迷った。
つまらんことだが「OESF」に、さん付けするかどうかだ。

Googleは、Google、だ。
Microsoftは、Microsoft、だ。
Coviaは、Coviaさん、と呼んでいる。
私の中で、この切り分けはどうなっているのだろう?

よくわからないけど、ここはOESFと書くことにした。


今日は時間も遅いし、ダウンロードだけだ。

と思っていたが・・・そのダウンロードすら順調にいかない。
vmware上のubuntuでダウンロードしていたのだが、ディスクに空きがなくなってしまった。
2時間くらいかけてダウンロードしたのに、またやり直し?

と思ったが、git cloneしたものは、git pullで取ってこれるらしい。

・・・
ダウンロード中に空きがなくなったせいか、中途半端になっているみたい。
しかし、よくよく見てみると、ダウンロードまでは終わっているようだ。
その後、展開する途中で空きがなくなったように見える。

こんな方法でよさそうだ。

$ git reset --hard HEAD

どうやら、ダウンロードしたものは.gitディレクトリに置かれるようだ。
それを展開しているようである。
HEADは最新の状態という意味なので「最新版にresetしなさい」というところかな。
--hardと--softがあったと思うけど、よくわからん。

$ git reset --soft HEAD^

これは、直前のコミットを取り消してくれるらしい。

--hardも似たようなものだが、変更内容も含めて元に戻すのかな。
やってみたいところだが、眠たいのでやめておこう。

続きを読む "OESFの組込みAndroid" »

2010/03/10

gitに慣れたい・・・

Covia版のeclair用に提供されるkernelを使えるようになった。
特に何かしているわけではないが、まあよかろう。

さて、次は何をするか。


まず、gitをなんとかせんといかん。

というのも、自分でソースファイルを書き換えたとしても、repo syncすると消えてしまうのだ。
マージしてくれるのではなく、上書きになっている。

repo syncは、新規ならば、git cloneで取得する。
つまり新規取得になるわけだ。

1回でも同期をとったことがあれば、git remote updateとgit rebase origin/branch、に変わる。

他にも細々したことが書いてあるが、眠たさが限界だ。
ここを逃すと眠れなくなりそうなので、またね。

2010/03/08

[Q5]media serverが再起動

昨日、kernelをCovia版eclairに置き換えたので、ついでに周辺のファイルも見直していた。
init.rcなどの設定ファイル。

そうしたら、起動しなくなってしまった・・・。


adbはつながらないものの、USBシリアル変換は使えたので、それでコンソールからlogcatで追っていく。

そうすると、media serverなるものが再起動を繰り返していた。
何も考えず、init.rcのmedia_server関係をコメントアウト。

それで進むようになったものの・・・終盤の方でServiceManagerがずっと待っているのだ。

Waiting for sevice media.audio_policy...

ソースを見ると、返ってくるまで無限ループ。
なんとかしないといかんらしい。


昔の作業記録を見ると、/dev/sndをinitで使えるようにしている。

{ "/dev/snd/", 0660, AID_SYSTEM, AID_AUDIO, 1 },

なんでそうしようと思ったのか、書いてない。
ついでに、init.rcに次のような記述を追加した。

chmod 0777 /dev/snd
chmod 0777 /dev/snd/pcmC0D0c
chmod 0777 /dev/snd/pcmC0D0p
chmod 0777 /dev/snd/controlC0
chmod 0777 /dev/snd/timer
chmod 0777 /dev/snd/dsp
chmod 0777 /dev/snd/mixer
chmod 0777 /dev/snd/audio

chown root audio /dev/snd
chown root audio /dev/snd/controlC
chown root audio /dev/snd/pcmC0D0c
chown root audio /dev/snd/pcmC0D0p
chown root audio /dev/snd/timer
chown root audio /dev/snd/mixer
chown root audio /dev/snd/dsp
chown root audio /dev/snd/audio

どっちが効いたのかわからないけど、よくなった。
ALSAは使えないのだけど、そもそもそれがよくないのか?

E/ALSALib ( 630): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidOut
W/AudioHardwareALSA( 630): Unable to attach mixer to device AndroidOut: No such file or directory
E/ALSALib ( 630): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidIn
W/AudioHardwareALSA( 630): Unable to attach mixer to device AndroidIn: No such file or directory

音楽に興味はないけど、やはり「ぽちっ」くらいの音は出てほしいものだ。
まあ、おいおいやろう。

2010/03/07

[Q5]タッチパネルが効かん

Covia版の新しいkernelを使うと、タッチパネルが効かなくなる件を調査しよう。

前回は、frameworks\base\libs\ui\EventHub.cppに関係しているところまでわかったのだった。
/dev/input/event2を見ると、データが取得できたところまで確認したのだ。


まずはlogcat。
/dev/inputの出てくるところを抜き出そう。

I/EventHub( 1855): New keyboard: publicID=65536 device->id=0x10000 devname=' USB Keyboard' propName='hw.keyboards.65536.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/EventHub( 1855): New device: path=
/dev/input/event4 name= USB Keyboard id=0x10000 (of 0x1) index=1 fd=48 classes=0x1
I/EventHub( 1855): New keyboard: publicID=65537 device->id=0x10001 devname=' USB Keyboard' propName='hw.keyboards.65537.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/EventHub( 1855): New device: path=
/dev/input/event3 name= USB Keyboard id=0x10001 (of 0x2) index=2 fd=49 classes=0x3
I/EventHub( 1855): New keyboard: publicID=65538 device->id=0x10002 devname='S3C
TouchScreen' propName='hw.keyboards.65538.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/EventHub( 1855): New device: path=
/dev/input/event2 name=S3C TouchScreen id=0x10002 (of 0x3) index=3 fd=50 classes=0x2f
E/EventHub( 1855): could not get driver version for
/dev/input/mouse0, Not a typewriter
I/EventHub( 1855): New keyboard: publicID=65539 device->id=0x10003 devname='gpio-keys' propName='hw.keyboards.65539.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/EventHub( 1855): New device: path=
/dev/input/event1 name=gpio-keys id=0x10003 (of 0x4) index=4 fd=52 classes=0x1
I/EventHub( 1855): New keyboard: publicID=65540 device->id=0x10004 devname='gpio-keys' propName='hw.keyboards.65540.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/EventHub( 1855): New device: path=
/dev/input/event0 name=gpio-keys id=0x10004 (of 0x5) index=5 fd=53 classes=0x1
E/EventHub( 1855): could not get driver version for
/dev/input/mice, Not a typewriter

event2はタッチスクリーンであることはわかっていると思う。
なのに・・・なぜ・・・

おっと、続きのログも大切そうだ。

I/KeyInputQueue( 1855): Device added: id=0x10004, name=gpio-keys, classes=1
I/KeyInputQueue( 1855): Device added: id=0x10003, name=gpio-keys, classes=1
I/KeyInputQueue( 1855): Device added: id=0x10002, name=S3C TouchScreen, classes=2f
I/KeyInputQueue( 1855): X: min=0 max=800 flat=0 fuzz=0
I/KeyInputQueue( 1855): Y: min=0 max=480 flat=0 fuzz=0
I/KeyInputQueue( 1855): Pressure: min=0 max=1 flat=0 fuzz=0
I/KeyInputQueue( 1855): Size: unknown values
I/KeyInputQueue( 1855): No virtual keys found
I/KeyInputQueue( 1855): Device added: id=0x10001, name= USB Keyboard, classes=3
I/KeyInputQueue( 1855): Device added: id=0x0, name= USB Keyboard, classes=1

あれ、ちゃんとaddしているから、追加されてるんじゃないの?
エラーが出ていると、わかりやすいのになぁ・・・。
ちなみに、こちらはCovia版2010/03/01版のAndroidを動かしたときのlogcat。

I/EventHub( 1909): New keyboard: publicID=65536 device->id=0x10000 devname='S3C TouchScreen' propName='hw.keyboards.65536.devname' keylayout='/system/usr/keylayout/qwerty.kl'
I/EventHub( 1909): New device: path=/dev/input/event2 name=S3C TouchScreen id=0x10000 (of 0x1) index=1 fd=70 classes=0x2f
E/EventHub( 1909): could not get driver version for /dev/input/mouse0, Not a typewriter
I/EventHub( 1909): New keyboard: publicID=0 device->id=0x10001 devname='gpio-keys' propName='hw.keyboards.0.devname' keylayout='/system/usr/keylayout/gpio-keys.kl'
I/EventHub( 1909): New device: path=/dev/input/event1 name=gpio-keys id=0x10001 (of 0x2) index=2 fd=72 classes=0x1
I/EventHub( 1909): New keyboard: publicID=65538 device->id=0x10002 devname='gpio-keys' propName='hw.keyboards.65538.devname' keylayout='/system/usr/keylayout/gpio-keys.kl'
I/EventHub( 1909): New device: path=/dev/input/event0 name=gpio-keys id=0x10002 (of 0x3) index=3 fd=73 classes=0x1
E/EventHub( 1909): could not get driver version for /dev/input/mice, Not a typewriter
I/KeyInputQueue( 1909): Device added: id=0x10002, name=gpio-keys, classes=1
I/KeyInputQueue( 1909): Device added: id=0x0, name=gpio-keys, classes=1
I/KeyInputQueue( 1909): Device added: id=0x10000, name=S3C TouchScreen, classes=2f
I/KeyInputQueue( 1909): X: min=0 max=800 flat=0 fuzz=0
I/KeyInputQueue( 1909): Y: min=0 max=480 flat=0 fuzz=0
I/KeyInputQueue( 1909): Pressure: min=0 max=1 flat=0 fuzz=0
I/KeyInputQueue( 1909): Size: unknown values
I/KeyInputQueue( 1909): No virtual keys found

違いがわからん。
GPIOキーのレイアウトファイルが、私のはgpio-keys.kl(1.5版にあったもの)を使っているところをCovia版はqwerty.klを使っている、というくらいだ。
そこは関係ないだろう。
デバイス番号なんかは違うけど、これは順番だけだよな・・・。
うーむ、ログでわからないのは痛いな。


「Device added」と出しているのは、frameworks\base\services\java\com\android\server\KeyInputQueue.java。

XとかYとかは、タッチスクリーンの場合にしか出てこない。
つまり、彼(あるいは彼女)はevent2がタッチスクリーンであることはわかっているのだ。

ちなみに、CLASS_TOUCHSCREEN_MTとCLASS_TOUCHSCREENの場合のみ。
MTはマルチタッチか?


frameworks\base\services\java\com\android\server\KeyInputQueue.javaで無効になっているログを有効にして、InputDeviceReaderスレッドで受け取っているデータを見てみた。

I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=0 keycode=0 value=-110
I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=1 keycode=1 value=714
I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=3 keycode=3 value=5101
I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=4 keycode=4 value=7927

devは、Device add時の数値。今は0x10002がタッチパネル。
typeは、frameworks\base\core\java\android\view\RawInputEvent.javaのEV_***の数値。
0x03はEV_ABSで、Absolute axes scan codesらしい。
つまり、絶対座標値ということか。
scancodeは、EV_ABSの場合、0:X、1:Y。3と4はRXとRYってなってるが、何かわからん。

とにかく、Xがマイナスになっているのだから、正しく動くはずがない。
校正ができていないということだ!

というわけで、Covia版で校正した設定ファイルを持ってきて、/proc/cailbrateにcatで流し込むと正しくなった。

# cat /system/etc/calibrate > /proc/calibrate

I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=0 keycode=0 value=199
I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=1 keycode=1 value=201
I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=3 keycode=3 value=5590
I/KeyInputQueue( 1857): Input event: dev=0x10002 type=0x3 scancode=4 keycode=4 value=8555

これはわからんわなぁ。
インストール直後は、キャリブレーションアプリを自動的に起動するようにした方がいいんではなかろうか。

2010/03/04

タッチパネルがきかん

CoviaさんからAndroid Eclair版が出ていたので、私のビルド版もカーネルだけ置き換えてみた。
ときどき出てくる「vanilla kernel」という表現が気になっていたのだが、これはAndroid向けの標準Linux kernelのことらしい。
なんというか、Android のsourceサイトから落としてきたもの、ということか。
よく知らないけど、手が入っているようだ。


そしてそのカーネルだけ置き換えてみたところ、挙動が変わった。
大きいところでは、

  • グラフィックが濃くなった。コントラストが高いというか…
  • タッチパネルが効かない

グラフィックのは、前回にも推測を書いた。
が、掲示板情報だと、1.5で一度起動させてホットスタートさせるとちゃんと出るようだ。
確かに、出た。
ということは、ドライバの初期化が足りないとかそんなことか。

困るのは、タッチパネル。
これが使えないと、かなりの操作ができない。
USBキーボードは使えるようなのだけど、設定ファイルを置いていなかったせいかあまり使えていない。

そしてようやく気付いたのだが、そもそもタッチパネルの操作はどういう経由で行っているのか、全然把握していない。
もちろん、Covia版Androidではタッチパネルが使えるので、ミドル層以上で対処せねばならない項目なのだろう。
USBキーボードも含め、調べておきたいところだ。


ひとまず、私が作ろうとしていた意味のないアプリはリリースできたので、Homeアプリ作成前にまた調査を行うことにしよう。

続きを読む "タッチパネルがきかん" »

2010/03/02

Covia版Eclair (2010/03/01版)

Coviaさんから、SmartQ5のEclairがリリースされた。
まあ、まだ正式ではないと思う。

前回も思ったのだが、やはり私の移植版よりもよく動く。
やはり、というところが悔しい。
私の技術が足りないということか。。。
精進せねば。


Eclairの試作版からだが、画面が暗くなった。
LCDがどうのこうのではなく、LUTというか変換というか、そのあたり。
薄めの文字とか消えかかっているしね。

Androidは、標準のままだと色の深さが16bitと聞いた。
この16bitの解釈がドライバとあってないのではなかろうか。
自ビルド版(copybit未使用)にkernelだけ差し替えてみたのだが、同じようになったようだ。
ということは、ドライバが変更になったことでこうなったということか。

ミドル側で対応することもできそうな気がするが、起動時のandroidアニメーションもそうなっているから、ドライバを修正した方がいいよなぁ。
フレームバッファへ書き込んだ内容が描画されるとことなると、単なるLinuxアプリでフレームバッファ操作するのがめんどうになる。
adbでスクリーンショットをとっても、描画されている内容と異なるだろうし。


しかし、これはどうなったために起こったのだろう?
16bitということは、RGB=565か、555のどちらかだろう。

以前のドライバが565で、今回から555になったという場合。
Greenの最上位ビットが無効になる。

以前のドライバが555で、今回から565になったという場合。
Greenの最上位ビットが使えるようになる。
そうなると、RかBの最下位ビットを使うことになるのか?
それはあからさまにおかしくなるような気がする。

ということで、たぶん今回のドライバが555になったのだろう。
推測だけして、後で楽しもう。

2010/02/28

Interface誌2010年4月号

Android特集だった。
配達ミスにより遅れてしまい、あせってしまった(CQ出版の方、ありがとうございます)。


他の雑誌と一線を画するのは、Androidアプリについて書かれていないこと。
一番アプリに近いのが、NDK。
あとは、このボードで動かすには、というような記事だ。
しばらく前に組込みLinuxの特集があったのだが、そんなイメージだ。
Android OSに深く突っ込むよりも、まずは動かせる環境について展開しているような感触を受けた。

ネットに出てる情報と差別化するのは、難しいのだろうなぁ。
私も記事が書けるほどの情報があればいいのに。

ブレゼンハムはいらん

  • 組込み
  • 直線

というだけで、無条件にブレゼンハムを使わねば!と思い込んでいた。

が、よく考えてみると、全然高速で計算する必要がない。
そうならば、実装が軽くなるように作る方がいいよな。

何というか、金槌を持ったら全部釘に見える、という言葉があるが、まさにそんな状況であった。
あぶないあぶない。

2010/02/27

まだgitに慣れん

Androidの本体は、repoとかgitとかで最新版ソースファイルを取ってくることができる。
非常にありがたい。

そのありがたさを十分に享受するには、取ってくるためのツールを使いこなさねば。
SVNはTortoiseSVNがあったからお手軽だったのだが、gitやrepoはコマンド入力のみだ(今のところ)。
まだまだ慣れていません。


バージョン管理ツールで慣れが必要なのは、

  • コミット
  • マージ

だと思う。

コミットは、分散型なので、ローカルにしか影響しないコミットが可能。
pushしない限り、本物のリポジトリには影響を与えないので、自分で修正した箇所はcommitだけさせておくとよいのだ。

マージで問題になるのは、コンフリクト。
自分の修正が本物のリポジトリによる修正とぶつかった場合。
SVNだと「コンフリクトしました」といわれて、「>>>」「===」「<<<」みたいなコメントが入ったソースファイルができあがる。
gitは?

ここを読むと、似たようなものみたいだ。
git-statusするとわかるようなので、pullして確認すればよいのかな。


eclairをrepo syncして新しくしたのだが、BT関係のところがビルドできない。

DEVICE_OUT_FM_HEADPHONEやらTTYやらが、ALSAの方には入っているのだけれども、eclairのframeworksに入っていないのだ。
確か、frameworks/base/include/media/AudioSystem.hだったと思う。
そのファイルだけ最新版に置き換えるとよかったような。

repo syncしてそれが消えてしまったのかいな。
今回は、BT側のソースを変更してビルドさせることにした。
commitしておけば、警告してくれると思うのだがなぁ。

2010/02/26

AbsoluteLayoutしかない

いや、他に方法はあるのかもしれんが・・・。

私がやりたいのは、AnimationDrawableと自前のViewの併用。
ただそれだけ。
まあ、自前のViewで好きな座標にAnimationDrawableで描画させたい、というようなことを考えている。
それが全然解決できない。

最初は自前のViewを全面に貼り、そこにちんまりAnimationDrawableさせようとしていた。
が、ViewをFILL_PARENTにしておくと、キャラクターが全面に広がって表示されてしまうのだ。
描画のタイミングを遅らせたり、一時的に非表示にしてみるなどしたけど、表示させたときには大キャラクターが表示されていた(あ、キャラクターはPNGで作った画像ね)。
これを仕様としてアプリを作ろうかとも思ったけど、さすがにそれは技術者的に嫌だった。

昨日は、Marginを設定することでWRAP_CONTENTのまま描画位置を変更することができた。
では、この方向で・・・と思ったけど、Marginを動的に変更することができていない。
やり方が悪いのかもしれんが、もうわからん!


というわけで、今まで避けてきたAbsoluteLayoutに手を染めてみた。
非推奨だったから、わざわざ覚えなくとも・・・と思っていたのだ。

使ってみると、よかった。
何で最初に試さなかったの?というくらいに。
あっさり目的が達成できた。
私の1週間を返して・・・。

非推奨とはいえ、わかって使う分には問題がないと思う。
私だって、最初の方法がうまく行けばそっちの方がよかったのだしね。
AnimationDrawableは使い勝手が難しいわぁ。

2010/02/24

アプリは難しい

比較的、ドライバやらミドルやらをやることが多いためか、アプリは難しく思う。
使うAPIが多いし、想定せんといかん人も多い。
ドライバだと、ハードと上位層とOSくらい気にしておけばいいんだけどなぁ。
まあ、彼らがわがままでないというわけではないのだがね。

今アプリで困っていることも、アプリ慣れしている人だったらあっさりわかるのかも。
経験がものを言う気がする。
毛嫌いせずに、アプリもやっていかんといかんですな。

ええ、まだアニメーションがうまくいってませんよ。
AnimationDrawableをstartさせると、onDrawがその周期で自動的に呼ばれていた。
onDrawをオーバーライドして中身を空っぽにしたにもかかわらず、アニメーションするのだ。
そしてキャラクターを別の位置に移動させても、1つ前のキャラは消えてなかった。
ここはダブルバッファがきいていると言うことか。

推測をしておき、どういうことになっているかを考えるのもまた楽しいものだ。
解決するのが一番楽しいのだがね。

2010/02/22

Themeでフルスクリーンにする

themeと書いてテーマと読む。
いつも心の中では「てーめ」と発音しているのだが・・・。


今作っているアプリは、フルスクリーンにしたい。
タイトルバーもなく、ステータスバーもなく。
すべてを我が手に置きたいのだ。

ネットで調べると、だいたいこんな手順だった。

  1. getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  2. requestWindowFeature(Window.FEATURE_NO_TITLE);
  3. 上記をActivityのsetContentView()より前に置く

手順という感じではないな・・・。まあいい。

しかし、別のことを調べているとき、Themeというものがあることを知った。
よく使うスタイルを標準とする、みたいなものかしら。
スキン、というほどではないが、「こんなテーマで描画してね」というくらいのものだろう。

そのテーマの中に「NoTitleBar」とか「NoTitleBar.Fullscreen」などがあることを知った。
どうやら、それでもいいらしい。
ActivityのonCreate()で指定してみるとうまくいかなかったが、AndroidManifest.xmlに直接書くとうまくいった。

なんだ、これでいいやん。

続きを読む "Themeでフルスクリーンにする" »

2010/02/21

AnimationDrawableがうまくいかん

まだアニメーションをやってうまくいってない。
いかんなぁ。


私がやりたいのは、そんなに難しいことではない。

・キャラクターがアニメーションする(パタパタアニメ)
・キャラクターが移動する

これだけ。

前回は、パタパタの部分をAnimationDrawableで、移動をTranslateAnimationで実現しようとしたのだった。
が、失敗した(but, in vain)。

ならば、めんどくさいパタパタはAnimationDrawableをそのまま使い、移動は自分でやろうというのが前回までのあらすじ。


移動させるには、自分で描画しなくてはならない。
というわけで、Viewを継承したクラスを作り、それをonCreate()で生成してsetContentView()させることにした。
そうすれば、ViewはonDraw()を使って好き放題できる。

持っている本ではShapeDrawableの例があった。
自作のViewクラスのコンストラクタでShapeDrawableをnewし、なんやかや設定。
onDraw()でdrawable.draw(canvas)で描画させている。
位置は、setBounds()で設定している。
うん、簡単簡単。

・・・確かに指定した位置に描画はしてくれるのだが、パタパタしてくれない。
start()の位置やタイミングが悪いのかとあれこれ試してみたが、だめだ。

現在は、コンストラクタでもう1つViewを作り、それをアニメーションさせようとしている。
そのViewにsetBackgroundResource()してアニメーションリストを設定後、getBackground()でAnimationDrawableを取得している。
サンプルではコンストラクタでShapeDrawableをnewしているが、そこが違うのかなぁ。
でも、意味としては変わらないと思う。

ちなみに、コンストラクタで作るViewではなく、thisに対して操作するとアニメーションしてくれる。
なんかルールがあるんかねぇ。

アニメーションでゴミが残る

実家に帰るつもりだったけど、思った以上に体が疲れていたのでやめた。

歳ですな。


Androidのアニメーションを試しているが、Translationなどで動かしたときにゴミが残ってしまうのだ。

  

わかりにくいかもしれないが、左図は画面左上が黒と白で点滅しているのだ。
(まあ、ここに載せているのは静止画だが・・・)
TranslateAnimationで移動させると同時に、AnimationDrawableで動かしてもいる。
そのせいで、最初の表示位置がブリンクしているのか?

右図は移動中の様子だが、ゴミを残しながら移動しているのだ。
移動のアニメーションが終わると再描画が走るようで、ちゃんとなる。
なるけど、やはり移動中も見えてほしくないですな。。。

現在対処中なので、何かわかったら書こう。


AnimationDrawableを止めてTranslateAnimationだけでもゴミが残った。
ブリンクの方はなさそうである。

TranslateとDrawableの開始順序を入れ替えてみたけど、関係なし。


解決その1

右図の現象、足跡が残る件がなんとかなった。
PNG画像の端っこまで画像を描いていたので、1pixだけ削ってみたのだ。
そうすると、残らなくなった。

けどさ・・・なんか納得はできない。
Tipsってやつなのか?
invalidateの領域判定が1pix小さいってことなのだろうか。

Javaの座標って、確かピクセルとピクセルの間を数える、みたいなのを大昔勉強したときに読んだような気がする。AWTの勉強だったか。
探したけど、見つからん・・・。
(sx, sy)-(ex, ey)で直線を引くと、終点は(ex-1, ey-1)までしか描画されない、とかそんな内容だったような。

試しに、1pixの真四角をアニメーションで移動させてみた。
予想通り、右側と下側の線が消え残っている。

というわけで、アニメーションさせる場合は、画像の右端と下側は1pix残しておくようにするのが無難、としておこう。


残件

TranslateAnimationとAnimationDrawableの組み合わせ問題が残っている。
書いていなかったが、実はTranslateAnimationで移動中、黒い塗りつぶしが広がっているのだ。
これはおそらく、

・TranslateAnimationは移動している領域のinvalidate領域を設定
・AnimationDrawableは移動していない領域(すなわち左上の原点付近)のinvalidate領域を設定
・領域がORされて、黒い塗りつぶしが広がっている
・AnimationDrawableは描画位置を左上と認識しているがTranslateAnimationによって移動されていて実際には描画するものがないため、黒いブリンクになっている。

ということではなかろうか。

そうなると、AnimationDrawableはTranslateAnimationと組み合わせられないことになってしまう。
なぜなら、TranslateAnimationは自動的に(勝手に)フレームワークがアニメーションさせることになっているからだ。
残念だなぁ。

android.view.animationの系列は、視覚効果的なものに使い、キャラクターを動かしたいというような目的では使わない方がよさそうですな。
手抜きができればよい、というところだったので、納得して使うのをやめよう。

続きを読む "アニメーションでゴミが残る" »

2010/02/20

[Q5]SDカード起動版Android(再)

さて、Covia版Kernelを使って、SDカードからAndroidを起動させる方法をまとめてみよう。
長きにわたったため、情報が分散してしまったのだ。

Coviaさんの努力結果だけもらうようで気が引けていたのだけど、内蔵のiNANDが使いすぎで壊れてしまうというのも、哀しい。
長く使うため!ということで、少し省略したような形で載せておこう。

Coviaさんに感謝の意を示しつつ、以下を読み進めていただきたい。

【追記 2010/02/20】
最新版のファームウェアで動かなかった場合は、古いものを使ってみるといいかもしれない。
私は2009/11/30版での動作を確認している。


まず、いるもの。

  • SmartQ5ファームウェア
  • Linux環境(Ubuntuとか、VMwareとか)
  • u-bootのmkimage (apt-getする)
  • SDカード(私は16GBのを使っているが、2GBはほしいか)

こんなものか。
私は、WindowsXP+VMware(Ubuntu8.10)でやっている。
Ubuntuじゃないのがよかったけど、Androidの環境構築でそう書いてあったので、もうめんどくさかった。

※追記(2009/12/23 0:32)

mkimageは、ubuntuの場合はapt-getでできるようだ。

# sudo apt-get install uboot-mkimage


抜き取り

まず、SmartQ5ファームウェアからいろいろと取り出す。

記事 : [Q5]upgrade.sh

記事 : [Q5]SDカードからもブート

SmartQ5Extractorというツールを使うと、SmartQ5ファイルからいろいろと取り出せる。
いるのは、

  • rootfs.tar.gz
  • homefs.tar.gz
  • initramfs.igz

の3つ。

SmartQ5ファイルの構造

息抜き。
SmartQ5ファームウェアファイルには、いろいろ詰まっている。
解析するのは面倒なので、回答ツールを探してきた方が早い。中国語のツールだけど、使う分には何となくわかる。

でも、バイナリ好きならば自分で何とかしたいところ。
私は人が調べた情報を使う。

smartq-initramfs

ここが見つかったのが昨日なのだが、それまでは困り果てていたのだ。
ダウンロードしてfw-utils/firmware-headers.hを見ると、ヘッダ部の情報がわかる。

qi:56
u_boot:76
zimage:96
initramfs:116
rootfs:136
homefs:156

これがあれば、だいたい自動化できそうな気がする。

initramfsの解凍

記事 : [Q5]覚え書き

最初の2つはまあいいとして、initramfs.igz。
これは、initramfs形式をu-boot形式にしたもの。
initramfs形式は、CPIO+tgzだ。
u-boot形式は、ヘッダが64byteついたもの。

解凍スクリプト

#!/bin/sh
dd if=initramfs.igz bs=64 skip=1 > initramfs.img.gz
gzip -d initramfs.img.gz
mkdir initramfs
pushd initramfs
cpio -idm < ../initramfs.img
popd
rm initramfs.img

cvkk-firmware-8M

解凍したinitramfsの中から、ファイルを取り出す。

usr\cvkk\upgrade\firmware\cvkk-firmware-8M

SmartQ5Extractorにかけると、kernelを取り出せる。
SmartQ5をExtractorしてとれるkernelは、インストーラ用のkernelだろう。

ファイル名はzimage。以下ではzimage-cvkkとして使っている。

init、init.rc、init.smdk6410.rc

記事 : rootfsに関するある結論

これらのファイルは、動いているAndroidからSDカードにコピーするのが手っ取り早い。
cvkk-firmware-8Mを解凍したinitramfs.igzにはなさそうだ。
rootfs.tar.gzあたりに秘密がありそうだが、うまく解凍できない。

ここまで

ここまでで、SmartQ5ファイルなどから必要となるファイルは一式取り出した。


initramfs.igzの作成

ここからは、ほぼLinuxで作業する。
cygwinでもできそうだけど、不安なのでやめた。

initramfs.cpio.gzの作成

どこかにディレクトリを掘る。
そこに、init、init.rc、init.smdk6410.rcを放り込む。

ここの真ん中辺りにあるスクリプトを取り出し、実行できるようにする。
第1引数にさっき掘ったディレクトリを、第2引数に生成したいファイル名をつけて実行。

これで、initramfs.cpio.gzは完成。

initramfs.igzの作成

最初に言っておくが、igzという拡張子はSmartQ5Extractorがつけていたからそう呼んでいるだけで、正式ではないと思う。

さっき作ったinitramfs.cpio.gzにu-bootのヘッダを付ける作業をここでやる。
それには、u-bootのmkimageというコマンドを使う。

記事 : [Q5]やってしまった・・・

こんな使い方になる。

$ mkimage -A arm -O linux -T ramdisk -C gzip -n 'initramfs' -d initramfs.cpio.gz initramfs.igz

実際には、私はinitrd.igzというファイル名にした。ロングファイルネームは不安でね。


組み込む

menu.lst

title Covia
kernel /boot/zimage-cvkk
initrd /boot/initrd.igz
param nosplash
logo /boot/android.bmp4

zimage-cvkkは、cvkk-firmware-8Mから取り出したzImage。
こちらを使わないと、Coviaさんが対応してくれたドライバ類が入っていないだろう。
改行コードがLFのみとなるように気をつけよう。

SDカード

boot用にvfatを先頭に、swapに1つ、/systemに1つ、/dataに1つ。
4つパーティションが必要になる。
つまりまあ、これ以上は入らない。拡張パーティションはよく知らん。

パーティションは適当に。
オリジナル似合わせて、swapは128Mでよいのかな?
/systemは基本的に広がらないので、ぎりぎりのサイズでもよいか。
アプリは/dataに入るから、ここを大きく取るのがいいのでは。

編集

init.rcを書き換える。
mount先を変更。

mount ext3 /dev/block/mmcblk1p3 /system
mount ext3 /dev/block/mmcblk1p3 /system ro remount

mount ext3 /dev/block/mmcblk1p4 /data nosuid nodev


/system/etc/init.smdk6410.shでswapの設定をしているから、これも忘れないように。

mkswap /dev/block/mmcblk1p2
swapon /dev/block/mmcblk1p2


あとは、起動するだけである。

みんなできたかな?

[fyi]機能削減可能

機能の追加・削除(主に削除か?)するしくみを、OEFSがやってるらしい。

http://itpro.nikkeibp.co.jp/article/NEWS/20100219/344811/

こういうのがほしかったのだよ。
私もやろうとはしているものの、アプリレベルでしかできてない。
rilとか使わないけど、入れてるからなぁ。

リンク先に画面があったけど、WindowsCEのPlatform Builderみたいな画面だな。
こんなのがあると、どのファイルとどの機能が関係あるのか、などというのがわかるので、勉強中のみとしてはありがたい。
ああ、ありがたやありがたや。

続きを読む "[fyi]機能削減可能" »

2010/02/19

Javaには詳しくない私の疑問

1つ前の記事で、XMLファイルのonClick属性にメソッド名を書いておくと、ボタンを押したときに呼ばれる、ということを書いた。

さて、あれはどうやって実現されているのだろう?
Javaはコンパイルするとclassファイルになり、そこにバイトコードが書かれているイメージだ。
ただ、ここはAndroid。正確にはJavaではない。
最後にできるのも、dexだし。

だけど、私はJavaに詳しくない。
あなたに話すネタもない。。。

だが、確かJavaは関数名やファイル名をそのままclassファイルに格納していたと思う。
そのしくみがあるから、JUnitなんかも使い勝手よくできるとかなんとか。
携帯向けのJavaアプリでは、関数名などを短くすることでサイズを削減させるとか。
XMLファイルをうまくコンパイルしてやれば、同じことができそうな気がする。
つまり、onClick属性をclassファイルに落とし込む、というような。

しかし・・・私にとって、文字列で関数を扱うというのは気が重たい。
別に私が取り扱うわけではないのだが、「文字列を」「全文一致で検索して」「関数を呼ぶ」というステップになるのが重たいのだ。
だって、普通にアドレス呼び出しであれば、一発やん。
もし仮想関数だったとしても、2ステップ。
しかし文字列比較となると、文字数分を1文字1文字比較しなくてはならん。
頻繁に呼び出すような関数であれば、確実にボトルネックだよなぁ。

まあ、ここはボタン操作みたいなUIだからいいや、という判断なのかも。
それに、コンパイル時にハッシュ値とかに変換してるかもしれんし。
いや、変換してくれているに違いない。

そんなどうでもいいことを考える金曜日の夜であった。

Android1.6ではonClickListenerがこう書ける

備忘録だ。

以前に読むだけ読んで、記憶にはあったけど何のことか忘れていた変更点。


Android1.6からは、XMLのレイアウトファイルに

<Button android:onClick="myClickHandler" />

などと書いておくと、ソース上で

class MyActivity extends Activity {
public void myClickHandler(View target) {
// やること
}
}

書くことができる

GUIのエディタはここまで吐きだしてくれるかしら?

最近やってること

すごく眠い。
寒いし。
のんびり本を読みながら酒でも飲みたいわ。

というのが、最近やっていることではない。
まあ、やってることには違いないが。


SmartQ5を触るのは、しばらくやめている。
BeagleBoardもそのままだ。

やっているのは、アプリ側。
あまりに基礎的なことも知らないので、妨げになりつつある。
Activityはわかるけど、インテントはあやふやだし。
今まで作ってみたアプリも、画面遷移しないのでインテントがない。
すべてを理解することはできないだろうが、一通りの基本は触りたいものだ。

が、そんなに一通り触っていたら一生が終わってしまう。
並行して、アプリを実現している実装の確認もしていく。
取りかかったのは、ステータスバーの実現方法。
PNGファイルは見つかったので、そこから手を伸ばしていこう。

そう、私がやりたいのはUIに手を加えることなのだ。

2010/02/13

アニメーション中の座標はたぶん取得できない

前回の続きだ。

あれこれ調べているものの、情報がない。
それに、APIもそれっぽいのがない。
clearAnimation()させても変なところで終わるし。

で、ようやくそれっぽい記述を見つけた。
Android Developpersの、Viewクラスに関するReference
Animationの項に説明がある。

When an animation is started, the framework will take care of redrawing the appropriate views until the animation completes.

アニメーションが開始したら、フレームワークは完了するまで再描画し続ける、といったところか。再描画の面倒を見る、とか。
フレームワークが面倒を見るのだから、アプリではたぶん手が出せないよなぁ。
そういう解釈をした。

まあ、気が向いたらソースファイルを眺めてみよう。
「気が向いたら」と書くときは、あまり気が向かないことが多いのだが・・・。

2010/02/10

アニメーション中の座標を取得したい

またしてもアプリ関係だ。
どうしたんだ、私・・・。

まあ、解決していないので問題提起だけだ。


タッチパネルをタッチさせると、タッチした座標に画像を表示させようとした。
ただ表示させても寂しいので、アニメーションでじりじりと移動させようとしている。

タッチイベントを拾うのは簡単。
タッチした座標まで移動させるのも、TranslateAnimationみたいなのを使って移動させられる。
アニメーション後に座標を元に戻すか留まらせるかも、指定できる。

が、アニメーションしている間はどうすることもできない。
例えば、ボタンをアニメーションして移動させても、移動中のボタンは押しても反応しない。
記憶によると、移動前の座標にまだあると判断していたと思う(これも設定次第かもしれん)。

今回、ボタンみたいに押して動作させたいというのはない。
ないのだが、移動中の画像をタッチしたときに止めたいのだ。
そしてその位置からタッチした場所に向かうよう方向転換させたい。

させたいのだが、よくわからん。
作戦を休みに練ろう。
そして今日は寝よう。

2010/02/07

画面サイズとアプリ

実家に帰っている間、ごにょごにょとSupporting Multiple Screensを読んでいた。
ネット環境がないと仕事がはかどりませんなぁ。
幸い、英和辞典があったので助かった。
やはり、紙の媒体も置いておかないと、いざというときに不安だ。

最初に言っておくが、これは私が読んだものなので、正確さには欠けていると思う。
自分で読んでほしい。


用語

  • スクリーンサイズ(Screen size)
  • アスペクト比(Aspect ratio)
  • 解像度(Resolution)
  • 密度(Density)
  • DIP(Density Independent Pixel)

スクリーンサイズは、画面の対角線の物理的な長さ。
これは、large、normal、smallに分類する。
largeは5インチくらい、normalは3~4インチくらい、smallは2.5~3インチくらい。

アスペクト比は、longとnot long。
これは長方形か正方形か、という意味か?

解像度は、width x heightのピクセル値。
しかし、Androidアプリは解像度では動かない・・・という訳でいいのか。
  appli do not work directly with resolution。

密度は、ピクセル密度などと書いた方がわかりよいのかな。
以下densityと書きます。
同じ面積でも、densityが低ければピクセル数は少なくなるし、高ければ多くなる。
UI部品の大きさをピクセルで指定すると、densityによって見栄えが変わってくる。
これは、high(hdpi)、medium(mdpi)、low(ldpi)に分類する。
highは240dpi、mediumは160dpi、lowは120dpi。

Android1.5までは、スクリーンサイズ3.2インチ、解像度HVGA(320x480)、をベースとしている。
分類で言えば、normal-mdpi。


単位として、dipというものがある。
上に書いている、Density Independent Pixel、つまり密度非依存ピクセル。
ピクセル値を直接指定すると、端末によって見栄えが変わってしまう。
それをDIPで指定することで、システム側にうまくやってもらおうということだ。

dipの基準は、normal-mdpi。
もし320dpiの環境で動かしたら、2x2=4倍のピクセル数が必要になる。
ということだろう。


で、だ。

結局のところ1.5で作ったアプリをどうしたらいいんだろう?
それは、最初に書いたURLの「Strategies for Legacy Applications」に書いてある。
読んでないけど。

今のところは、その手前まで何となく把握しているつもり。
マルチ対応とリソースの関係について。


訳に自信がないので、そのつもりで。

まず、端末のdensityを元にしてアプリのリソースを自動的に選択し、スケーリングせずに画面表示させようとする。
スケーリングする、というのは、拡大縮小のことだろう。
当てはまるリソースがないならば、デフォルトのリソースを読み込んで、現在の画面の汎用的なdensityでスケーリングしようとする。
デフォルトのリソースは、densityがmediumとして考える。

これが「1. Pre-scaling of resources(such as image asserts)」の部分。
続いて「2. Auto-scaling of pixel dimensions and coordinates」があり、最後に「3. Compatibility-mode display on larger screen-sizes」となる。

pixel dimensions、は何だろう。
次元、と訳すと変なので、寸法、なのか。
densityによる計算をしたらピクセルの大きさが出てくるので、そのことだろうか。

例が書いてあるので、いつか訳したいところだ。


アプリが複数サイズの画面に対応するかどうかは、AndroidのバージョンとManifestファイルによって決まるようだ(リソースもあるけど)。

Manifestファイルに<supports-screens>を置き、そこに「android:smallScreens="true"」などと書いていくことで、対応するかしないかが決まる。

「android:xxxxScreens」は、small、normal、largeの3つ。
デフォルト値は、Android1.5までは全部false。それ以降は全部true。
あ、全部falseと書いたが、normalはtrue。
このパラメータがtrueだとその画面サイズをサポートする、つまり表示させようとすることになる。
Android 1.5以前では、デフォルトでnormalのみtrueとなるので、大きい画面要アプリだと表示されないことがあるのだろうか。
でも、SmartQ5は4.3インチでWVGAなので、large-hdpiに相当しそうな気がする。4.3なので、ぎりぎりnormal-hdpiかもしれんが。

表を見る感じでは、これからはnormalでmdpiとhdpiに対応するといいんではなかろうか。
ターゲットが決まっているのなら、そのリソースだけ用意すればいいと思う。
デフォルトのリソースさえ用意しておけば、少なくとも表示されないことはないだろう。


サンプルを見ている感じからすると、

  • layoutはport(縦長)とland(横長)
  • drawableはmdpiとhdpi

としておけばいいんでないかしら。
共通で使えるものは、デフォルトリソースへ。

2010/02/04

[Q5]アプリ画面が小さい

あまりSmartQ5とは関係ないのだが、SmartQ5で動作させたときのことなのでそうしておこう。

似たようなアプリを2つ公開している私。
怖さなどをアピールしたアプリは数多くあるが、威嚇をアピールしたアプリは世界初ではないか?
威嚇が地球を救うかもしれない。
かといって、威嚇と恫喝を一緒にしてはいけない。
真の威嚇とは、相手に危害を与えることなく、自分に危害を与えさせないようにすることである。
そして、自分が強いならば威嚇はしない。それは恫喝だ。
このアプリを見て「威嚇とはどうあるべきか」を考えてほしい。

・・・すまん、適当なことを書いた。


とにかく、そのアプリをeclairを移植したSmartQ5で動かした。
SDKは1.5だ。
rotatorに対応していないのでSmartQ5は横画面しか出せないのだが、アプリ画面が小さい。
QVGAくらいになってそうなのだ。

画像が回転するため、画像の中心座標なんかは相対的に指定することはあるが、画面全体のサイズなど考慮していなかった。
していないというよりは、QVGA以上なら収まるだろう、というくらいにつくっていたのだ。
背景色を白のみにしているのも、そんな理由(だったと思う)。

しかし、SmartQ5で動かすと、アプリ画面以外の部分が黒いのだ。
もちろん、黒い部分には何も表示されない。
うーむ。

FILLにしているので画面全体を使ってくれると思っていたのだが、何かしないといかんのか?
AndroidのSampleにあるHomeも同じになったし。
待受アプリを作ってみようとしているからには、それくらい何とかしなくては。

ここ は読んでおかねばなるまい。

2010/02/03

[Q5]libを置き換えてもだめ

安直な解を求めたい場合もあるが、それを意図したわけでもないと言うことがある。

何かというと、昨日copybitが動かなかったので、Covia版の/system/libをまるまる私がビルドしたものに上書きしたという話。
それで動けばいいや、とも思うし、置き換えて動くのならばライブラリの問題だけということもいえる。

後者かどうかを見極めたかったのだが、安直と言えば安直。


そしてまあ、だめだったのだけどね。

E/AndroidRuntime( 694): Unable to register all android natives
I/ServiceManager( 625): service 'media.audio_flinger' died
I/ServiceManager( 625): service 'media.player' died
I/ServiceManager( 625): service 'media.camera' died
I/ServiceManager( 625): service 'media.audio_policy' died
I/ ( 695): ServiceManager: 0xad08

Audio関係がだめになった。
ここは、AndroidRuntimeが起動してすぐだ。
自分でビルドしたものだと、こんな感じ。

E/ALSALib ( 640): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidOut
W/AudioHardwareALSA( 640): Unable to attach mixer to device AndroidOut: No such file or directory
E/AudioHardwareALSA( 640): Unable to attach mixer to device default: No such file or directory
E/ALSALib ( 640): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidIn
W/AudioHardwareALSA( 640): Unable to attach mixer to device AndroidIn: No such file or directory
E/AudioHardwareALSA( 640): Unable to attach mixer to device default: No such file or directory

ALSAが動いてなかったので、そのままエラーで進んでいったというところ。
グラフィックがSurfaceFlingerならば、音はAudioFlingerなのだな。

flingerって何だろうかと思ったら「蹴る癖のある馬」らしい。
ピッチャーとか投げる人という意味もあるようだが。
いや・・・普通に考えれば、後者か。
ハードに向けて指示を投げる人、とかか?

今のところ、自分でビルドした環境ではFlinger系はうまく動いていないな。
そこがやはり、企業と本気さが違うということか・・・。

2010/02/01

[Q5]Covia版Eclair

Coviaさんのところから、SmartQ5のEclair試作版が出ていた。
試作版を出せるところがいいですな。

試してみたが・・・やはりできがいい。
私のとは比較にならん。
当たり前といえば当たり前なのだろうが、なんかショックだ。

一番の違いは、グラフィックだろう。
まだWVGAには対応していないのだが、軽い。
その次は、ネットワーク。
ちゃんと無線LANがつながりそうだ(接続までは試してないけど)。
悔しいなぁ。


あまり深く考えていなかったのだが、EclairはAndroid2.0らしい。
今のSDKで出ている最新版は、2.1。
android.git.kernel.orgを見てみよう。
ここでは、tagsとheadsという単語が出てくる。
-bオプションで使っている名前は、headsにある。
だから、headsがブランチのことなのだろう。

frameworks.gitを見てみると、commitコメントに「android-2.1_r1 snapshot」と書かれている。
ということは、最新のeclairブランチは、Android2.1R1なのかしら。
コメントの横に「eclair」って緑色の枠が出ているは、「これが最新のeclairでとってこれるものですよ」という意味なのか。


さて、私も悔しがっているだけではだめだ。
活用できるところをもらわねば。

まずは、copybit。
構造体が変わったせいか、Cupcake版のものが使えないのだ。
昨日までがんばってみたが、どうにもだめ。
もちろん私は、Covia版のcopybitをいただいたってわけさ。
いくつかまつわるlibも一緒にコピー。

動いた!
と思ったが、もっさり。
なんでだろうと思ったら、egl.cfgがないせいか、stretchに失敗。
ならばとegl.cfgをコピー。
中を見るとfimgなんてことが書いてあった。
同じ場所に、fimgなんとかってライブラリもある。
えーい、まるごとコピーしてしまえ!

・・・動かなくなった・・・・・・・。
egl.cfgを置くことでfimgを使うようになったのだが、fimgがChunkAllocというのを使っているみたいなのだ。
これも同じディレクトリに置いているのだが、なぜか見つからないといわれる。
アクセス権もフルにしたし、そんな問題ではないのか・・・。

E/libEGL ( 650): load_driver(/system/lib/egl/libEGL_fimg.so): Cannot load library: link_image[1721]: 628 could not load needed library 'libChunkAlloc.so' for 'libEGL_fimg.so' (load_library[1051]: Library 'libChunkAlloc.so' not found)

kernelを置き換えてみるといいのだろうが、そうすると前回のchrootみたいなことをしなくてはならん。
つまり、/systemと/dataをまとめた1つのパーティションを作らねば。
ああ、昨日のまま放置しておけばあっさり試せたのに・・・。

などと繰り言は言うまい。
明日だな、明日。

2010/01/31

[Q5]chrootと/dev

こんなことを考えていた。

今のSmartQ5では、rootfsはinitramfsにあり、そこにinitで/devなどを作り、init.rcで/systemや/dataをmountするなどしている。
それを、init.rcの適当なところでchrootさせることでパーティションを減らせるのではないかと。

やっているのだが、うまくいかない。

socketの作成がうまくいかないのだ。
initの中で、device_init→init.rcのinitセクション実行→start_property_service、の順で行われているため、/devがinitセクション実行中のchrootで消されているからだろう。

ならば、とinitセクション実行後にdevice_initをもう一度呼ぶようにしたけど、だめ。
よくよく見ると、それよりずっと前、一番最初に/devのmkdirなどがあった。
ああ、そうですか。。。


そんなことを考えると、initのしょっぱなでmountとchrootさせてしまえばいいっちゃなかろうか。
そげんあれこれ考えたくないけんね。

だが、mount()が動かない・・・。
考えてみれば当たり前なのだが、/devがないのにmountも何もあったもんじゃない。
/devはどうやっているかというと、rootfsにmkdirしたあと、tmpfsをmountさせているのだ。
かといって、/devを作ってあれこれしたあとにchrootしても、その設定はchroot先の/devには引き継がれないのではないか?
シンボリックリンクさせようかと思ったけど、ネットで見る限りchrootはchroot外へのシンボリックリンクができないようだし。

なんだ、あれこれやって結論は「できない」なのか??


chrootはそういう目的ではなく、緊急リカバリー用に使おうとしているのかなぁ。

とにかくまあ、あんまり簡単にはできなさそうなことがわかったのでいいとしよう。
きれいにやるなら、u-bootのところからSDカードをマウントすることだろうけど、インストーラを何とかしないと手を出せなさそうだから、やめておこう。
さすがに起動しなくなるのは困る。

[Q5]eclairとmasterの違い(init)

eclairになって、initにchdirとchrootが加わったのでパーティションをまとめよう、なんて考えていたけど、eclairのinitは昔と変わってなかった。
むむ、なんでだ?
夢で見たのか、そんな内容を??

自分に自信を失いかけた頃、ものがみつかった。
masterの方だった。

masterでは、chdirとchrootが追加されたみたい(中で関数呼んでるだけだが)。
ついでに、importというのも使えるようになったみたい。何か知らん。

起動時に作る/devに、sndも加わるようになったみたいだ。
これがないと、たぶんALSA関係のがうまくいかんのよねぇ。


ALSAといえば、eclairにALSAをlocal_manifest.xmlで追加するとコンパイルに失敗する。

これは、frameworks\base\include\media\AudioSystem.hが今のALSAと差分があるためのようだ。
local_manifest.xmlのは、うまくさばいてくれないのか?
あるいは私の使い方が悪いのか・・・。

gitの使い方がよくわからないままなので、後者である気もする。
さっきも、今までSmartQ5用にしていたものにブランチを切ろうとrepo startしたら、ソースが変更前に戻されていて全部やり直したし・・・。

何をすれば、gitがわかるのかなぁ。。。

2010/01/30

[Q5]電源OFFダイアログ

自分でビルドしてから、どうしても困ることがあった。
電源OFFだ。

SmartQ5にはボタンが4つ(リセット以外)があり、その1つが電源ボタンだ。
電源をOFFにするときには長押しすると、サイレントモードにしたり、電源OFFにしたりの選択肢が出てくる。
今のビルドでは電話系のものを組み込んでないため、電源OFFしか出てこない。
そこで電源OFFを選択すると、本当にいいのか聞いてくる。
そのダイアログでYESにすると、シャットダウンが始まって、電源OFFになる。

自分でビルドした場合、長押しするとダイアログが出てくるのだが、それと同時にバックライトも消えてしまうのだ。
他のボタンを押すと点灯するので、また長押しして、消える。
何度かやっているとうまくダイアログが表示されるのだが、そこで電源OFFを選んでも、今度は次の確認ダイアログで同じようなことが起こる。
そうやって嫌になり、リセットボタンを押してしまうのだ。


そもそも、電源OFFダイアログはどこで制御されているのか?

意外ッ! それはphone_policyッ!!

PhoneWindowManager.javaにあった。
正確には電源OFFダイアログではなく、キーの長押しだ。
interceptKeyTq()という関数で受け取っている。
Tqは、Queue Threadのことらしい。

そこでスリープしそうなところをコメントアウトしたら、直った。


ついでに書いておこう。

電源OFFを聞いてくるダイアログは、PowerDialog。
これは、phone_policy。

その次のシャットダウンを確認するダイアログは、ShutdownThread。
これは、frameworks。

同じように見えて実現している箇所が違うので、探すとき忘れないようにしよう。

2010/01/26

[Q5]Launcher2にlibを足してもだめ

あー、もう今日は体きつい・・・。
風邪と口内炎。
こまったもんだ。


やる気があまりでないが、Launcher2がlibをコピーするだけでいけるならば試しておきたいところだ。
libRS.soとlibrs_jni.so。
out以下のobj/libにあるのに、なぜコピーされないのだろう?
コピーするものとされないものの区別を見分ける方法がわかっていない。
ビルドはされているのだがなぁ。

さて、コピーしてみたのだが、やはり動かない。

V/RenderScript( 744): RS Launching thread
W/ResourceType( 744): Failure getting entry for 0x7f02001e (t=1 e=30) in package 0: 0xffffffb5
D/AndroidRuntime( 744): Shutting down VM
W/dalvikvm( 744): threadid=3: thread exiting with uncaught exception (group=0x4001b168)
E/AndroidRuntime( 744): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 744): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.launcher2/com.android.launcher2.Launcher}: android.view.InflateException: Binary XML file line #54: Error inflating class android.widget.ImageView

そういえば、Launcher2ってどんなアプリだろう?
Binary XMLという文字が見えるところから、XMLを使ってるのだろう。
勘だけど、XMLにスクリプトを書いて待受画面を作ることができる、みたいなものか?

ああ、力尽きてきたので、もう寝ます。

あ、init.rcでchrootとchdirがサポートされるようになったようだ、eclairから。
と自分で書いて気付いたのだが、chrootできるんだ!
SDカードにパーティション作ってAndroidのデータ一式を置いているのだけど、SmartQ5は4つパーティションを使っているのだ。
だから、空きがないのだな。
Covia版のSDカードと自分版のSDカードを用意しているのだが、BeagleBoardがやってきたので1枚空けたいところ。
買えばいいんだけど・・・お金がかかるし・・・。

今の私の使い方だと、そんな何十GBもいらんようだ。
余っているので、有効に利用したい。
initramfsを使っているとそこがrootになってしまい、それゆえ/systemと/dataを別パーティションにしている。
それとswap。vfatは必要なので、あわせて4つ。
これでおしまいだ。

もしchrootできれば、/systemと/dataをまとめた/rootを作ってしまうことができる。
/devとかsqlite関係らしきディレクトリも、あらかじめ作っておけば、initであれこれやらなくても済み、起動が速くなるのでは?

まあ、期待はいろいろあるけど、とにかく寝よう。
明日も会社に行かねば・・・。

2010/01/25

[Q5]待受画面アプリ

さて、voldの件が片付いた(解決ではないが)ので、当面の残件がなくなった。
あまり乗り気ではないが、待受画面のアプリを見てみよう。

なぜ乗り気でないかというと、アプリは苦手だからだ。


オリジナルの待受アプリは何かなー、と思ったが、名前からするとLauncherみたいだ。
そのディレクトリの下に、Launcher2というものがあった。
むむ、これは試して見ねば・・・

だめだ。
起動できなかった。
/system/lib/librs_jni.soがないからのような気がするが、そこまでログを見てない。
見ないとかなぁ。

とにかく今日は、気分が悪くなってきたので寝よう。
喉と鼻の奥に違和感があるので、風邪かなぁ。

続きを読む "[Q5]待受画面アプリ" »

[Q5]Live Wallpaper

動かしてみたかったLive Wallpaperが、先週repo syncしてから使えるようになっていた。

まあ、噂通り遅いのだがね・・・

画面がちかちかする。
メニューを上に出しても描き直しているせいで見え隠れするなど、なかなかだ。
これは、copybitに対応させたらもう一度見てみたいものである。

何で動かしたかったかというと・・・新機能だからだ。
携帯電話じゃないデバイスに載せたとき、スクリーンセイバーとか動かしたくなるではないか。
スクリーンセイバーから戻っても、背景で続きが動いていると、なんかいいなーとか。

まあ、眠たいから寝ましょうかね。

[Q5]voldとums

書いたかどうか忘れたけど、voldが落ちる件は、masterのソースと差分をとって修正を追加することで対応できた。

が、その前から気になっていたことに、SDカードとしてマウントされないという現象がある。
マウントされないというか、Androidがマウントしてあると認識してくれない。
Linuxとしてはマウントされているのだが、voldがそう思ってくれないのだ。


voldのソースをあれこれ見てログを追加していったのだが、blkdevのところまでいってくれない。
なんか・・・最初の方で終わってるような。
SDカードが(mmc)あることまではわかってて、blkdevまでたどりついていないというか。

さっきvold.confの設定を見ていたのだが、こうなっていた。

volume_sdcard {
media_path /devices/platform/s3c-hsmmc.0/mmc_host/mmc1
media_type mmc
mount_point /sdcard
ums_path /devices/platform/s3c6410-usbgadget/gadget/lun0
}

そういえばどこかの記事で、umsを使っているというようなのを見た記憶がある。
umsは、USB Mass Storageの略みたい。
そう思って/sysからパスをたどっていくと・・・

ない!
usbgadgetってのだけ注目していたから気付かなかったけど、実際にあるのはs3c2410-usbgadgetとなってる。
その下にgadgetもlun0もない。
なんじゃこりゃー。

オリジナルのCovia版を見たけど、やはり同じ。
ということは・・・voldに手が加わってる?


Covia版のvoldだけ置き換えてみると、認識した。
予想通りか。。。
vold.confのums_pathは使わず、voldだけで処理しているというところか。
さっさと気付よ、私。。。

stringsで見てみると、PL2303などもハードコーディングされている模様。
hotplugはここでやってるのか。

今の私では解決できないので、ありがたくCoviaさんのvoldを使わせてもらおう。
こうやっていくと「自分でAndroidを移植した!」なんて大きな口はたたけなくなるのよねぇ。

2010/01/24

[Q5]buildspec.mk

昨日えんえんとビルドして、結局「SmartQ5」ではなく「generic」をビルドしていたことに気付いた。

choosecomboして設定したファイルは毎回有効ではなく、その場限りみたい。
常に使いたいなら、トップにbuildspec.mkを置き、そこで指定しておくといいようだ。
build/buildspec.mk.defaultがあるので、そこを変更しておくといいかと思ったけど、うまくいかなかった。
これは、build/envsetup.shを読み込ませた場合に有効なのかな?
設定のどれがどこにつながっているのかが、まだよくわかってない・・・

TARGET_PRODUCT:=smartq5

今回はこんな感じで、残りはデフォルト。

2010/01/23

[Q5]eclairは動いたものの・・・

昨日、寝る前にmakeは終わった。
寝る前というか・・・3時くらいなんだけどね。
ああ眠たい。

いろいろとあるけれども、とりあえず起動だけはした。
起動した、というのは、待受画面までいったということね。

ソースの変更箇所は驚くほど少ない。
system/core/rootdirと、build/core/envsetup.mk、それとvendor以下にcovia版の設定を追加したくらい。


さて、動いていないものを挙げておこう。
私もまだ把握はしてないけど、これらを解決していくことでいろいろと見えてくることがあるかもしれない。

  • voldがおちる。
  • mediaがおちる。
  • Androidキーボードが予期せず停止する。

media

mediaは、initの修正で対応できた・・・ような気がする。
system/core/init/devices.cに/dev/snd/を追加した。
なぜ追加したかというと・・・前回のソースとの差分。
前回は最初からあったのか?
まあいいや。

でも、起動時にいくつかエラーが出ているから、完了してはいない。
今日はおしまいというところだ。


vold

volume daemon、の略か。
最初はvoidかと思ってたよ・・・。

voldが落ちていると、MountListenerというやつがばんばん例外を出す。
それにvoldが落ちるとデバッグ出力を出すので、いろいろと遅くなる。

原因は、Segmentation Faultらしい。
MMCのマウント(SDカードもMMCとして見られる)確認はしているようなので、まったく動いていないわけではないみたい。
どこで落ちているのだろう・・・。
uevent.cでDEBUG_UEVENTを有効にして試してみよう。

(ビルド中)

いろいろとログを追加していた結果、mmc.cで3回ループしていることがわかった。
SmartQ5には、iNAND、外部SDカードしかないので、2回ループでいいはず。
masterのソースを見ると、エラー処理があった。それを反映させるとよくなった。
まあ、そんなもんか。


Androidキーボード

Androidキーボード・・・なんで?
LatinIMEをPRODUCT_PACKAGESに含んでいるが、他にも必要?
ひとまず、SoftKeyboardも追加してみるか・・・

(ビルド中)

SoftKeyboardを追加してもだめ。
そこまでしかわかってないので、また明日。


ビルドしている間・・・。

いろいろと動かないところはあるものの、基本的に動いていると思う。
少なくとも、汎用に(ARM用だけど)できたソースファイルを多少変更させたくらいでSmartQ5で動くのだから、おそろしいもんだ。
いくらkernelは別で用意したとはいえ、そこから先の部分がこんなに動かせるとは。

[Q5]eclairソースファイル

あした、うちに、beagleboardがくる、よてい。

だが、私はまずSmartQ5を何とかしなくてはならない。


昨日くらいに、gitにeclairのソースがほぼアップされたというブログがあった。
では、私が今までやっていたのは・・・?
などという疑問を持たないのが私のいいところだ。

repo syncしてみたが、そんなに変わらない。
直接gitのサイトを見てみると、master(なんもなしでrepo initした場合)と、eclairを指定した場合ではソースが幾分違っていた。
masterの方が最新なのかと思っていたけど、eclairにしかアップされていないものもあったり。
単に後でアップされるものなのか、eclairでのみ使われるものなのかはわからんが。

あんまり考えるのも面倒なので、昨晩はeclairをrepo syncした。
寝る前に仕掛けておいたので、朝には完了していた。
今はそれをSmartQファイルだけ更新してmake中・・・


sound関係のもビルドしたかったので、あらかじめlocal_manifest.xmlにALSAをしこんでおいた。
ふふん、と思ったが・・・eclairではproject.listに既に入っていた。
ちっ。

しかし、makeするとFM関係がないと怒られた。
そんなの知らんよ・・・と思ったが、これはmaster版にしか入っていない設定だった。
よくわからんので、frameworks/base/include/media/AudioSystem.hだけ差し替えた。
そんなんでいいのかしら?


makeは進んでるけど、私が寝る前に終わるかなぁ。
beagleboardのことも考えなくてはならないのだが。。。

2010/01/20

[Q5]電気が足りない?

デバッグするのに、USBハブとUSBシリアル変換とUSBキーボードを接続している。
使っている間はそんなに問題がないのだが、電源をOFFにしようとするとなかなかうまくいかない。

ダイアログが表示されるのだが、すぐに消灯してしまう。
ボタンを押すと表示されるのだが、また消える。
なかなかボタンが押せないのだ。
そこで押せたとしても、次の確認ダイアログでまた同じような目に会う。
2回修羅場(?)をくぐり抜けて、ようやく電源OFFにできるのだ。

もちろん、これはCoviaさんのSmartQ5ソフトでは発生しない。
何か足りないのだろう。


とログを見ていたのだが、何となく電力が足りないようなメッセージが出ている。
powerがどうのこうの。
ACアダプタを接続しているとはいえ、そんなにあちこち提供するほどはパワーが足りないのかもなぁ。

USBハブを買ってくるか・・・。

どうでもいいけど、うちのATOKは「USBはぶをかってくる」を「USBハブを飼ってくる」と訳してくれた。
ああ、ハブは飼うものなのね・・・。ならば私はマングースにならねば。


今日は、WiFiを見直していた。
あまりよく見ずにCovia版のものをまねていたのだが、まねているつもりが少し違うことに気付いた。
SDカードにCovia版を入れたときに、オリジナルに近くしようとしてしまったようだ。

Covia版は、こう。

service wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0 -c /data/misc/wifi/wpa_supplicant.conf
group wifi
disabled

私のSDカード移植版は、こう。

service wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0 -c /data/misc/wifi/wpa_supplicant.conf
socket eth0 dgram 660 wifi wifi
group wifi
disabled

違いは、socketの行だ。
なんでこれを追加したか覚えてないのだが、何かをまねしたんだろう。
他のvendorをまねして明日試してみよう。

今日は、一晩かけてリビルドだ。
なんか、makeしてもするっと終わるようになってしまったのよねぇ。
repo syncしたし、たまにはいいか。

[Q5]音ファイル

ごくごく小さなAndroidセットを作り、そこから勉強していこうとしている。

だが何もないと寂しいので、音くらい出したい。
設定画面で音を選ぶと・・・落ちる。

これは、MediaProviderがなかったためらしい。
音ファイルも必要だが、それはmakeにこんなのを書いておけばいい。

include frameworks/base/data/sounds/OriginalAudio.mk

他のvendorファイルを参考にさせてもらった。
ちなみに私は、

vendor/covia/products/smartq5.mk

というファイルを作り、そこにincludeさせた。

vendor以下の設定ファイルについてはいつか書いておきたいのだが、私も試行錯誤しながらやっているため、いいやりかたがよくわからん。
PDKを見ながらやったので、他のサンプルとは少し違うような気もする。


さて、PRODUCT_PACKAGES(これも同じsmartq5.mkに置いてる)にMediaProviderを追加したが・・・まだだめ。
前回は音選択画面に遷移する前に落ちたが、今回は選択画面までは行く。
選択したらだめ。

logcatを見ると、

E/ActivityThread( 820): Failed to find provider info for drm

DrmProviderもいるのかー。

下回りなのでAndroidアプリは知らなくていいと思ってたけど、そうもいかんなぁ。

[Q5]DatePicker

時刻の設定をしようと設定画面を立ち上げたのだが、日付設定画面を出してびっくり(するほどでもないが)。
12月になると、画面から文字がはみ出して「2月」にしか見えなくなるのだ。

これはDatePickerというwidgetを使用しているからだ。
DatePickerはどうしているかというと、内部用のwidgetであるNumberPickerを呼び出している。

つまり、この問題はどちらかだ。

  1. DatePickerが、NumberPickerが対応していない「1月」のような数値を渡している。
  2. NumberPickerが文字列の横幅調整できていない。

さて、どうなんだろう?


DatePickerを見ると、DateFormatSymbols.getShortMonths()を使っている。これがどんな文字列を返すのかはわからなかったけど、まあ順当に「1月」~「12月」だろうな。

その前に、NumberPickerをNumberPicker.TWO_DIGIT_FORMATTERと書式設定している。
これは文字通り、2桁の数字用なのだろう。

最後にsetRange(1, 12, 文字列配列)としてて、文字列は最初に書いたgetShortMonths()なのだ。
ここの文字列は表示用文字列として使われるだけのようだ。
つまり、該当するインデックス値の文字列を表示する、と。

年は正しい幅で表示されている。
こちらは、書式設定を行っていない。
桁数を減らしてもそのままだったから、最初に表示した桁数を守っていると言うことになるのか。


まあ、今回はNumberPickerに文字列を渡しているというのが問題か?
いやいや、NumberPickerは文字列表示もできるようにしているし・・・。
書式で指定した以上の幅になる文字列を渡しているのがいかんのかな。

とにかくDatePickerで数値を渡すようにすることで、問題はなくなった。
JanとかFebとかじゃないとわからん人には困るだろうが、どうなんだろうねぇ。

ちなみにソースは、

frameworks\base\core\java\android\widget\DatePicker.java
public DatePicker(Context context, AttributeSet attrs, int defStyle)

2010/01/17

[Q5]ホーム画面

とりあえずやってみたいのは、UIの書き換え。
ソニー・エリクソンのX10(だっけ?)のUIが話題になったことがあるが、UIを差し替えて「これもAndroidなの?」といわれるようなのをやってみたいのだ。

で、私がやりたいのは派手派手なのではなく、アニメーションとかせずにカチカチ動くようなやつ。
「使えればいい」の人なので、使い良さのアニメーションならいいけど、見た目だけのアニメーションはいらんのだ。


しかし昨日調べていてわかったのだが、ホーム画面はAndroidアプリで差し替えが普通にできるのだ。
がーん!
サンプルソースがSDKにもついているくらい・・・。

なんか、テンションが急に下がってきた。


起動画面で最初に出てくる文字だけの「ANDROID」は、initがttyに出力して出している。

その次に出てくるアニメーション(bootanimation)は、frameworksの下ーーにある2枚のpng画像が使われている。
1枚は「android」の線だけが描かれ、線の内側は透明色、外側は黒。
もう1枚は光っているような画像。
あんまり調べてないけど、光っているような画像がぐるぐる回ることで、androidが光っているように見えているのだろう。
なので、起動画面をもっといじりたければ、そこをいじくるとよい。


UIのボタンなんかの見栄えを変更しようかと思った。
塗っている色を変えてみる、くらいでいいかと思ってたけど、そうでもない。

この辺は、9 patchというものが使われている。
昔、C Magazineにも記事があったが、1枚の画像を3x3に分割し、(たぶん)十字の部分だけ伸ばしたり縮めたりするやり方。
ほら、枠の周囲にグラデーションが付いているような画像だと、そのまま拡張するとびろーん、となってしまうではないか。

9 patchはツールが提供されていて、それを使うらしい。
Taosoftwareさんのところが詳しい。

拡張子が.9.pngを探すと、大量にあった。
これを差し替える気力はないなぁ・・・。


今後の手順。

  • デフォルトのHome画面アプリを探す
  • 画面上部のタスクバー周りを探す。
  • Live Wallpaper

repo syncして最新版ソースを使っているつもりなのだが、壁紙選択の部分が昔から変わっていない。
実はrepoの使い方も、まだあやしいんだよなぁ。


困っていることはまだまだある。

ディレクトリ構成がわからないというのが、実は痛い。
アプリのところで、drawable-mdpiとかdrawable-hdpiとか出てきても、困る。
たぶん、中解像度と高解像度なんだろうけど、どこからがどうなんだ?
ああ、ここにあるのか・・・

あとはアプリをデフォルトで追加する方法。
PRODUCT_PACKAGESに追加しておけばいいんだろうと思ったけど、なぜかApiDemosが追加されないのだ。
/data/appにはApiDemos.apkがあるんだけどなぁ。
まさか/dataに入ったアプリが見えていないということか?

2010/01/15

[Q5]Live wallpaperならず・・・

昨日いっていたのは、こんな画面のことだ。

さて、これが標準サイズなのだろうか・・・。

画面サイズに合わせて広がったというところか?


せっかく、昨日repo syncして全部ビルドし直したので、噂のLive wallpaperがインストールされるのでは、と期待したのだが、そうはいかんかった。
まだ足りんものがあるんだろうねぇ。

WiFiもあきらめ、copybitもあきらめた。
当初の目標であるGUIの差し替えをして遊ぶことにしよう。

起動画面を描き変えてみたが、配色を失敗した。。。
2枚のpngを使って光るシーンを演出しているのだが、表のmask画像を真っ白にしてしまったため、光る余地なしというところだ。

このマヌケがぁぁぁ!!

2010/01/14

[Q5?]ロック画面が昨日と違う

昨日、3時くらいまでビルドしてようやく元に戻った。
3時まで、といっても帰ってきたのが0時過ぎだから遅くなったんだがね。

昨日起動させて、あることに気付いた。
それは、ロック画面が違うことだ。
右端に出てきていたダイアルみたいなやつ。
あれが画面中央くらいにちんまりと表示されていたのだ。
ああ、これなら操作しやすいねぇ。

そう思っていたのだが・・・さっき起動させると、元に戻っていた。
昨日と違うぞ?

続きを読む "[Q5?]ロック画面が昨日と違う" »

2010/01/11

[Q5]wifi動かず・・・

もうこんなネタしかない。

# wpa_supplicant -Dwext -ieth0 -c/data/misc/wifi/wpa_supplicant.conf
ioctl[SIOCSIWPMKSA]: Invalid argument
ioctl[SIOCSIWFREQ]: Operation not supported on transport endpoint
ioctl[SIOCSIWAP]: Network is unreachable

iwconfigくらいしか使ったことがないので、よくわからんがいわれるままにやってみた。

wpa_supplicantというのは、認証が必要なWiFi接続のあれこれをやってくれるものらしい。日本語だと、gentoo linuxのところがわかりやすいと思う。
直訳すると「WPA嘆願者」。
私に代わって嘆願してくれる、ありがたいソフトだ。
うちの無線LANは、WPA/WPA2-PSKだ。


Androidでは、ビルドすると/system/bin/wpa_supplicantができている。
wpa_cliというのもあって、これは接続テストらしい。
まずは手動でつながることを確認して、次にGUIで動くようにがんばる、という手順でやるのがよいようだ。

そしてだめだったのが、冒頭のログ。
wpa_supplicant.confは、Covia版で接続できたものをそのまま使っている。
しかしこのファイル、どこに置くべきかがよくわからん。
/system/etcにもあるし、/data/misc/wifiにもあるし、/data/system/wifiにもある。
いや、置くのは私なんだけど、Covia版のをまねしながらやっているとそうなるのだ。
今のところ、/data/misc/wifiにしている。

次にはまったのがパーミッション。
デフォルトのinit.rcのまま使っていたのだが、/data/miscが0770とかで、groupがwifiになっていたのだ。
コマンドで動かすときはrootだからか、confファイルを読み込んでくれなかったのだ。
なかなか気付かなくてねぇ。

そこまでいって出たのが、最初のログ。
よくわからん。


そして、あれこれ試していたら・・・起動しなくなった・・・。
gitでcommitしていたんだけど、最後にcommitした地点への戻し方がわからん。

git checkout -- {ファイル名}

一度ファイルを削除して上記をやると復元できたのだが、削除したばかりのファイルが復元された。
その前にどこかでcommitしたっけ?
addしたんだっけ?
なんか、svn気分が抜けていない・・・

とにかく動かないとどうしようもないので、out/ を削除してビルドし直そう。

2010/01/10

[Q5]copybit使えず・・・

Covia版のcopybitライブラリをそのまま持ってきたのだが・・・

E/copybit ( 689): S3C_FB_GET_CURR_FB_INFO fail
E/copybit ( 689): SetFb fail fd(800), addr(13dbb0), offset(1153386496)
E/copybit ( 689): s3c6410_stretch fail
I/ARMAssembler( 702): generated scanline__00000077:03545404_00000A01_00000000 [ 30 ipp] (51 ins) at [0x18e08:0x18ed4] in 0 ns
E/copybit ( 689): S3C_FB_GET_CURR_FB_INFO fail
E/copybit ( 689): SetFb fail fd(800), addr(13db78), offset(0)
E/copybit ( 689): s3c6410_stretch fail
E/libagl ( 689): copybit failed (Unknown error: -22)

そうなのね・・・。


CUPCAKEのソースと見比べてみたが、以前はstretch()を使っていた箇所がblit()を使うようになったみたいだ。
blitって、bit blitのblitだろうね。
以前は使われていないので、copybitライブラリで実装を端折っていたのだろうか。

いや、よく見ろ。
失敗しているのはblitではなく、stretchだ。
blitは内部でstretchを呼び出しているのだろう。
だから実装の問題ではなさそうだ。

そもそも、fb(800)というのがおかしい。
こ、これはまさか・・・。

struct copybit_image_tのメンバーが変わっている!
CUPCAKEでこうだったものが、

struct copybit_image_t {
/* width */
uint32_t w;
/* height */
uint32_t h;
/* format COPYBIT_FORMAT_xxx */
int32_t format;
/* offset from base to first pixel */
uint32_t offset;
/* base of buffer with image */
void *base;
/* file descriptor for image */
int fd;

};

こうなっている。

struct copybit_image_t {
/* width */
uint32_t w;
/* height */
uint32_t h;
/* format COPYBIT_FORMAT_xxx */
int32_t format;
/* base of buffer with image */
void *base;
/* handle to the image */
native_handle_t* handle;

};

まってくれよー。


いろいろと置き換えて試してみたのだが、だめだった。

E/copybit ( 682): S3C_FB_GET_CURR_FB_INFO fail
E/copybit ( 682): SetFb fail fd(800), addr(13dbb0), offset(1153386496)
E/copybit ( 682): s3c6410_stretch fail

offsetが違う値になったくらいだ。
16進数にすると0x44BF4800。よくわからん。
fbの800は、たぶん画面の横幅だろう。
いかんせん、copybitがどういう状況なのかがわからんのだ。
くやしい。

ここの呼び出しは、

err = copybit->blit(copybit, &dimg, &simg, &it);

となっている。
4つとも引数はポインタだ。
引数の数に変更はない。
そのうち2つが、上記の構造体だったので、新たに旧型の構造体を定義し、そちらにデータを入れて渡すようにしたのだ。
そうすれば、旧型の構造体でアクセスしているのと同じことになるはず。
はずなんだけど・・・。

そもそも、fdはフレームバッファのfdでいいのかいな?
なんか私が勘違いしているのかもしれんな。

しばらくまた寝かせておくことにしよう。

ANR

たぶん、最新版のAndroidをSmartQ5で起動できた。
今の最新版は、どういえばいいんだろう。
Eclairみたいなものか。Eclairリリース後の最新版か。

実は最初、うまく起動しなかった。
いや、起動していたのかもしれないが、画面が黒かったので失敗したと思い込んでいた。
たぶんうまくいっていたんじゃないだろうか。

そのとき、/data/anrに記録をしているログが出ていた。
Javaアプリが例外を出した後に書き込まれている。

E/ActivityThread( 776): Failed to find provider info for mms-sms
W/dalvikvm( 776): threadid=15: thread exiting with uncaught exception (group=0x4001b168)
E/AndroidRuntime( 776): Uncaught handler: thread Thread-8 exiting due to uncaught exception
E/AndroidRuntime( 776): java.lang.NullPointerException
E/AndroidRuntime( 776): at com.android.mms.data.RecipientIdCache.fill(RecipientIdCache.java:76)
E/AndroidRuntime( 776): at com.android.mms.data.RecipientIdCache$1.run(RecipientIdCache.java:48)
E/AndroidRuntime( 776): at java.lang.Thread.run(Thread.java:1096)
I/Process ( 689): Sending signal. PID: 776 SIG: 3
I/dalvikvm( 776): threadid=7: reacting to signal 3
E/ActivityThread( 689): Failed to find provider info for android.server.checkin
E/Checkin ( 689): Error reporting crash: java.lang.IllegalArgumentException: Unknown URL content://android.server.checkin/crashes
I/dalvikvm( 776): Wrote stack trace to '/data/anr/traces.txt'
E/ActivityThread( 776): Failed to find provider info for mms-sms
W/dalvikvm( 776): threadid=17: thread exiting with uncaught exception (group=0x4001b168)
E/AndroidRuntime( 776): Uncaught handler: thread Thread-9 exiting due to uncaught exception
E/ActivityThread( 776): Failed to find provider info for mms-sms
E/AndroidRuntime( 776): java.lang.NullPointerException
E/AndroidRuntime( 776): at com.android.mms.util.DraftCache.rebuildCache(DraftCache.java:106)
E/AndroidRuntime( 776): at com.android.mms.util.DraftCache.access$000(DraftCache.java:34)
E/AndroidRuntime( 776): at com.android.mms.util.DraftCache$1.run(DraftCache.java:74)
E/AndroidRuntime( 776): at java.lang.Thread.run(Thread.java:1096)
E/ActivityThread( 776): Failed to find provider info for mms

前々から気になっていたANRを少し調べよう。


ASCIIの本「Google Androidプログラミング入門」に、ANRの説明があった。
(まだ本自体は読んでいないのだけど・・・)

Application Not Respondingの略。
この本はアプリの本なので、アプリから応答がないときに出てくるダイアログの説明となっている。

調べてもよくわからん。

気になっているのは、ANRのログが出たアプリが次回は起動していないように見えることだ。
起動していないのか、起動してもANRのログが出ていないのか。
毎回起動するなら、毎回/data/anr/traces.txtにスタックトレースを書き込んでいるログが出てくるはずではないか。
どこかに、記録が取られているのかしら・・・。

そういえば、初回はこんなログも出ていた。

I/ActivityManager( 689): Removing old ANR trace file from /data/anr/traces.txt

古いのを消すこともあるらしい。
なんだろう・・・。

[Q5]起動できた?

logcatが使えるようになったことで、効率が上がった。
どうにかこうにか、最新版で起動させることができた。
まあ、wifiとかbluetoothなんかは動かないし、画面描画なんかも遅くてちらつくんだけど、とにかく起動したことを祝おう。

一番下の画面は、ロック画面みたいだ。
起動直後に出てくるMENUキーを押す前の画面。
右端のはなんだろう?と思っていたのだが、あれを指でぐいっと回すとロックが外れる。
つまり、MENUキーでなくてタッチパネルでもロック解除できるのだ。
本当は、丸いわっかが上の方までつながっているのだろうけど、時刻表示があるせいで切れているようだ。


いろいろと考えすぎていて、とりあえず使わないBluetoothをinit.rcで動かないようにしていたせいで起動しなくなっていた。
SystemServer.javaを見ると、QEMUモードでなければBluetoothを起動するようだ。
init.rcだけですべて制御できるわけではないのね・・・。

そうそう、カーネルリビジョンが不明になっていた。
なんだろうね?

しかしよくよく考えると、あまり手を入れたりしていないような気がする。
最初から素直にビルドして動かせば、案外とあっさり動いたんじゃなかろうか?


さて、次の目標はどうしよう。

画面描画をCovia版と同じくらいの速さにしたい。
けど、それはなんだ?
ハードウェアアクセラレータとかだろうか。
copybitライブラリなるものが関係しているらしい。
これは、Covia版のAndroidからコピーしてきましょうかね。
Samsung提供のものを使っているけどバグがある、というコメントがあったような気がする。

それと、wifiですかな。
個人的にはネットワークはどうでもいいのだけど、やはりねぇ。

2010/01/09

logcatが使える

SmartQ5に自分でビルドしたAndroidのuserlandを載せようとしている私。
kernelは自分でビルドできないので(ドライバがない)、Coviaさんのものを使っている。

というのは、昨年説明したような気がするが、物語はときどきあらすじを説明しなくては読者がついて行けないからな。
これでいいのだ。


今までは、straceコマンドを使って動かない箇所を探ろうとしていた。
といっても、straceって初めて使うのだが・・・

システムコールのログが取れる、という認識でよいのかな。
  $ strace -f -ff -tt -s 200 {プロセス番号}
みたいな形だ。
よくわからずに使っているが、何となくでいいや。

何となくでいいのだけど、straceのログでは箇所の断定ができていない。
困ったなー、と思っていると、logcatが使えるという情報が出ていた。
logcatというと、アプリのログ用というイメージがあったのだ。

実際に使ってみると、ログが非常に見やすい。
どういうしくみかは見ていないけど、必要そうなところだけのログが出ているような感じだ。
よし、これだ!

といっても、解決できなければ意味がない。
その見極めもしつつ、Android移植にはどういう道具が使えるかを見ていかねばならぬな。

続きを読む "logcatが使える" »

repoやgit

Androidでは、repoというものを使ってソースを取ってくる。

しかし、私はrepoやgitを使ったことがない・・・。
まあ、repo syncを使えればいいんだろう、くらいに思っていた。

が、ソースファイルをいじくって、やっぱりオリジナルに戻そうとしたときに困った。
svnみたいに、repo syncって打ち込めば元に戻るんだろうと思っていたのだが、そうはいかなかった。

せっかくいくつか調べたので、書き置きしておこう。


一番やってはいけないのが、間違って本当のリポジトリを書き換えてしまうこと。
そこだけは守らねば。

androidでは、複数のGitプロジェクトを組み合わせている。
だから、Gitを何回も使わないと取得できないのだが、repoを使うとそれが楽になる。
ということだと解釈。

repo sync

新たに取ってくるときと、更新するときに使うのがrepo sync。

repo start

とってきたソースのブランチを切るのが、repo start。
初めてrepo syncしたときにやるとよいみたい。
まあ、後からでもできるみたいだが。

repo start {ブランチ名} --all

repo forall

Gitの全プロジェクトにコマンドを実行するようだ。
.repoディレクトリの中にあるリストを見るのかな?
gitコマンドでなくてもいいのかもしれん。

repo forall -c {gitコマンド}

ローカルリポジトリから取ってくる

git checkout

ローカルリポジトリから強制的に取ってくる

git checkout {ファイル}

ローカルリポジトリに追加

自分で修正したいファイルは、addしてからcommiitするらしい。

git add {ディレクトリ or ファイル}

ローカルリポジトリから削除

git rm {ファイル}
git rm {ディレクトリ} -r

ローカルリポジトリにコミット

git commit


たぶん、私が知りたかったのはcheckout -rだ。
しかしこれを使うと、無条件で上書きされてしまうので困る。
svn updateみたいなことはできるのかいな?

まだよくわかっているとは言えない状況であった。

とにかく、git pushしなければ本物のサーバにアップされることはなさそうだ。


そうそう、local_manifest.xmlにproject-removeみたいなのは使えないようだ。
エラーが出る。
自分では使わないプロジェクトをrepoから外すことができないのが、つらい。

vendorなんかは自分でビルドするときはいらないものが多いのだけど、manifest.xmlなどから手動で削除しても、repo syncで戻ってくるからなぁ。
なんかあるのだろうか・・・

2010/01/08

[PDK]bring up

PDKドキュメントを参考にしながら、移植を進めている。
今はbring upを見ているところ。

つつーっと読み進めて、7章。
ここで、androidが起動できたときのプロセスが書いてある。
しかし今の最新版では、いくつかないみたい。
うちでビルドした限りでは、

  • /system/bin/logd
  • /system/bin/usbd
  • /system/bin/runtime

がない。
現在デバッグ中の状態でpsすると、こうなっている(左側省略)。

PC NAME
0000c9ec S /init
00000000 S kthreadd
00000000 S ksoftirqd/0
00000000 R events/0
00000000 S khelper
00000000 S suspend/0
00000000 S kblockd/0
00000000 S cqueue/0
00000000 S ksuspend_usbd
00000000 S khubd
00000000 S kseriod
00000000 S kmmcd
00000000 S btaddconn
00000000 S btdelconn
00000000 S pdflush
00000000 S pdflush
00000000 S kswapd0
00000000 S aio/0
00000000 S kapmd
00000000 S kondemand/0
00000000 S mmcqd
00000000 S ksdiorqd
00000000 S wlan_main_servi
00000000 S krfcommd
00000000 S mmcqd
00000000 S kjournald
00000000 S kjournald
afe0d80c S /system/bin/sh
afe0c93c S /system/bin/sh
afe0cbdc S /system/bin/servicemanager
afe0cd04 S /system/bin/vold
afe0d56c S /system/bin/debuggerd
000f7ee0 S /system/sbin/ash
afe0d24c S /system/bin/rild
afe0cbdc S /system/bin/mediaserver
afe0d56c S /system/bin/installd
afe0d56c S /system/bin/keystore
0000eca4 S /system/sbin/adbd
00009144 S telnetd
ad013090 R zygote
afe0c93c R ps

ちなみに、busyboxのpsを使うとこんな感じ(別の日に記録)

# busybox ps
PID USER VSZ STAT COMMAND
1 0 304 S /init
2 0 0 SW< [kthreadd]
3 0 0 SW< [ksoftirqd/0]
4 0 0 RW< [events/0]
5 0 0 SW< [khelper]
9 0 0 SW< [suspend/0]
96 0 0 SW< [kblockd/0]
100 0 0 SW< [cqueue/0]
104 0 0 SW< [ksuspend_usbd]
110 0 0 SW< [khubd]
113 0 0 SW< [kseriod]
118 0 0 SW< [kmmcd]
123 0 0 SW< [btaddconn]
124 0 0 SW< [btdelconn]
149 0 0 SW [pdflush]
150 0 0 SW [pdflush]
151 0 0 SW< [kswapd0]
153 0 0 SW< [aio/0]
237 0 0 SW< [kapmd]
337 0 0 SW< [kondemand/0]
348 0 0 SW< [mmcqd]
360 0 0 SW< [ksdiorqd]
361 0 0 SW< [wlan_main_servi]
378 0 0 SW< [krfcommd]
399 0 0 SW< [mmcqd]
712 0 0 SW< [kjournald]
713 0 0 SW< [kjournald]
718 0 728 S /system/bin/sh /pl2303.sh
723 0 728 S /system/bin/sh
726 1000 796 S /system/bin/servicemanager
727 0 828 S /system/bin/vold
728 0 2132 R /system/sbin/ash --
729 0 656 S /system/bin/debuggerd
730 0 1292 S /system/bin/rild
731 9999 61188 R zygote /bin/app_process -Xzygote /system/bin --zygote
732 1013 19456 S /system/bin/mediaserver
733 0 784 S /system/bin/installd
734 1017 1488 S /system/bin/keystore /data/misc/keystore
737 0 1308 S /system/sbin/adbd
750 0 2128 S telnetd -l /system/sbin/ash
757 0 2132 R busybox ps
#

zygoteはsystem/core/libcutilsに入っているけど、なんだろう?
/system/binにはないし、mainもないので単体のプロセスではなさそうだ。
app_processから動かすのだけど、流れがわからんなぁ。


bring upとinitのソースを見比べてわかったのは、on device-addedやexecは動かないということ。
どっちも実装がないようだ。

2010/01/06

[Q5]zygoteで落ちているのまではわかる

はい、タイトル通り。

straceのログ

最終的に落としている箇所まではわかるのだけど、そこに至る経緯がわからん。
Cだから、例外といってもなにかごにょごにょやってるんだろうし。

そうか・・・gdbを使えということか・・・
わたくし、今までgdbをまともに活用したことがないのです。
いよいよそのときが来た、ということですかね。


少しだけ今の状況を説明しておこう。

Androidのソースは、repoでそのままとってきた。-bなし。
そこに、vendorのところへsmartq5対応を少しして、goldfishのいらないところをコメントアウトした程度。
あ、さっきsmdk6410ボードにAndroidを載せた人のソースをまねして、power.cでエラーを出さないようにした(効果はしらん)。

んで、framework/ と lib/ だけはcovia版に置き換えた状態で起動できた。
でも・・・その2つって主要部分よね・・・。

最新版がどうしても使いたい、というわけではないのだが、古いのなら動くというわけでもなさそうなので、普通にrepo syncしたものでがんばってみよう。
beagleboardでは動いているようだし。

前よりよくした点は、PL-2303を比較的最初から使えるようにしたこと。
残念ながらログは出てこないのだが、コンソールとしては使えるようになった。
これで、起動アニメーションが出ていても操作できるし、straceもできる。

2009/12/30

[Q5]うまくいかずに年末を迎える

年末ですな。

SmartQ5に自分でビルドしたAndroidを載せようとしているものの、うまくいかない。

あれがこう、これがこうというものがないのだが、とにかく起動時のandroidアニメーションから先に進まない。
この頃になると、せっかく見つけたgettyも使えなくなっている。
かといって、zygoteを止めるとandroidアニメすらしない。
うーん・・・

TLSってレジスタがCPUにあるかどうかで修正しないといけないとか、新しいソースではやらなくてもいいとか、いやいやまだ修正が完璧ではないとか、情報がいろいろあって困りますわ。

とにかく、デバッグ環境を整えねば。
闇雲に歩いていても、道に迷うだけだ。


zygoteが起動するまでは、USBシリアルが使える。
この「zygoteが起動するまで」というのが、我ながらあやしい。
USBキーボードで入力ができ、かつUSBシリアルが使える時期は意外と長い。
その間何をしてるんだろう?

2009/12/29

[Q5]getty ttyUSB0

さて、画面が出なくなって終わる、というところで行き詰まっていた私。
USBキーボードでのコマンド入力もできないので、困っていた。

USBキーボードがだめなら、USBシリアルでつなげばいいじゃないの

と、声が聞こえてきて早数日・・・


mknod /dev/ttyUSB0 c 188 0
insmod /system/lib/modules/usbserial.ko
insmod /system/lib/modules/pl2303.ko
getty -n -l ash 115200 /dev/ttyUSB0

こんなスクリプトを起動時に呼び出すことで、PCのCOMポートからコマンドが入力できるようになった。
やはりTeraTermがないと私はやっていけない体になったようだ・・・。

Android Platform Developer's Guide

AndroidのPlatformをDevelopする人々のためのGuideというドキュメントがあるらしい。

略してPDK。

gitでAndroidのソース一式は落としてきたのだが、ない。
make docsとしても、できないみたい。

どうにかしてオンライン版が見つかったのはよかったが、オフラインで見たい。
URLに「online-pdk」とあるから、offline版もありそうなんだがなぁ。

実家に帰るのだけど、ネットがないので見られないのだ。

2009/12/28

[Q5]フレームバッファか?

私はもう、年末モード。
明日は病院周りやら何やら、平日ではできなかったことをして終わる予定。
ああ、beagleboardも受け取らねば。
そして、実家に帰る。

そのため、あまり今日は作業を進められない。
忘れないように、推測記事を書いておこう。

そう、あくまで推測。


フレームバッファ?

zygoteの話は前回したが、あれを有効にするとしばらくしたらLCDが消灯する。
それ以降、USBキーボードからの制御も受け付けなくなるのだが、あれは誰かがI/Oを制御するために奪い取られているのではないか?
そして、LCDが消えるのはフレームバッファの制御がそこに移ったからではないか?

Covia版Androidを動かしたとき、frame bufferは2面くらいあった。
たぶん、2面。
ダブルバッファには方式があるのかもしれないが、私が知っているのはこうだ。

  • 最初に、VRAMを2面用意する
  • 片方をアクティブ、片方を非アクティブと決める。
  • 画面に表示させたい場合は、まず非アクティブ側に書き込む
  • 書き終わったら、アクティブと非アクティブを入れ替える
  • これを繰り返す

入れ替えるのは、表示先ポインタをずらすだけなので、一瞬で済む。
表示先ポインタのデータを読み取ってLCDに表示させる人が、またいる。
水平同期のタイミングなんかもうまく計算してくれる、賢い人だ。

SmartQ5のCovia版では、/dev/graphics/fb0を使っていた。
これはAndroidの標準なのだろうか・・・


そういえば、話は脱線するが、文字はどのように表示させているのだろうか。
文字だろうと何だろうと、LCDに表示させるものは全部グラフィックである。
CRAMみたいなものがないのなら、ソフトでVRAMに展開している処理があるはず。

今の動きを見ていると、kernel起動時から出てきているので、kernelがうまくさばいているのか。
うーむ、気になる気になる・・・


というところで、検索が終わった。
'/dev/graphics/fb0'で検索してみたのだ。
ふむ、それっぽいところが出てきた。

system\extras\tests\framebuffer\fb_test.c(61):
fd = open("/dev/graphics/fb0", O_RDWR);
system\extras\tests\framebuffer\fb_test.c(63):
printf("cannot open /dev/graphics/fb0, retrying with /dev/fb0\n");
system\extras\tests\framebuffer\mdp_test.c(100):
*fd = open("/dev/graphics/fb0", O_RDWR);
system\core\toolbox\rotatefb.c(16):
char *fbdev = "/dev/graphics/fb0";
system\core\init\logo.c(56):
fb->fd = open("/dev/graphics/fb0", O_RDWR);
system\core\adb\framebuffer_service.c(61):
fb = open("/dev/graphics/fb0", O_RDONLY);
development\simulator\wrapsim\FakeDev.c(62):
{ "/dev/graphics/fb0", wsOpenDevFb },
bootable\recovery\minui\graphics.c(60): fd = open("/dev/graphics/fb0", O_RDWR);

くくくっ、出てきた出てきた。

fb_test.cは、文字通りテスト用なのだろう。
mdp_test.cは気になるが、testって書いてあるし。
rotatefb.cは、回転系だろう。
framebuffer_service.cは、おおっ、と思ったが、adbだな。
スクリーンショットの撮影用か?
FakeDev.cは偽物っぽいし。

うーん、はずれなのかなぁ。
もう少し、dmesgではないログが必要だ。
特にzygote以降のログが。
コンソールが使えないのは痛いなぁ。

zygoteをinit.rcで止められない?

前回、init.rcでzygoteを起動しているところを止めれば、コマンドがずっと使える、わーい、と書いた(わーい、は書いてないが)。

しかし、いろいろ試していたのだが、ここで止めてはいけないのではないか?と思うようになった。


service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on

起動は、こんな感じ。

これを手動でapp_processすると、Javaのexceptionが発生する。
ANDROID_SOCKET_zygoteに入っている文字列を数値変換しようとしたけど、文字列が空なので変換できません、というようなやつだ。
ソースを見ていっても、ANDROID_SOCKET_zygoteに代入するような箇所がなく、init.rcにもそんな場所がない。
暫定的に手入力させてみたものの、この数値はファイルディスクリプタを書き込まねばならず、そんな数値は実行時じゃないとわからないと思うのだ。
まさか、ほぼ固定になるから一度実行して値を取ってくる、とかじゃないよな・・・。

などと考えていたけど、上記のオプション行に「socket」がある。
これはソケットの生成だけと思っていたのだが、init.rcの文法書を読むと、そのファイルディスクリプタを起動するアプリに与えるらしい。
つまり・・・その引き渡しにANDROID_SOCKET_zygoteが使われているということか。
そうなのだろう。

そういうことから考えて、zygoteをinit.rcで止めて手動で動かしてみる、というのは無理な気がしている。
そんなことに気付くまで、あれからこの時間までかかっているのだ。
ああ、なんか最近まぬけになってきたなぁ。。。


というわけで、また同じ地点まで戻ってきた。

2009/12/27

Androidの自動起動を止める

SmartQ5に、AOSPからダウンロードしたソースを自分でビルドして動かしたいと考えている。
まあ、ビルドするのは自分だが、解決は自分だけではできないと思うので、いろいろな先人の知識を役立てたい。

役立てたいのだが「こちらに既に動くものを用意しました」では面白くないので、苦しみつつもなるべく標準のものを使おうという魂胆だ。


困っていたのは、最後は画面が消えて終わってしまうこと。
数十秒はUSBキーボードからコマンドを入力することができるのだが、そこから何もできなくなるので、急いでSDカードにログなどを書き込み、PCでログを見て推測する、ということを繰り返していた。

が、さすがにそんなやり方はいつまでも通用しない。
何をしていいのかわからない状況にまで陥ってしまった。

そんなときに、またしても先人の知恵が役に立った。
実機でGoogle Android」(PDF)という資料だ。
これによると、zygoteというところを止めると、自動起動しなくなるらしい。
init.rcのapp_processがそれっぽいのでコメントアウトしたところ、コマンドがずっと使えるようになった。
やった!

そして続きの情報も役に立った。
ここから手でコマンドをうちながら進めていき、動かないところを1つずつ動くようにしていくというものだ。
よく考えればそういう方法に落ち着くしかなさそうだけど、今までは推測だけでやっていたので、順番に起動させていくということに思い至らなかったのだ。
「スクリプトに書いたコマンドは全部動いているから、最後までいってるんだろう」くらい。

さっそく手入力でapp_processを実行すると、javaの例外エラーが出た。
java!
もうjavaが動いているんだ。
昔、200MHzくらいの組込みCPUでPersonalJavaを動かしたときには、グラフィック(AWT)とか使っていたせいもあるけど、起動するまでに数分かかっていたのだ。
それから考えると、時代は進んだなぁ。
まあ、あれから8年くらい経っているからなぁ。。。。

[Q5]当たり前の違い

昨日は、標準Androidとはやはり違うねー、という話をした。
が、さらに違うところがあった。

当たり前だけど、デバイスが違うのだな。
/devの中身が少ない。
そういえば、ちらっと起動時のアニメーションが表示される前に「audio」がどうのこうのってログが出ていたな。

/devは、普通のLinuxなら起動前からある。
あるというか、インストール時にHDDなどに準備しておく。
Androidではそれをinitで作成する。
system\core\init\devices.cでやっているようだ。
ここに、Covia版の/devを見ながら追加していけばいいのだが、数が多いのでめんどくさい。

今回は、Covia版/devをtarで固めてSDカードにコピーし、それをhost側に持っていってinitramfsにあらかじめ含めておくことにした。
あまりinitramfsを大きくしたくはないのだがね。


ひとまず、これで起動した。

  • Covia版カーネル
  • Covia版/init.rc
  • Covia版/init.smdk6410.rc
  • Covia版init.smdk4610.sh
  • Covia版/system
  • Covia版/data
  • 自作/init

まずは第一段階突破というところか。

次は、/systemと/dataの置き換えか。
これは敷居が高そうだ・・・。

2009/12/26

[Q5]標準Androidとの違い

Coviaさんのkernelを使いつつ、標準Androidを自分でビルドして動かしたいと考えている。

なかなか、難しい。
というよりも、まだ動いてない。
だからこそ、書くべきであろう。


まず、標準Androidとここで書いているものは何かというと、AOSP、Android Open Source Projectの提供するソースファイルを指す。
以前書いたQdroidというものもあるが、ここはやはり標準Androidから動かすようにしたい。
理由は、めんどくさいから。
Qdroidは動くことがわかっているのだが、何かしたいとなると標準から差が出ることであろう。
そうなると、Qdroidの情報を集めなくてはならない。
しかしQdroidはSmartQ専用なので、情報が少なさそうだ(なんとなく)。
それならいっそのこと、最初からやった方が早いんではなかろうか。

そうじゃないかもしれないけど、やはり根幹から知りたいという気持ちは捨てられない。
動かないものを動くようにすることこそ、楽しいのではなかろうか。
楽しいはずだ!


とにかくよくわかっていないので、Covia版と同じような構成で動かしていたが、いくつか私の認識違いがあることがわかった。

まず、init.rcとinit.{ターゲット名}.rcは/system以下にあるのが標準。
Covia版はルートにあるのだ。
実は、ここに気付いたのは一番最後である。
それまでは、何かわからんけど画面に何も出ないねー、だった。

system/core/initにあるソースファイルを見て、幾分わかってきた。
initは一番最初に動くプロセスだけど、この中でeventloopのようなことをやっているのだな。
つまり、initプロセスは最後に無限ループして終わる。
for(; _ ;)・・・違った、for(; ;)している箇所が、それに当たると思われる。

んで、/systemのinit.rcを参照していると知らずにやっていた頃は、最後は何も動作せずに終わっていたのだが、参照先を正しくしたところ、シェルが起動して終わるようになった。
その後、少ししたら終了してしまうのだがね。

これからは、なぜシェルが起動してしまうのかというところから調べねばならぬ。


とにかくまぁ、調べる先が見つかるのは楽しい。
見つからないのも、また楽しい。
まだ行き詰まってないからそう思うんだろうけどね-。


今のところ、

・Coviaのinit、Coviaのinit.rc、Coviaのinit.smdk6410.rc、のセットでは起動する
・自前のinit、Coviaのinit.rc、Coviaのinit.smdk6410.rcのセットでは起動画面から進まない

というところまで判明。
initか・・・。
rcファイルは最後まで実行しているようなので、adbdやtelnetdは起動していると思われる。
wifi設定ができていないので、adbdが使えるか試してみるか。
ログが確認できなくては、次の方針が決められん。
明日は、どっちだ。

2009/12/25

[Q5]Qdroid

さて、UIだけ取り替えて遊んでみよう、と思い立って始めたSmartQ5のAndroid SD化。
SDカードで動いたので、後は遊ぶだけ!と思ったら、そうはいかなかった。

だって、ビルドしたUIを動かさなくてはならないのだから。
正直なところ、こんな順序でやれば終わると思っていた。

  1. SDカードでCoviaさんのAndroidを動かす
  2. Android(オリジナル)をビルドして差し替える

やってみたが、init後、すぐにシェルみたいなのが動いて、それ以上進まない。
USBキーボードでLinuxのコマンドは打てるのだが、30秒もすると落ちてしまう。
うーん・・・安易すぎたか・・・


SmartQシリーズで動くAndroidとして、Qdroidというものがある。
これは、有志の方々がやってるものみたい。

patchがあったので、gitで落としてきて、今のAndroidソースに組み込んだのだが、これはビルドが通らない。
libaudio関係がmakeできないみたい。
さて、どうしたものか。

たぶん、UIを入れ替えると言うだけの目的なら、goldfishでやるのが一番だろう。
なんといっても、ビルドして動かせるのだから。
でもなー、それだと寂しいなぁ。。。

まあ、年末に考えるか。

2009/12/23

[BB]ダウンロード

BeagleBoardはまだないが、準備くらいしておこう。
まあ、到着するのは暖かくなってからだろうが・・・

labs@embinux.orgを見ながらやっている。
Current Projectsに「Introduction」「Android Porting Guide to Beagle Board」があるので、まずはPortingを見てみた。
なぜIntroductionを見なかったかというと・・・見逃しだ。

新しもの好きなので、Eclair版を見てみる。
まずはソースのダウンロードだ。
gitというかrepoを使うので、そのままやってみると・・・失敗。
しばらく進むのだけど、ぷちぷち切れる。
十回くらいやってみたがだめだったので、Android福岡MLに投げてみると、実際にやってみた勉強会資料を教えてもらった。

うん、gitのサイトは同じだし、見ているところも同じらしい。
がんばると、何十回か繰り返すと、ようやくできた。
2日かかったけどね。


makeも終わったけど・・・out\target\product\generic\dataが空っぽなのはいいの?
それよりも、goldfishになってるけどいいの??

/init.XXX.rcのXXXは、どこかで機種名を入れることになっている。
どこかというと・・・/proc/cpuinfoからとってきているようだ。
(system/core/init/init.cより)

では、/proc/cpuinfoはどこから情報を取ってくるのだ?


そこはひとまずおいて、Introductionに気付いたのでやってみる。

source.android.comからrepoでplatform/manifest.gitを落としてきて、prebuildの下を置き換えるのか。
めんどくさいが、仕方ない。

と思ってダウンロードを始めたけど、よく考えてみよ。
この作業をやったものが、さっきrepoでembinux.orgからダウンロードしたものではないのか?
そうでないと、話があわないよな??


まあ、ぼちぼちやりますかな。

2009/12/20

[Q5]やってしまった・・・

SmartQ5に、Covia版kernel(Coviaインストール用ではなく)を使いつつSDカードから起動させる、という道を探して早2ヶ月。
いろいろと勉強にはなったが、一つのことが壁になっている。

それは、SDカードから起動するためにmenu.lstにinitramfsを指定するのだが、読み込まずに電源OFFとなってしまうこと。

なぜだ?

カーネルを読み込んだ後にinitramfsを処理するとばかり思っていたのだがそれより前にOFFとなっているように見える。
うーん・・・

initramfsは、cpioしたものをgzipで固めたものだと思っている。
でも、ここは組込みだからそれだけではだめなのかも。
u-bootでは、mkimageというコマンドを使って64byteのヘッダを付けているようである。
それがないとだめ?

試しに作ってみようとしたのだが、mkimageには引数としてタイプが必要になる。
それがどれになるかわからん・・・。

$ mkimage -A arm -O linux -T ramdisk -C gzip -n 'initramfs' -d initramfs.gz initrd
Image Name: initramfs
Created: Sun Dec 20 23:35:31 2009
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 60517350 Bytes = 59098.97 kB = 57.71 MB
Load Address: 0x00000000
Entry Point: 0x00000000

いいのかなぁ。

あ、これで試すと電源がOFFにならない!

init.rcの中でmountする処理を外してやってみると・・・
いろいろと起動時に見つからないってメッセージが!

これはとうとう、来たのではないか?

寝ようかと思ったけど、これはSDブートによるAndroid起動までやらねば!!


まず、SDのパーティションを考え直さないと。
initrd.igzには、/に置くものだけにしよう。

  • /init
  • /init.rc
  • /init.smdk6410.rc

mmcblk0を見ているところを、mmcblk1にする。
/systemと/dataが該当するので、SDのパーティションも彼ら用に用意。
/system/etc/にswapを設定するスクリプトがあるので、書き換え。


ようやく成功!!

# dmesg
30
<6>fb0: s3cfb frame buffer device
<6>mice: PS/2 mouse device common for all mice
<6>S3C Touchscreen driver, (c) 2008 Samsung Electronics
<6>S3C TouchScreen got loaded successfully : 12 bits
<6>input: S3C TouchScreen as /devices/virtual/input/input0
<6>s3c-uart.0: s3c_serial0 at MMIO 0x7f005000 (irq = 37) is a S3C
<6>s3c-uart.1: s3c_serial1 at MMIO 0x7f005400 (irq = 38) is a S3C
<6>s3c-uart.2: s3c_serial2 at MMIO 0x7f005800 (irq = 39) is a S3C
<6>s3c-uart.3: s3c_serial3 at MMIO 0x7f005c00 (irq = 40) is a S3C
<4>RAMDISK driver initialized: 2 RAM disks of 8192K size 1024 blocksize
<6>loop: module loaded
<6>logger: created 64K log 'log_main'
<6>logger: created 256K log 'log_events'
<6>logger: created 64K log 'log_radio'
<6>PPP generic driver version 2.4.2
<6>PPP Deflate Compression module registered
<6>PPP BSD Compression module registered
<6>PPP MPPE Compression module registered
<6>NET: Registered protocol family 24
<6>tun: Universal TUN/TAP device driver, 1.6
<6>tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
<6>8686 sdio: sd 8686 driver
<6>8686 sdio: Copyright HHCN 2009
<6>Linux video capture interface: v2.00
<6>S3C6400 MFC Driver, (c) 2007 Samsung Electronics
<4>S3C6400 MFC driver module init OK.
<6>S3C PostProcessor Driver v3.12, (c) 2009 Samsung Electronics
<6>S3C CMM Driver, (c) 2008 Samsung Electronics
<6>S3C Rotator Driver, (c) 2008 Samsung Electronics
<6>s3c_rotator_probe called
<4>s3c_rotator_probe success
<1>s3c_g2d_probe called
<1> s3c_g2d_probe Success
<4> S3C G2D Init : Done
<4>Driver 'sd' needs updating - please use bus_type methods
<7>ohci_hcd: 2006 August 04 USB 1.1 'Open' Host Controller (OHCI) Driver
<6>s3c2410-ohci s3c2410-ohci: S3C OHCI
<6>s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
<6>s3c2410-ohci s3c2410-ohci: irq 47, io mem 0x74300000
<6>usb usb1: configuration #1 chosen from 1 choice
<6>hub 1-0:1.0: USB hub found
<6>hub 1-0:1.0: 2 ports detected
<6>Initializing USB Mass Storage driver...
<6>usbcore: registered new interface driver usb-storage
<6>USB Mass Storage support registered.
<4>Loaded s3c-udc version Nov 1 2009 (DMA Mode)
<4>S3C24XX RTC, (c) 2004,2006 Simtec Electronics
<6>s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
<6>s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
<6>i2c /dev entries driver
<6>s3c64xx-i2c s3c64xx-i2c.0: slave address 0x10
<6>s3c64xx-i2c s3c64xx-i2c.0: bus frequency set to 377 KHz
<6>s3c64xx-i2c s3c64xx-i2c.0: i2c-0: S3C64XX I2C adapter
<6>s3c64xx-i2c s3c64xx-i2c.1: slave address 0x10
<6>s3c64xx-i2c s3c64xx-i2c.1: bus frequency set to 377 KHz
<6>s3c64xx-i2c s3c64xx-i2c.1: i2c-1: S3C64XX I2C adapter
<6>SmartQ 5 battery driver v0.21
<6>S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
<6>s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
<6>Bluetooth: Virtual HCI driver ver 1.2
<6>Bluetooth: HCI UART driver ver 2.2
<6>Bluetooth: HCI H4 protocol initialized
<6>Bluetooth: HCI BCSP protocol initialized
<6>Bluetooth: HCILL protocol initialized
<6>Bluetooth: Broadcom Blutonium firmware driver ver 1.2
<6>usbcore: registered new interface driver bcm203x
<6>Bluetooth: Digianswer Bluetooth USB driver ver 0.10
<6>usbcore: registered new interface driver bpa10x
<6>Bluetooth: BlueFRITZ! USB driver ver 1.2
<6>usbcore: registered new interface driver bfusb
<6>Bluetooth: Generic Bluetooth USB driver ver 0.6
<6>usbcore: registered new interface driver btusb
<6>Bluetooth: Generic Bluetooth SDIO driver ver 0.1
<6>[s3c_hsmmc_probe]: s3c-hsmmc.1: at 0xc9000000 with irq 57. clk src: sclk_DOUTmpll_mmc1
<4>s3c-hsmmc: card inserted.
<6>[s3c_hsmmc_probe]: s3c-hsmmc.0: at 0xc9200000 with irq 56. clk src: sclk_DOUTmpll_mmc0
<6>[s3c_hsmmc_probe]: s3c-hsmmc.2: at 0xc9400000 with irq 49. clk src: sclk_DOUTmpll_mmc2
<6>usbcore: registered new interface driver hiddev
<6>usbcore: registered new interface driver usbhid
<6>drivers/hid/usbhid/hid-core.c: v2.6:USB HID core driver
<6>Advanced Linux Sound Architecture Driver Version 1.0.15 (Tue Nov 20 19:16:42 2007 UTC).
<6>ASoC version 0.13.1
<6>WM8987: Audio Codec Driver v0.12
<4>mmc0: host does not support reading read-only switch. assuming write-enable.
<6>mmc0: new high speed SD card at address d555
<6>mmcblk0: mmc0:d555 ST01G 1003264KiB
<6> mmcblk0: p1 p2 p3
<6>asoc: WM8987 <-> s3c-i2s mapping ok
<6>mmc2: new SDIO card at address 0001
<6>Proc-FS interface for audio codec
<6>ALSA device list:
<6> #0: smdk6400 (WM8987)
<6>TCP cubic registered
<6>NET: Registered protocol family 1
<6>NET: Registered protocol family 17
<6>Bluetooth: L2CAP ver 2.9
<6>Bluetooth: L2CAP socket layer initialized
<6>Bluetooth: SCO (Voice Link) ver 0.5
<6>Bluetooth: SCO socket layer initialized
<6>Bluetooth: RFCOMM socket layer initialized
<6>Bluetooth: RFCOMM TTY layer initialized
<6>Bluetooth: RFCOMM ver 1.8
<6>Bluetooth: BNEP (Ethernet Emulation) ver 1.2
<6>Bluetooth: BNEP filters: protocol multicast
<6>Bluetooth: HIDP (Human Interface Emulation) ver 1.2
<6>ieee80211: 802.11 data/management/control stack, git-1.1.13
<6>ieee80211: Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com>
<7>ieee80211_crypt: registered algorithm 'NULL'
<7>ieee80211_crypt: registered algorithm 'WEP'
<7>ieee80211_crypt: registered algorithm 'CCMP'
<7>ieee80211_crypt: registered algorithm 'TKIP'
<6>VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
<6>input: gpio-keys as /devices/platform/gpio-keys.0/input/input1
<6>input: gpio-keys as /devices/platform/gpio-keys.1/input/input2
<6>s3c2410-rtc s3c2410-rtc: setting system clock to 2009-12-20 04:06:34 UTC (1261281994)
<6>Freeing init memory: 192K
<4>Warning: unable to open an initial console.
<3>Trying to vfree() bad address (c0389570)
<3>Trying to vfree() bad address (c036b01c)
<4>mmc1: host does not support reading read-only switch. assuming write-enable.
<6>mmc1: new high speed SDHC card at address b368
<6>mmcblk1: mmc1:b368 SD 15693824KiB
<6> mmcblk1: p1 p2 p3 p4
<3>init: cannot open '/initlogo.rle'
<6>kjournald starting. Commit interval 5 seconds
<6>EXT3 FS on mmcblk1p3, internal journal
<6>EXT3-fs: mounted filesystem with ordered data mode.
<6>kjournald starting. Commit interval 5 seconds
<6>EXT3 FS on mmcblk1p4, internal journal
<6>EXT3-fs: recovery complete.
<6>EXT3-fs: mounted filesystem with ordered data mode.
<3>init: cannot find '/system/bin/playmp3', disabling 'bootsound'
<6>Adding 379752k swap on /dev/block/mmcblk1p2. Priority:-1 extents:1 across:379752k
<6>usb 1-2: new low speed USB device using s3c2410-ohci and address 2
<6>usb 1-2: configuration #1 chosen from 1 choice
<6>input: USB Keyboard as /devices/platform/s3c2410-ohci/usb1/1-2/1-2:1.0/input/input3
<6>input,hidraw0: USB HID v1.10 Keyboard [ USB Keyboard] on usb-s3c24xx-2
<6>input: USB Keyboard as /devices/platform/s3c2410-ohci/usb1/1-2/1-2:1.1/input/input4
<6>input,hidraw1: USB HID v1.10 Device [ USB Keyboard] on usb-s3c24xx-2
<6>usbcore: registered new interface driver usbserial
<6>drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
<6>usbcore: registered new interface driver usbserial_generic
<6>drivers/usb/serial/usb-serial.c: USB Serial Driver core
<6>drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303
<6>usbcore: registered new interface driver pl2303
<6>drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driver
<6>binder: release 676:676 transaction 11398 out, still active
<6>binder: 631:702 transaction failed 29189, size 4-0
<6>binder: send failed reply for transaction 11398, target dead
<6>binder: release 1093:1115 transaction 13140 in, still active
<6>binder: send failed reply for transaction 13140 to 1087:1116
<6>binder: release 1151:1156 transaction 14176 in, still active
<6>binder: send failed reply for transaction 14176 to 631:650
<6>binder: release 1151:1158 transaction 14197 out, still active
<6>binder: release 1119:1125 transaction 14197 in, still active
<6>binder: send failed reply for transaction 14197, target dead
<6>binder: release 1119:1149 transaction 14209 in, still active
<6>binder: send failed reply for transaction 14209 to 1079:1159
<3>binder: release proc 1175, transaction 23076, not freed

2009/12/15

rootfsに関するある結論

今週からkernelソースを読もう、としていたが、その前に情報が入ってきた。
rootfsを調べるためにだ。

fs/ を見たが、rootfsというファイルシステムはない。
grepすると、ramfsでよくrootfsという文字が出てきた。namespaceも。

そういえばinitramfsというものもあったなぁ、と検索すると・・・

How to use initramfs for root filesystem?

というMLがあった。
そこには、

1. initramfs.img is required to link with kernel image in the stage of kernel build
Using the kernel option CONFIG_INITRAMFS_SOURCE="ramdisk.img"

つまり、kernelのビルド時に組み込んでしまうようだ。
ある程度予測はしていたが、やはり結果がわかると哀しいものだ。
Coviaさんのカーネル内部には手が出せないのよねぇ。


せっかくなので、Android emulatorで使っているramdisk.imgを展開してみることにした。
何事も試してみなくては。

{android-sdk-windows}\add-ons\google_apis-3\images\ramdisk.img

# gzip -dc ramdisk.img > ramdisk
# cpio -idm < ramdisk

おおざっぱには、こんな感じで展開。
あー、見慣れたファイルがありますなぁ。


さて、これからどうするかを考えねば。

menu.lstにinitrd行を書くとすぐに落ちてしまうので、その理由からか?

2009/12/14

[今週]kernelを読もう

いろいろと迷走をしているが、やはりrootfsを何とかしないといかんことがわかった。
わかったというか、そう思い込んだというか。

デバイスドライバとかではなく、initが呼び出される辺りのことなので、これはSH-4にLinuxを移植しようとしたとき(そしてうまくいってない)に見たことがあるので、そこまで大変ではないかもしれない。

大変かもしれない。

Androidって、見れば見るほどLinuxの部分はkernelだけに絞られているようだ。
どこかの資料に、initを起動したらあとはもうアプリだって言ってたような。
確かに、以前組込みLinux製品を作ったときはinit代わりにアプリを起動させるなどしていろいろと省略させていたな。
ああ、あのときにもう少し勉強していれば・・・

2009/12/10

Thanks for your mail !

昨日、メールが来ていた。
というくらい、私に来るメールは少ない。

So cute I wish you would make an English language timer clock with you art.

おお、これはうれしい。
あんな絵でも時間がかかったので100円にしているのだけど、誰も買ってなかったのだ。
そして、今も買っていないんだけどね。

英語版にするってほど、日本語日本語した絵ではないのだけどなぁ。
あれくらいの日本語は、デザインと思ってもいいですよ。

2009/12/05

[Q5]カーネルオプションはあきらめる

私はあまりあきらめがよくない方だ。
が、Covia版のKernel(zImage)を使ってSDカードに置いたAndroidを動作させる方法としてmenu.lstのみで対応するというのはあきらめた。

どうも、Covia版のKernelはrootfsやinitなどを見てくれないようなのだ。
cosoleとかsplashみたいなのは見ているような気がする。
しかし、ubuntu用のparamを指定しても、普通にFLASH側のAndroidが起動している。
惜しいなぁ。

今試しているのは2009/11/01版のzImageだが、12/01版で試す気力はない。
動くといいんだけど、もういいや。。。


さて、あきらめがよくないのはここから。

そもそも何がしたいかというと、自分でビルドしたAndroidOSを動かしたいということにある。
FLASHにあるものには手を付けたくないので、SDカード上でやりたい。
しかしドライバ類はCoviaさんのを使った方がよさそうなので、そうしたい。
なので、カーネルはCovia版を使う。

今の状況で手っ取り早くやりたいなら、FLASH側のinit.rcを書き換えることだろう。
しかしそれをやると、失敗すると起動できなくなってしまう。。。
うーむ。

まだAndroidオリジナルのinit.rcを見たことがなかったので、探す。
mydroid\system\core\rootdir\init.rcにあった。
2.0のと比較しているからかもしれないけど、ちょこちょこ違う。
yaffs2というファイルシステムらしい。
jffs2ってのもあるが、2ってのが流行りなのか?
yaはYahoo!のyaか(違うな)?
そんな細かいところが違うけど、/systemと/dataはマウントしているようだ。

私の場合は、/systemさえSDカード上のものになっていればいい。
/dataは共用しても問題ない。。。はず。まあ、分けてもいいけど。
しかし、init.rcを書き換えてSDカード上のものをマウントするように変更してしまうと、失敗したら起動しなくなってしまう。
それは酒たい。避けたい。

initのソース(mydroid\system\core\init\init.c)を見ると、/init.rcはハードコーディングだ。
その後、/init.%s.rcを解析しているみたい。
使えるキーワードは少ないようだ。
めんどくさいけど、書いておこう。

  • capability
  • chdir
  • chroot
  • class
  • class_start
  • class_stop
  • console
  • chown
  • chmod
  • critical
  • disabled
  • domainname
  • device
  • exec
  • export
  • group
  • hostname
  • ifup
  • insmod
  • import
  • keycodes
  • loglevel
  • mkdir
  • mount
  • on
  • oneshot
  • onrestart
  • restart
  • service
  • setenv
  • setkey
  • setprop
  • setrlimit
  • socket
  • start
  • stop
  • symlink
  • sysclktz
  • trigger
  • user
  • write

(以上、parse.cより)

判断文なんかは使えないみたいね。


では、シェルスクリプトは使えるのだろうか?
本を見てみると、||というのがある。

cmd1 || cmd2

で、cmd1のステータスが0以外ならcmd2を実行する、となるらしい。
ほー。

試したが、Androidのシェルでもできそうだ。
ただ・・・initで動くかどうか・・・

えい。
やってしまえ。

あらー、再起動すると、/init.rcが元に戻ってる・・・。
rwでmountされてるのだけど、誰が戻しているのかしら?
何となく、/の中身が全部消されてから作られているような気がする。

2009/11/29

[Q5]umountするウィジェット

さて、本題のSDカードアンマウントウィジェットだ。


実際のアプリではどうやっているかというと、ソースは「packages\apps\Settings\src\com\android\settings\SdCardSettings.java」にあるようだ。
Windowsで見ているので、デリミタは適当に変換してくれ。
そこで、こんなことをしている。

mMountService.unmountMedia(Environment.getExternalStorageDirectory().toString());

引数は、SDカードをマウントしているパスみたい。
本体はmMountService.unmountMedia()。
mMountServiceは、IMountServiceのインスタンス。
んで、IMountServiceが何かというと・・・「hardware\libhardware_legacy\mount\IMountService.cpp」。
そこで、

remote()->transact(UNMOUNT_MEDIA_TRANSACTION, data, &reply);

などとしていた。
もう、追う気はない・・・。
とにかく、Javaから簡単に呼ぶ手段ではできないようだ。


作戦を変更して、JNIを使うことに。
umount()を呼べば何とかなるんじゃないか?

JNIのインターフェースを作るのは、javahを使うのが楽でいい。
手動でやっていたのだが、間違っていてもわかりにくい。
classファイルを参照しにいくので、先にJava側を実装しておかなくてはならない。
まあ、適当にやっておこう。

javah -classpath bin -d jni jp.justblog.hirokuma.PkgName.ClsName

こんなのをすると、jni/以下にヘッダができるので、それを参考にするとよい。

soファイルはできたのだが、うまくアプリが読んでくれていなかった。
どうも、AndroidManifest.xmlに

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

みたいなものがいるようだ。
やはり、インテントはよく調べねばならんな。

そして結果としては・・・失敗。
まあ、権限がないから無理だよなぁ。
これは予想できていたので、そんなに落胆しない。


で、結局どうしたかというと、以前やったしくみ。
telnetでログインして、umountを実行。
JNIいらんやん!

telnetするということは、SmartQ5専用になってしまうのだな。
他のでもいけるかもしれんが、普通はrootになれないと思う。
fakerootみたいなので、仮のrootになれてもいいのかもしれない。
Binary Hackにfakerootのことも書かれていたので、気が向いたら読もう。


しかし、まだ今ひとつなところは残っている。
umountは成功しているのだが、SDカードを抜くと怒られるのだ。
Android側は、実際にmountしているかどうかではなく、フラグみたいなものを持っているようである。
それに、今のつくりは手抜きをしているので、mountに失敗していてもわからないのだ。
だって、telnetだからエラー判別がめんどくさいし・・・。

とりあえずの目標は達成したからいいけど、格好が悪いから、いつか何とかしてやりたいものだ。

App Widgetを作ってみる

【前置き】

最近の流れを見てもらうとわかるが、カーネルのビルドをしてSDカードからAndroidを起動させようとしている。
SDカードのbootディレクトリにカーネルを置き、menu.lstを編集して、そのSDカードをSmartQ5に挿し、電源を入れるのだ。
そうすると、最初にメニューが出てきてmenu.lstに書いたものが選択でき、起動する。
うまく起動できれば、終わり。

なのだが、うまくいっていない。
今のところ一番多いのが、途中まではうまくいっているが、最後はSDカード側ではなく、FLASH側をマウントしてしまうこと。
そうすると、普通に起動してしまう。

またカーネルを書き換えて同じことを繰り返すのだが、電池でやっているとすぐに終わるので、ACアダプタを挿したままやっている。
そうすると、電源OFF操作で再起動してしまう。
なので、Androidが起動している状態でSDカードを抜き、カーネルを書き換え、また挿し、電源OFF操作をする、ということになる。

ここで気になったのが、起動中にSDカードを抜くということ。
「予期せぬタイミングで抜かれました」みたいなのが出てきて、精神的によろしくない。
アクセスはしていないだろうけど、なんかやだ。
だから、設定アプリから毎回SDカードを抜く操作をしていたけど、めんどくさくなってきた。
これがデスクトップでできればいいのに・・・

【結論】
というわけで、ウィジェットを作って、デスクトップからSDカードのアンマウントをさせようとしたのだ。

長くてすまん。


参考にしたのは、以下のサイト。

敬称略。

デスクトップにアイコンを表示させるのは、すぐできた。
これなら簡単やん、と思ったのもつかの間。
アイコンをクリックして処理をさせるのがよくわからない。。。

そこは、CodeZineさんのところを見ながら、やった。
やったけど、ソースが整理されていて、結局のところはあれこれ試してみないとわからなかった。
まあ、そんなもんだけどさ・・・。


以下は、正しい解決方法かどうかはわからないけど、こうやったら動いたみたい、というところ。
スマートではない気がするので、何か違っているのかも・・・

一番はまったのは、intent-filter。
サンプルソースから、これはいらん、あれもいらんと削っていったのだが、なぜかウィジェットを2つ以上置くと、2つ目以降でクリックイベントを起こすと落ちてしまうのだ。
なぜかわからないが、Uriをそれぞれ指定してやらんといかんみたい。
そのときにスキーマを指定するのだが、AndroidManifest.xmlのintent-filter内に「<data android:scheme>」を指定して、同じ文字列にしなくてはならないみたいだ。
ここら辺は、インテントのことをやってみればいいのか?

このschemeをres/values/strings.xmlに文字列として定義したかったのだが、AndroidManifest.xmlで参照させるとうまくいかなかった。
なんでだろう?
あきらめて、XMLとソースで直書きにした。


それと、<receiver>を複数指定する必要がある、ということ。
Uriを追加したのだからと、receiverに<data android:scheme>を追加したのだが、そうではなかった。
<data android:scheme>を追加したreceiverを追加しなくてはならなかった。

気付かんかったねー。
これも、インテントのことを知らねばならないということか。


あと、アイコンをクリックするたびにトグルっぽいことをさせようとしたけど、staticなメンバ変数ではだめだった。
プリファレンスを作ってデータを保持しなくてはならなかった。
そうなのか・・・。


そんなこんなで、複数のウィジェットを配置しても落ちなくなった。
ただ、エミュレータでばしばしクリックしていると、落ちることがある。
これは・・・そんなもんだと思う。
処理が追いついていないという感じを受けた。
ちゃんとイベントを破棄するしくみを実装しないといかんのかな。

2009/11/27

[Q5]書いてあるとおりにカーネルコンパイル

S3C6410用のカーネルをビルドしなくてはならない。
なぜなら、私が使いたいからだ。

SmartQ5は、SamsungのS3C6410というチップを使っている。
CPUというのかしら。ARM11コアのチップで、構成はよくあるやつだ。
ビデオコントローラとかなんやらかんやらが載っているやつ。

カーネルのソースは、こちらからgitで落としてきた。
やり方は、こちら。「McAfee SiteAdvisor」が黄色になったので、少し注意かも。
それに、やり方は普通なので、そこまで気にしなくてもよいか。。。

いや、気付かない点があったな。

・MakefileのCROSS_COMPILEを直接書き換えておいた方が楽(これは以前もやってたので、まあいい)
・arch/arm/configsの中に、android向けのがある(他のをコピーしてた)
・カーネルオプションはCMDLINEで指定する(忘れてた)

ARMのコンパイラは、以前インストールしていたものがあったので、それを使う。
arm-none-linux-gccみたいなやつだ。
このサイトのどこかでも、Windows版だがインストールしたことがある。
その古めのバージョンをインストールしていたのだ。

make zImageはすぐに終わった。
x86版くらいの覚悟をしていたのだが、少し拍子抜け。

できあがったものは、1.8MBくらい。
前回抽出したzImageと同じくらいだ。

さあ、SmartQ5で起動させてみよう。。。

おお、起動した!

ああ、何かサッカーしている人の画像が出てきた!
でも少しずれてるのは、画面サイズがわからないからか?

あ、止まった・・・・

そんな感じだ。
とりあえず、まったく起動しなかったわけではないので、びっくりだ。
最近のはよくできてるなー


で、私はカーネルのビルドが目的ではなく、CMDLINEを変更したらどこがどう変わるのかを調べて、Covia版zImageの起動後にSDカードをマウントしに行くようにしてもらいたいのだ。

できるかな?
できるかな??
はてはてふむー(はてふむー)

2009/11/23

[Q5]SDカードからAndroidを起動(失敗2)

CoviaのSmartQ5から解凍したzImageを使っても、ドライバがいろいろと違うなどして動作しないものが多い。

ドライバは、ほとんどkernelに組み込まれているようだ(dmesgから見ると)。
だから、/systemとか/dataなんかをマウントしても、もう遅いのだ。
勝負は/initが実行される前に決まっているのだ!


というわけで、SmartQ5を解凍して得られるkernelではない、別のkernelがあるはずだ。
そう思ってみていくと、initramfs.igzというものがあった。
ネットで見ると、「気になるMID --SmartQ--」さんの記事「COVIA版Androidレビュー」のコメントに解凍の仕方が出ていた。

# dd if=initramfs.igz bs=64 skip=1 > initramfs.img.gz
# gzip -d initramfs.img.gz
# mkdir initramfs
# cd initramfs
# cpio -idm < ../initramfs.img

ここからファイルを探して、それっぽさそうなものから何とかkernelっぽいものを引っこ抜いた。
(最後までうまくいってないので、ここは書かない。)


引き抜いたファイルにzimage-cvkkと名前を付け、/bootに置き、menu.lstを変更。

title covia
kernel /boot/zimage-cvkk
param root=/dev/mmcblk1p4 init=/init rootwait
logo /boot/and.bmp4

これを使って起動させると・・・

おっ・・・と思わせるけれど、最後は普通に起動してしまった。
あれれ?


起動時に出てくる画面が違うので、SDカードのkernelは読んでいるのだろうと思う。
思うのだが、確証を得られない。。。
dmesgもほとんど同じだし、何か間違っているのかもしれないという気分は抜けない。

kernelはSDカードのものを読んでいると信じるならば、FLASHと同じように起動するのは、kernelが勝手にFLASHをマウントしにいっているというになる。
Linuxはkernel作成時にパラメータを指定することもできたと思うが、それで実現されているのだろうか。

SDカード側にある/initをリネームしたが、ちゃんと起動できた。
これで、SDカード側は全然見ていないことが確認できた。
ただ、それはinit以降に関してだ。

stringsで見てみたが、mmcblkみたいな文字列はなかった。。。
そうあっさりとはできないということか。
liloでやっているときは、lilo.confに書き込んでいたから、kernelに直接書いてはいなかったということかいな。
うーむ。。。

[Q5]SD起動時の不明点

意外と前回は失敗していないのだが、まあ起動が中途半端と言うことなので失敗にしておこう。
タイトルを書き換えるのも面倒だし。

さて、いくつか不明なところがあるので挙げていこう。


/proc

/procにないものがある。
calibrateなんかそうだ。
これがないので、校正できない。
ちなみに、/system/etc/init.smdk6410.shの中で、

cat /data/system/ts/calibrate > /proc/calibrate

という記述があるので、起動時に校正しているのだと思う。

しかし、/procってどういう動作なのだろう?
使うときは、ファイルシステムとしてマウントしているのだけど。
procfsの資料を探してみるか・・・。


Bluetooth

使えない。
dmesgにも出てこない。
いや、dmesgに出てこないから使えないのか。

デュアルブートでubuntuを動かすときには、kernelオプションを追加するように書かれていた。

param root=/dev/mmcblk1p2 init=/etc/init rootwait splash
  s3cfb.backlight=80 console=ttySAC0,115200 loglevel=6

追加されたのは、splash以降。
ちなみに、covia Androidをsplash付きで起動させると、FLASHから起動させたときのように「android」の文字が光る。


横向きにならない

縦向きのまま起動して、ボタンを長押ししても画面が横向きにならない。
dmesgを見ていると、キー入力は認識している。

<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 158, Value: 1
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 158, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 139, Value: 1
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 139, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 102, Value: 1
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 102, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0

これは、キー3つ分のdmesgだ。
順に「+」「□」「-」。
長押しの場合は別のキーコードが上がってくる。
いや、□キーのときだけ違うようだ。

<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 56, Value: 1
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 56, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0

makeがType 1 で、breakがType 0。まあ、Valueも一緒か。
ちなみに、電源キーを2回押すとこうなった。

<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 116, Value: 1
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 116, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<6>android_power: sleep (0->2) at 9611946564000 (1970-01-01 02:40:11.946568000 UTC)
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 116, Value: 1
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0
<4>android_power_suspend: done
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 1, Code: 116, Value: 0
<7>evbug.c: Event. Dev: gpio-keys/input0, Type: 0, Code: 0, Value: 0

日付の設定をしていないので、1970年になっている。


電池ドライバのバージョン

Covia提供のSmartQ5を解凍させてzImageを取り出したのだが、電池ドライバのバージョンが違う。

こちらは、FLASHから起動させた場合。

<6>SmartQ 5 battery driver v0.21

こちらはSDカードから起動させた場合。

<6>SmartQ 5 battery driver v0.2

うーん。よく見ると、端末情報も違う気がする。

こちらは、FLASHから起動。

カーネルバージョン : 2.6.24.7 JC@coventive CV_0922206-SQ
ビルド番号 : cvkk_smdk6410-eng 1.5 CUPCAKE eng.coventive.20091031.185543test-keys

こちらはSDカードから起動。

カーネルバージョン : 2.6.24.7 root@localhost #4
ビルド番号 : cvkk_smdk6410-eng 1.5 CUPCAKE eng.coventive.20091031.185543test-keys

カーネルバージョンが違うなぁ。
zImageではないということか?

秋は深まり、謎も深まる・・・


あー、なるほど、そういうしくみか・・・

何となくわかったが、これはあまり書くとよろしくなさそうな気がする。
試してうまくいったとしても、報告しづらい。
うまくいかなかったら、報告しよう。

2009/11/22

[Q5]SDカードからAndroidを起動(失敗1)

さて、ここまででSDカードからOSを起動させることができた。
次はAndroid OSだ。

いきなり自分でビルドしたものなど動かせるはずもないので、まずはSmartQ5で動いているCoviaのAndroid OSを動かしてみよう。

タイトルを見てわかるように、失敗してるがね。
連敗が予想されるので、数字まで付けてしまった。


やり方は、前回とほぼ同じ。

  1. SmartQ5ファイルを、解凍ツールで解凍させる。
  2. SDカード上のext3パーティションに解凍する。
    ・rootfs.tar.gz ==> system/
    ・homefs.tar.gz ==> data/
  3. SmartQ5でAndroid OSが起動しているところから、init.rc、init.smdk6410.rc、default.propをルートディレクトリにコピー
  4. init.rcからFLASHをmountしていそうな箇所をコメントアウト。
  5. vfatの/boot/menu.lstを適当に編集

まあ、3と4がかなり適当だからかもしれんが、だめだ。
画面には coviaのスプラッシュ画像が、画面下には何かやってるらしき文字が。


写真を撮ってみたが、よくわからん・・・

mmcblk1: p1 p2 p3 p4 15693824KiB ress b368switch. assuming write-enable.om>07 UTC).

こんな文字列が出て、止まった。
最後の方は、文字が消えていないだけのようだ。


あ、USBケーブルを抜いたら何か変わった!

というわけで、USBケーブルを抜いて再起動。

・・・・やはり止まるな。

Waiting for root device /dev/block/mmcblk1p4...timenput/input2t b rev 5tel.com>07UTC).

どこからかは文字の消え残りだろう。
たぶん、mmkblk1p4... までだろう。

むー、おしい(のか?)。

menu.lstで/dev/block/mmcblk1p4を指定しているので、それを見ている。
だからおそらく、kernelは起動しているだろう。

ということは、initとかか・・・


menu.lstはこんなの。

title covia
kernel /boot/zimage-covia
param root=/dev/block/mmcblk1p4 init=/init rootwait
logo /boot/and.bmp4

title Q5
kernel /boot/zimage-q5v5
param root=/dev/mmcblk1p3 init=/etc/init rootwait splash s3cfb.backlight=80 console=ttySAC0,115200 loglevel=6
logo /boot/ubuntu.bmp4

/dev/block/mmcblk1p4は、/dev/mmcblk1p4でいいのかな?
やってみよう・・・あ、動いた!
こいつ動くぞ(って言った方がいいのかな・・・)!


今のmenu.lstは、こう。

title covia
kernel /boot/zimage-covia
param root=/dev/mmcblk1p4 init=/init rootwait
logo /boot/and.bmp4

title Q5
kernel /boot/zimage-q5v5
param root=/dev/mmcblk1p3 init=/etc/init rootwait splash s3cfb.backlight=80 console=ttySAC0,115200 loglevel=6
logo /boot/ubuntu.bmp4

ext3のルートディレクトリにinit.rcとかしか置いてなかったけど、init本体もあるのに気付いてなかったので、それもコピーした(動いている本体から)。

起動はしたけれど、あれこれ動かない。
まず、横画面にならない。
USB設定がうまくいかないのか、PC側では「新規デバイス」となり、しかも認識してくれない。
タッチパネルの調整アプリは起動するけど、タッチができない。
なので、タッチがちょっとずれてる。
ずれているので、タッチパネルのキーボードが入力しづらい。
代わりにUSBキーボードをつなぎたいが、どの設定にしても認識してくれない。
PCからはinfファイルを変更することでドライバを認識できたけど、adb devicesが動作しないとか。

などなど、動かないところ多数。
なんだろうねぇ。

とりあえずwifiにはつなげてdmsgが取れたから、載せておこう。

dmesg.txt

こっちは、本体で起動したときのもの。

dmesg_OK.txt

オリジナルをオリジナルのままビルド

よくわからないときは、言われたとおりにまずはやってみよう。

Androidを自分でビルドさせて、SmartQ5で動かしたい。
まあ、全部を自分でやる気力はないので、あるものは利用させていただく。

しかしまずは、オリジナルのAndroidをビルドして、エミュレータで動かしてみよう。


ビルドは、Linuxでやる(VMware上)。
Android Open Source Projectに書かれているままに従い、Ubuntuを使う。
そして書かれているままに環境をapt-getし、repoなどでソースをダウンロードし、make。
eclairとかを指定することもできるらしいが、よくわからないので書いてあるままに。
今の最新版はeclairなので、SDK2.0相当のものがビルドされる予定。

昨晩やっていたのだが、終わらなかったのでCtrl+Cで一度終わらせ、今朝再開。
なんか時間がかかったが、まあ終わったのでよかろう。


ビルドすると、out/target/product/genericに、*.imgができている。
これを、エミュレータに持っていけばいいらしい。
エミュレータはWindowsにあるので、まずはファイルをそちらに移動。
(sambaを立てておくとよかろう。)

やり方は、Taosoftwareさんのところを参照(ほぼそのまま)。

エミュレータ側の準備は、そんなに大変ではない。
SDKのフォルダの中にadd-onsがある。その中にあるディレクトリを1つ複製する。
私は、google_apis-5_r01というやつをコピーした。
たぶん最新版をビルドしたので、こっちも最新のものがよかろう。
コピーして、名前をhirokumaに変更。

ビルドしたのは*.imgだけなので、images以外のフォルダは削除(ファイルはいる)。
manifest.iniを開き、編集。

# SDK Add-on Manifest

name=hirokuma
vendor=hirokuma
description=Android + Google APIs with hirokuma

# version of the Android platform on which this add-on is built.
api=5

# revision of the add-on
revision=1

name、vendor、descriptionを適当に書き換え、いらなさそうなものを削除。
ここら辺はまねした。

そして、imagesフォルダの中に、さっきの3つの*.imgを上書き。

以上!


ここから先は、eclipseでやった。
別にeclipseはなくてもいいのだが、Android SDK and AVD Managerの場所を探すのが面倒だったのだ。
Windowsだと、SDKフォルダの中に「SDK Setup.exe」があるので、それでいいみたい。

「Virtual Devices」で「New...」。Targetを見ると。。。

こんな感じで出てくる。
manifest.iniで編集したものでいえば、最初がnameで、括弧内がvendorだろう。
descriptionがどこで使われるのかはわからん。

エミュレータを起動させて、SettingsからAbout Phoneを見ると、こんな感じになっていた。

赤線で消したところは、私の名前が入っていた。
これはUbuntuのログインアカウント名なのだろう。
編集できるのかもしれないが、まあよいではないか、よいではないか。

Model numberのところには、ビルド時に*.imgがgeneric内にできていたので、その名前なのだろう。
まだ何がどことどうつながっているのかはわからん。
わからんが、動いたのはめでたい。
特につまずかなかったので、何となく今後が心配であるが。。。


では、少し寄り道して。

*.imgは何だろう?
fileコマンドで見ると、gzipファイルらしい。
# gzip -d ramdisk.img
gzip: ramdisk.img: unknown suffix -- ignored

なんじゃそりゃー

# mv ramdisk.img ramdisk.gz
# gzip -d ramdisk.gz
#

拡張子を見るのか。。。
標準入力から読み込ませればよかったのかも。

やると、ramdiskというファイルができていた。
(ramdisk.gzはなくなるのね。。。)

# file ramdisk
ramdisk: ASCII cpio archive (SVR4 with no CRC)

cpioって、rpmが使えないところで出てきた記憶がある。
rpmをcpioに変換してからインストールルさせる、というようなのだったか。
とにかく、使い方がよくわからないので、ネットで調べる。

# mkdir tmp
# cd tmp
# cpio -idm < ../ramdisk
# ls
data dev init.goldfish.rc proc sys
default.prop init init.rc sbin system

何となくでディレクトリを作ってみたのだが、正解だった。

# ls
cache
config
d
data
default.prop
dev
etc

init
init.goldfish.rc
init.rc
proc

root
sbin
sdcard
sqlite_stmt_journals
sys
system

では、同じようにsystem.imgとuserdata.imgも展開してみよう。
・・・gzipじゃなかった・・・・・・。

system.img: VMS Alpha executable
userdata.img: VMS Alpha executable

むー。


日本Androidの会にある技術資料「DebianでAndroidをビルドする -lenny編-」を読むと、ビルドはkernelとuserlandに分かれるとのこと。
今私がビルドしたのは、userlandらしい。
つまり、init以降ということかな?

kernelは正直なところ手を付けたくはない。
ドライバはあるものを使えばいいし、insmodできるならそれでもいいのだ。

この資料では、「make ARCH=arm goldfish_defconfig」と書いてあるので、エミュレータのハードウェア環境なのだろう。
私はSmartQ5で動かしたいので、ここのは意味がなかろう。
Samsungのs3c6410のものを公開している人のgitがあったので、そちらを感謝しつつもらってくる。

# git init
# git clone git://github.com/leemgs/samsung-s3c6410-android.1.0.git

repoでもいいのかもしれんけど、よくわからん。

kernelはあまり見る気がないが、ビルドしたくなるかもしれないから置いておこう。

2009/11/15

[Q5]gccのdynamicアプリ (理解)

いろいろ調べて、ドキュメントをちゃんと読んで、ようやく理解した(と思う)。

前回の再掲もして、このページだけ見ればいいようにしておこう。
前のを削除すればいいんだろうけど、調査過程を残しておきたい。

内容は、motz diaryさんとほぼ同じ。
前回もそうしたつもりだったが、理解していなかったのでうまくいかなかったのだ。


gcc

CodeSourceryのサイトから、GNU/Linux版をダウンロードしてインストール。
GNU/Linux版だが、今回はWindowsをホストとして環境を作っていく。


環境

Android用のライブラリを参照できる環境を作る。
まず、Android側のファイルをPCへ移動するための準備。

  1. > adb shell
  2. # cd /data
  3. # tar zcf lib.tgz /system/lib

PC側

  1. どこかディレクトリを用意(私はE:\Prog\android\gccの下に用意した)
  2. 言い忘れていたが、cygwinが入っていた方が便利かも。
  3. $ cd e:/Prog/android/gcc
  4. $ adb pull /data/lib.tgz .
  5. $ tar zxf lib.tgz

main関数を呼び出すstart.c

#include <stdlib.h>

extern int main(int argc, char** argv);

void _start(int argc, char** argv)
{
exit(main(argc, argv));
}

$ arm-none-linux-gnueabi-gcc -c start.c

できた start.o は、毎回リンクすることになるので使いやすい場所に置こう。


LD

Makefileを作るかどうかはまかせるが、あった方が楽だろう。

# arm-none-linux-gnueabi-ld -o hello --entry=_start --dynamic-linker=/system/bin/linker -rpath=/system/lib -rpath=e:/Prog/android/gcc/system/lib -L e:/Prog/android/gcc/system/lib -nostdlib hello.o start.o -lc

変更箇所は赤字にした。

-oの後ろには、生成したいオブジェクト名。つまり実行ファイル名。

-rpathの2つめに、Androidから持ってきたlibを書く。

-Lの後ろに、同じくAndroidから持ってきたlibを書く。


えーっと・・・motz diaryさんと同じことを書いていることがわかると思う・・・

-rpathは、ランタイムライブラリを参照するパスを書く。
実際のアプリはAndroid上で動くので、/system/libを参照しなくてはならない。
これが、1つめのrpath。
このパスだとWindowsではファイルが見つからないため、2つめのrpathでWindowsに置いたAndroidライブラリのパスを指定してやる。
そんだけのことだ。

objdump -xすると、RPATHが出てくる。

Dynamic Section:
NEEDED libc.so
RPATH /system/lib:e:/Prog/android/gcc/system/lib

どこまでがリンクに必要となって、どこまでが実行ファイルに必要となるのか理解せずにやっていたからうまくいかなかったのだ。

これにより、/system/lib/libc.soをいじる必要もなくなるので、精神的にはよろしい。

[Q5]gccのdynamicアプリ (失敗)

まずは、前回の宿題だった、/systemをroではなくrwでマウント。
これは、fstabとかではなく、再マウントするということでやるみたい。

Rooting Android

# mount -o remount,rw -t ext3 /dev/block/mmcblk0p1 /system
# mount
/dev/block/mmcblk0p1 /system ext3 rw,data=ordered 0 0

よし。

# ln -s /system/lib/libc.so /system/lib/libc.so.6


次にgcc。

CodeSourceryのサイトから、GNU/Linux版をダウンロードしてインストール。

現在の最新版を元にして話を書いていく。
なぜかというと、以前のバージョンと動きが違うようだからだ。
動きというか、ライブラリの構成というか。
gcc4.4.1みたいだ。
だからかなぁ。


main関数を呼び出す部分を書く。
crtっぽいところだが、グローバル変数の初期化なんかはこの前でやってくれるのかしら?

#include <stdlib.h>

extern int main(int argc, char** argv);

void _start(int argc, char** argv)
{
exit(main(argc, argv));
}

void __aeabi_unwind_cpp_pr0(void)
{
}

void __aeabi_unwind_cpp_pr1(void)
{
}

内容は、motz diaryさんとほぼ同じ(まねしたのだ)。
下2つの関数を付け加えた。
前回、これのあるライブラリを見つけてたんだけど・・・忘れてしまった。
どうせ大したことないんじゃないの、ということでリンクだけ通すようにした。
これがグローバル変数の初期化などなら困るなぁ。


Makefileを書く。
書かなくてもいい。

# arm-none-linux-gnueabi-ld -o hello --entry=_start --dynamic-linker=/system/bin/linker -rpath=/system/lib hello.o start.o -lc

リンクできる。
hello.oは適当にarm-none-linux-gnueabi-gccなどで。


動かす。

> adb push hello /data
> adb shell
# cd /data
# chmod 0777 hello
# ./hello

動くはず。


さて、ここから下は自分の勉強。

中身のないmain()をコンパイルしたときのnm。

000081f8 t $a
000081d0 t $a
000081b0 t $a
000081c4 t $a
00008258 r $d
0000824c r $d
00008260 r $d
000081c0 t $d
00010278 d _DYNAMIC
00010320 d _GLOBAL_OFFSET_TABLE_
00008224 T __aeabi_unwind_cpp_pr0
00008238 T __aeabi_unwind_cpp_pr1
00010330 A __bss_end__
00010330 A __bss_start
00010330 A __bss_start__
00010330 D __data_start
00010330 A __end__
00008278 A __exidx_end
00008258 A __exidx_start
00010330 A _bss_end__
00010330 A _edata
00010330 A _end
000081f8 T _start
U exit@@GLIBC_2.4
000081d0 T main

まずはnmの見方を。大文字は同じバイナリの中にあり、小文字は外部にある。

T, t : TEXTセクション。コードの部分。
R, r : Read Onlyのデータ領域。
D, d : DATAセクション。初期値ありグローバル変数領域(staticも)。
U : 未定義。

未定義があるのに、いいんだねぇ。
ちなみに、hello.oはこんなもの。

00000000 t $a
00000000 r $d
U __aeabi_unwind_cpp_pr0
00000000 T main

start.oは、こう。

00000000 t $a
00000000 r $d
00000000 r $d
0000002c T __aeabi_unwind_cpp_pr0
00000040 T __aeabi_unwind_cpp_pr1
00000000 T _start
U exit
U main

うーん・・・


ldを変更。

#include <stdlib.h>

extern int main(int argc, char** argv);

void _start(int argc, char** argv)
{
exit(main(argc, argv));
}

# arm-none-linux-gnueabi-ld -o hello --entry=_start --dynamic-linker=/system/bin/linker -rpath=/system/lib hello.o start.o -lc -lgcc_s

不安になったので、nmで調べると、gcc_sというものがあった。
なんだろう、_sって・・・

00008290 t $a
00008248 t $a
0000825c t $a
00008268 t $a
000082c8 r $d
000082bc r $d
000082d0 r $d
00008258 t $d
000102e0 d _DYNAMIC
00010390 d _GLOBAL_OFFSET_TABLE_
U __aeabi_unwind_cpp_pr0@@GCC_3.5
U __aeabi_unwind_cpp_pr1@@GCC_3.5
000103a0 A __bss_end__
000103a0 A __bss_start
000103a0 A __bss_start__
000103a0 D __data_start
000103a0 A __end__
000082e0 A __exidx_end
000082c8 A __exidx_start
000103a0 A _bss_end__
000103a0 A _edata
000103a0 A _end
00008290 T _start
U exit@@GLIBC_2.4
00008268 T main

うーん・・・


何か間違えている・・・

2009/11/14

[Q5]busyboxはない?

ネットで見ていると、Android端末にはbusyboxはデフォルトでは入っていないようだ。
その認識で正しい?

busyboxとtoolboxが同じ位置にいるようだが、toolboxの方がメインみたい。
でも、busyboxの方が見栄えがいいんだよなぁ。
lsだって、普通のlsっぽい出力になるし。

もちろん、busyboxを指定すれば動くんだけど、デフォルトでそうなっている方がやりやすいよな。
/system/sbinにbusyboxがある。
んで、/system/binにlsなどがあるが、そのシンボリックリンクを書き換えなくてはならない。
ならないけど、めんどくさい。

そっか・・・viとかfindとか使えるのは、実はbusyboxが最初から入っているためなのか。
ありがとう、SmartQ5!

ボタンクリック

Androidでボタンクリック処理を書くのは、めんどくさい。
大した量のコードではないのだが、なんで書かないといかんの!という気分になる。

んが(鼻濁音)、SDKの1.6からは簡素化されたらしい。

UI framework changes in Android 1.6

下の方にあるが、XMLに書くとき、ButtonにonClickを記述しておくと、その関数が呼ばれるようになるらしい。
へー。

今のところ1.5ベースで作業していたけど、1.6ベースにしようかしら。

[Q5]USBでデバッグ

SmartQ5のfirmwareがアップデートされた(ずいぶん前だが)。
そういえば、USBでデバッグできるようになったんだなー、と思い、試してみる。

何も考えず、USBのケーブルをPCと直結・・・
何も起きず・・・

はい、設定が必要です。
設定アプリに「Usb Setting」という項目があるので、そこから選択。
ADB mode。
これにすると、上にあるステータスバーに「A」とついたUSBアイコンが出てくる。
HOST modeは、USBメモリっぽく使う場合。
OTG device modeは、今までのようにUSBキーボードなどを使う場合。

再度接続・・・
デバイスドライバを聞かれるので、SDKをインストールした場所にあるusb_driverを選択・・・
選べない・・・

USB機器にはIDがあって、そのIDを調べてからドライバを選択する。
つまり、そのIDが不一致だとドライバはインストールされない。
なので、IDを調べて、デバイスドライバの設定ファイルを書き換えてやらねばならない。
と書いてみたが、ネットで調べて気付く始末。
まだまだ私も青いな。

私はWindowsなので、デバイスマネージャーで調べる。
「詳細」からハードウェアIDを選ぶと、それっぽいのが出てくる。
これをinfファイル(android_winusb.inf)に追加すればよい。
「HTC Dream」とか「HTC Magic」とかが並んでいるところに追加。
私の場合は「USB\Vid_18d1&Pid_dddd」となっていたので、まねしてみる。

%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_DDDD

私のPCは32bit OSなのでGoogle.NTx86に追加しておけばよさそうだけど、不安なのでGoogle.NTamd64にも追加。

もう一度USBデバイスをつなぎ直すなりなんなりすると、インストールできた。


では、コマンドプロンプトから

> adb devices
List of devices attached
0123456789ABCDEF offline

なに?
offline?
kill-serverとstart-serverしても同じ。
動いているなら「device」と出るはずだが・・・

SmartQ5の設定を確認しよう。

  • Usb Setting : ADB mode
  • アプリケーション>開発>USBデバッグ : ON

これくらいしかないよなぁ。。。

やってみたが、こんな感じでやるのがよさそうだ。

  1. アプリケーション>開発の画面を開く
  2. USBデバッグを一度OFFにして、USBケーブルを抜く
  3. USBデバッグをONにして、USBケーブルを挿す

何回かやっていると、devicesの結果がdeviceになる。
私のところだけかなぁ。


eclipseのDDMSで見ているが、エミュレータみたいにプロセスが見えない。
他にもいろいろ見えない。
まあ、File Explorerの結果が見えるだけいいか。
Permissionは先頭にあった方が私には見やすいなぁ。

ああ、DDMSってshellコマンドが入力できないのか・・・。
それくらいは手でやりますかね。

2009/11/11

[Q5]fb0

フレームバッファ。

telnetでログインして、

# cat /dev/graphics/fb0 > fb_data.raw

adb pullでPCに持ってきて、IrfanViewで画像変換。
うーん、あっさり出てきた・・・。

これでわかるのは、SmartQ5の画面向きは横が標準ということ。
だから縦画面はうまくいかないことが多いのだな。

VSYNCがわかれば、動画キャプチャーもできそうな気がする。
わかるのかなぁ。

2009/11/08

[Q5]gccビルドしたアプリ

gccでビルドしたアプリケーションを、SmartQ5で動かしたい。
やりたいのはそれだけ。

が、かなり時間がかかり、そしてうまくいっていないところがある。


CodeSourceryのサイトから、GNU/Linux版をダウンロードしてインストール。
ここにこぎ着ける前は、自前でgccをビルドしていたのだけど、どうにもこうにもうまくいかない。
そういえば、以前はcrtも自分で作るような作業で済んでたけど、今度はシェルから起動するのでcrtの作り方がよくわからん・・・

なので、既にあるものを使う。

使うのだが、使ってからも時間がかかった。
Androidでgccコンパイルするのに、上記のサイトからダウンロードしている例が多かったので私もそうしたのだ。
static版はビルドできて動いたのだ。
が、dynamic版がうまくいかない。
__aeabi_unwind_cpp_pr1がない、と言われるのだ。
まあ、確かにないけど。

参考にしたのは、こちらのここ
コンパイルがどうの、リンクがどうのという説明がないのだ。
Windowsでやっていたからかなぁ、とLinuxでやってみたが、だめ。
あれこれやって、aeabi_unwind_cpp_pr1が入っているライブラリをリンカに指定すればいいことがわかった。

そこまではよい。
やっとdynamicアプリができたのでSmartQ5に持っていったが、今度はランタイムエラー。
libc.so.6がないとかなんとか。
ならば、libc.soをln -sしてやれば解決!

・・・できない・・・。
SmartQ5では、/system/libにlibc.soがあるのだが、/system以下はRead-Onlyでマウントされているのだ。
書き込めんやん・・・
/data/libを-rpathに入れてもだめ。

bionic/linker/linker.c:1581| ERROR: 1305 could not load 'libc.so.6'
bionic/linker/linker.c:1641| ERROR: failed to link ./tst
bionic/linker/linker.c:1741| ERROR: CANNOT LINK EXECUTABLE './tst'

わかってくれないのね・・・。
/system に書き込みできればいいんだけど、fstabがないのでよくわからん。
素直にJNIでやるかなぁ。

[Q5]充電

SmartQ5だが、充電コネクタを挿すと起動する。
終了させても、再起動する。
なぜかというのは、充電のメカニズムについて知る必要がある。

などと偉そうに書いてみたが、記憶を元に書くので、少し胡散臭い。


携帯電話の充電に話を絞る。

充電方法には、

  • 急速充電
  • トリクル充電(trickle charge)

の2つがある。
トリクル、というのは「滴、細い流れ」という意味の英語らしい。
ゆっくり充電する、というところか。

あまり充電されていないときは、ざーっと急速充電し、落ち着いてきたらトリクル充電、という感じだろうか。
充電池というのは、乾燥した部屋の中に置いた湯船みたいなもので、使わなくても放電して減ってしまう。
だから、使いたいときに使えるよう、ちょぼちょぼ足してやらないと行けない。
でも、ざーっとやってしまうと、湯船からあふれてしまう。
充電池の場合は、湯船からあふれると寿命が縮むようだ。

だから、急速充電するか、トリクル充電するか、充電をやめるかというのを監視してやる必要がある。
どうやってやるかはよく知らんが、電圧とか熱を見ているようだ。
それに、充電が完了していなくても、充電池が熱くなっていたら危険なのでやめないといかんし。

そういった監視は、だいたいソフトでやっている。
つまり、充電が始まるとソフトが起動するのだ。
海外では、充電してると電源がOFFにならなかったような気がする。
日本人は気にするから、その部分はソフトでうまく作り込んでやる。
日本向けの携帯電話はその辺があるから、海外メーカーが二の足を踏むんだよなぁ。

ガラパゴスだの何だの言っているけど、完全な世界標準だとつまらんだろうな。
今の日本の携帯電話は、特に否定されるほどの者ではないと思う。
まあ、機能が載りすぎって印象は否めませんがね。

英語の文を読んでみる(SDK Tools)

あまり英語がお好きでない。
読めないんじゃないんだ! 好きでないだけなんだ!
・・・すみません「苦手」なのです。。。

まあ、練習代わりに読んでみよう。


SDK Tools Notes

今の時点では、SDK Tools, Revision 3、が出たところ。
r3?
以前は、1.5r1とか1.6r1とかだったような・・・。

と思ったら、変更になったらしい。
"Download the Android SDK"の青い囲みにある"show more"をクリックすると広がって説明が出てきた。

  • SDKダウンロードパッケージは、最新バージョンのAndroid SDKツールだけです。
  • SDKをインストールしたら、Android SDKとAVD Managerが使えるようになっているので、AVD Managerでいるもの(プラットフォーム、アドオン、ツール、ドキュメントなど)をダウンロードしてください。
  • モジュール方式になりました。アップデートしたいコンポーネントをアップデートでき、アップデートは他の開発環境に影響を与えません。
  • 手短に言うと、この新しいSDKをインストールすると、もうSDKパッケージはダウンロードしなくてよいです。その代わり、SDKやAVD Managerを使って環境をアップデートできます。

こんなところか。
だから今回は、2.0r1、ではないのだな。
私は早速、インストールしていたSDKのディレクトリ名を1.6r1みたいにプラットフォーム依存の名前をやめた。

なお、SDKr3を使う場合は、ADT0.9.4以降とのこと。
Eclipseを使わないなら関係はないだろうが、私はEclipseがないとJavaではソースが書けない・・・。


ここでわかったのは、SDKとプラットフォームは一体ではなく別々なんだ、ということ。
どこまで何が関係しているのかわからないと、気持ちが悪いからなぁ。

2009/11/07

[Q5]FB

今日は、博多千代にあるマルツパーツ館に行ってきた。
どんなものがあるかゆっくり見てたのだけど、客がいなかったからか気にされてしまったようだ。
盗んだりしないから、ゆっくりさせてー。

レジの後ろに商品があると、見るのを躊躇してしまうな。
レジの人が気にしそうだから。
もう少し気楽な感じになってほしいのだが、客が少ないのかなぁ。
カホもマルツもうちから同じくらいの距離なので、どっちに行くか迷うな。
ものは、マルツの方が安いような気がする。


Frame Bufferの略。

以前のLinuxは、画面描画するのにデバイスドライバが必須だったと思う。
まあ、今でもデバイスの機能を引き出したいのならば必要だろう。
が、それだとドライバが出るまでVGAなどの標準でしか使用できずに不便。
ならば、ということでしくみができたんじゃないかと思っている(推測かい)。

認識が正しいかどうかはともかく、私の知っているLinuxのフレームバッファは、VRAMだ。
メモリに書き込めば、デバイスドライバがうまくやってくれて画面に反映される。
メモリマップドであれば、デバイスはメモリ上に展開されるので、同じようなことなのかなぁ。
でも、そうなるとCPUのアドレスバスは画面アクセス時には描画側にとられてしまうことになって、パフォーマンスが落ちるんじゃないの、と気になった。
DMA使ったって、バスが同じなら他のデータが通れないし。
この辺りの知識が弱いんだよなぁ。

推測は飽きただろうので、SmartQ5のdmesgを一部載せよう。


FB1: map_video_memory: clear ff200000:00177000
<4> FB1: map_video_memory: dma=56200000 cpu=ff200000 size=00177000
<4>Console: switching to colour frame buffer device 100x30
<6>fb0: s3cfb frame buffer device

<4>SMDK board LCD Backlight Device Driver (c) 2008 Samsung Electronics
<4>S3C_LCD clock got enabled :: 133.000 Mhz
<6>LCD TYPE :: TD043MTEX will be initialized
<4>Window[0] - FB1: map_video_memory: clear ff200000:00177000
<4> FB1: map_video_memory: dma=56200000 cpu=ff200000 size=00177000

ちなみに、このdmesgはUSBキーボードを挿したり抜いたりしたときにとっただけだ。
何で出てきたり出てこなかったりするんだろう?

Samsungって文字が見えるが、プロセッサとしてSaumungのS3C6400(リンクはPDF)というものを使っている(製品としてはS3C6410のようだ)。

携帯電話向けのプロセッサは、だいたいあれこれ機能が載っている。
グラフィック用の機能も搭載されている。

  • 1/2/4/8bpp palletized or 8/16/24bpp non-palletized color TFT support up to 1024x1024

よくわからん。
とにかく、24bitはパレットじゃないよってことらしい。
まあ、ここらは私にはあまり関係ない。

フレームバッファを使うのは、mmapするものらしい。
サイズは、0x177000。
3で割って、0x7d000。10進で512000。
画面サイズは800x480=384000。

おそらく、1枚(R/G/Bの1つ)512000byteのうち、前半384000byteを使用しているのだろう。
それが3枚ある、と。
ただ、RGBRGBRGB・・・、というパターンもあるから、一概には言えんな。
アクセスする速度を上げるなら、そっちの方がいいのかも。
ならば、3プレーン構成じゃないかも。

まあ、やってみればわかるさ。
たまには調べるばかりではなく、実践しないとね。
最近、手を動かすよりも調べる方に時間を使いすぎている傾向にある。
初心に帰らねば。

toolbox?

久しぶりにandroidの話だ。

telnetでログインし、中身をいろいろ見ていっている。
組込みLinuxはやったことがあるのだが、あのときはLinuxっぽいプロセスやコマンドは全部殺していたので、あまり詳しくない。
悔しいので、Androidで勉強していこう。

んで、lsで見ていったら見慣れないものがあった。
それが、toolbox。
だいたい組込みLinuxだと、busyboxを使う。
busyboxというのは、よく使うコマンドをまとめたコマンドだ。
引数にコマンドを与えると、そのコマンドが動く。

# busybox ls

とか(だと思う。やったことない)。

Cで言うと、
int main(int argc, char* argv[])
のargv[0]を見て処理分岐をするようになっているので、lnでlsとかいう名前にするだけでコマンドが使える。

だが、Androidではtoolboxというものが代わりに使われているようだ。
いや、busyboxもあるのだよ。
あるけれど、toolboxの方がよく使われているみたい。

Androidを解剖(前編) 携帯電話でパソコン並みの機能を実現

にそう書いてあったので、そうなんだろう。
気が向いたら、もう少し調べるのも悪くなかろう。

[Q5]何をしようか

SmartQ5で何をしようか。
今さらながら、そんなことを考えている。

SmartQ5のいいところは、制限が多いところだ。
入力が少ない。
やれることが最初から絞り込まれているので、あれしようこれしよう、で悩むことが少ない。

もうちょっとほしいなー、と思うものはあるのだけど、それはそれだ。
最初に考えていたのは、マイクを使うアプリ。
ほら、DTMFで電話をかけることができるやん。
あれの、データ版。
NFCがないので、もっともNFCっぽい音を使ってみようと思ったのだ。
音響カプラ、と思ってもらってもよいや。
でも、マイクがないので、やめた。
私がDTMFを発することができるようになったら、また考えよう。

あとねー、3軸の加速度センサーがあったらあれこれ、と思ってたが、それもない。
おかげで、悩む必要もなく・・・でいいのかな?

ただ、選択肢がないように見えて、かなり広いところがある。
それが、シリアル通信だ。
USBシリアル変換ケーブルが使えるので、何かUARTで通信できるようになれば通信できるのだ。
UARTなら、なんとかしやすい。
最近は少なくなったとは言え、パソコンにもRS232Cポートを付けることはできる。
自分で作ったデバイスにも、取り付けやすい。

USBはねー、便利なんだけど、デバイスドライバがいるだろうので、私には敷居が高い。
標準デバイスならいいんだろうけど、動かして面白いのは自作だろう。

ってことは、自作しないと、だな。

2009/10/21

慣れてきた

また、Google Checkoutのデポジット振込がだめだった。

あっはっは。
もう、慣れたものだ。

まだUFJは試していないから、それでやってみるか・・・。
三井住友銀行は、さくら銀行時代に口座を作った。
東京三菱UFJ銀行は、三和銀行時代に口座を作った。
もしかして、古い時代に作った口座だとだめだとか??

んなことはないわな。

「待つのに疲れました…」という気分だが、そうもいかん。
地方銀行に変えてみるかなぁ。。。

NFCはやりたいところよな

こんなのがあった。

Android向けNFCプロトコル・スタック

MIFAREとかですかな。
気にはなるが、個人では購入できないチップだろう。

2009/10/17

ttyUSB0もう一度

ttyUSB0がそのままではアクセスできないので、どうしようかと。

いろいろと考えたが、あっさりした方法でやることにした。
PCからはtelnetでログインできるので、Androidアプリからtelnetでログインし、chmodさせることにした。

telnetするソースは、ネットからもらってきて修正した。
localhostでログインして、chmodするだけなので、そんなに難しくはないのだが、書き込んですぐにcloseしていたため、chmodできていないときがあったようだ。
それに気付くのに時間がかかった。
コマンドの終了を待てばいいんだろうけど、めんどうなのでsleepで待たせることにした。

どうにかこうにか、それでできたのでよかろう。


が、これはあぶないよなぁ。

アプリでtelnetできるのだったら、なんでもできてしまう(めんどくさいけど)。
まあ、開発向きだからいいのかな。
携帯電話に搭載されているものでは、そうはいかないだろうし。

androiding now

いや、タイトルに意味はない。
現状報告をしたいだけである。

Androidのことは、あまりやってない。
やったのは、Google Checkoutくらいかしら。
まだまだうまくいかなくてねぇ。

今のメイン作業は、SmartQ5用のBluetooth端末作成作業だ。
うちにはいろいろとあって、Bluetoothのユニットが2つある。
そのうち1つを、雑誌の付録にあったARMボードで動かそうとしている。

以前は動いていたんだけど、動いてたときのソースがなくてねぇ。
しかも、動いていたときからハードを触っていたので、動かないけど理由がわからん。
ハードかもしれんし、ソフトかもしれん。
半田付けが下手だったかも・・・と思うけど、9割方ソフトだな。

まあ、一応はAndroidのことをやっていないというわけではないので、Androidingだ。

2009/10/11

ttyUSB0再び

実家に帰る前にできるかなー、と思っていたが、間に合わなかった。
SmartQ5をUSBシリアルケーブルで接続し、PCと通信したいのだ。

接続

SmartQ5のUSB miniBポートに、USB Aメス-USB Aメスを接続し、その先にUSBシリアルケーブル(PL2303入)を接続し、その先をPCのシリアルポートに接続。

ソフトウェア構成

JNIで/dev/ttyUSB0へのオープン、クローズ、書き込み、読み込みを行い、Androidアプリ側でそれを呼び出す。

JNI

Android NDKに入っていたhello-jniサンプルと、JNI仕様と、Kuro'S RoomさんのJNI実験ページを参照しながら作る。
あんまり特殊なことはやってない。というよりも、JNI自体が特殊だと思うので、よくわからん。
シリアルポートのアクセスについては、実に普通。

Androidアプリ

オープンに成功したら、"ABC"と送信してクローズ。
オープンに失敗したら、ダイアログを出して終了。
そんだけ。

ダイアログ出すだけなのに、なんであんなにコードが面倒なんだろう…
SDK1.5になる前は、なんか楽だったような気がする。

はまったのは、hello-jniサンプルを余り読んでおらず、JNIで作成したライブラリを読み込む部分を作っていなかったこと。
まあ、自業自得ですな・・・

結果!

エミュレータでは、当然ながら動かず。
実機でも動かず・・・


ネットで検索すると、rootになれないとかなんとか、アクセス権が足りないとか何とか。
それは気にしていなかった・・・

一応言い訳しておくと、組込みLinuxでやってたときは rootでばんばん動かしていたのだ。
権限なんて必要ないマシンだったし。

で、/dev/ttyUSB0 を見てみると、「crw- --- ---」と、rootにしか権限がない。
おそらく、Androidアプリはroot権限では動作せず、それに付随するJNIも同じ権限で動くだろう。
よって、/dev/ttyUSB0はオープンできない。
QED

いや、証明を終わらせてどうする。
とにかく動かしてみたいので、chmod 0666してアクセス権を取得。
adb shellやtelnetからだとできるんだよな。

結果!

Androidアプリで書き込んだ文字列が、PC上のターミナルで取得できた。
よかろう。


課題

/dev/ttyUSB0を手動でchmodするのは、なんかいやだ。
いやだけど、ここは手が出せないよな。。。

まあ、こんな使い方をするのは開発側の人間だけだろうけど、ものすごく便利なデバイスができたときに売れないよなぁ。。。
あ、デバイスができても、デバイスドライバが必要になるか・・・

それ以上に困っているのは、うちのSmartQ5でフリッカー入力対応Wnnが動かなくなったことだ。
最初にインストールされていたものを、Android Marketのもので上書きしたのだ。
プリインストールものを上書きするとまずいのかなぁ。。。

2009/10/09

Google Checkoutの謎

Taosoftwareのがくさんのコメントで、日本の口座で問題ないことがわかった。
胡散臭い英語で、Google Checkoutに質問してみました。
前回、日本語はまだって書いてあったからねぇ。

で、今日も2回ほどやってみて、だめ。
寝ようか・・・そう思ったら、返事が返ってきてた。

早い、早いよグーグルの中の人!


で、何かというと・・・

銀行の情報入力で「半角カタカナ」じゃなかったから、銀行側にはじかれていた、ということらしい。

なんと!

半角カタカナって、ネットで使ってはいけないものの上位に位置していると思ったのに。
そういえば、ネットバンキングで振り込むとき、半角カタカナで入力させられたことがあったな・・・
今回もそれだったということか?

とにかくまあ、すっきりしました。
登録はできてないけど。

まだ終わってないけど、いろいろ教えていただいた皆さんに感謝しつつ、今日は寝ます。

再度登録

英語を書くのが面倒だったので、もう一度だけ試すことにした。

登録は、こんな画面。


口座名義には日本語が使えないので、アルファベットで記入。
銀行名も、英語で記入。
でも、今までそれそれでだめだったから、今回はローマ字にしてみた。
そんなんじゃないだろうな・・・

登録すると、こんな画面が出てくる。
気になるのは「タイプ」がnoneになっているところ。
タイプって、アカウントの種類のことかしら??

2009/10/07

デポジットが・・・

Android Marketのために用意したGoogle Checkoutで、またデポジットが振り込まれなかった。
前回は、三井住友銀行。
今回は、東京三菱UFJ銀行。
なんでだめなんだろうねぇ。

2009/10/04

UARTを使うには・・・

SmartQ5では、USBシリアルケーブルが使えるらしい。
つまり、それを使ってシリアル通信ができるということだ。

さて、どうやってそれを使うのだろう?
Javaのときは、javax.commってのがSunから提供されていたのだけど、今度はAndroidだ。
使えないだろう。

telnetでログインすると、/dev/ttyUSB0が見えた。
試しに、FileOutputStreamで/dev/ttyUSB0をオープンしてみたが・・・
やはり、怒られた。
そんなのが許されたら、Java使ってないよな。

JNIでやるしかないのだろうか。
古い組み込み屋さんとしては、まずはシリアルポートを動かしたいものである。

次は、BluetoothのSPPだな。

2009/10/03

SmartQ5

SmartQ5が届いた!
二日酔いだけど、そんなのは気にしていられない。

こんな感じだ。

WiFiもつながったので、安心した。
MACアドレスが本機で表示されないんだよなぁ。不明って出てくる。。。
うちは無線LANはMACアドレスフィルタリングしているので、出てきてほしかった。
あと、SSIDを隠す設定にしてたら、それはだめだった。

ちなみに、付属してきたのは、本体と、充電用のやつと、説明用のB4くらいの用紙1枚。
まあ、これを買う人は使い方もわかってるからってことだろうな。
こういうものを買うのは初めてなので、いろいろと新鮮だ。

2009/09/26

勉強会なるものに参加してみた

そのまま。

福岡でAndroidの勉強会がある、というので飛びついた。
にゃんまげに飛びつく、というCMが一時期あったが、そんな気分だったのだろうか。
今の私にはよくわからない。

ともかくまぁ、勉強会、しかも社外で行われる勉強会、というものに私は惹かれていた。
会社でやると、どうしても上下関係ができてしまう。
上の方が意識していないとしても、やはりそんな雰囲気ができるような気がする。
私がやりたいのは、そんなぬるま湯のようなやつではなく、血で血を洗うような技術の争い、みたいな感じ。
まあ、そこまではやらなくても(やらんが)、技術に上下はないのだから、自分の持つ技術を発揮すればいいのだけど・・・

それについては、後で書こう。
人々に興味がないことは、後に書くものだ。


結論として、「C++はやはりいいよね」ということになった(一部)。
そして、私はその一部であることに誇りを持っている!

といっても、Javaをやらんわけにもいかんので、ちゃんとやりますよ。
ええ、10年前くらいに「Personal Java」の勉強をして以来ですがね。
あのときから比べると、Javaもgenericが使えるようになるなど・・・

いかんいかん、そういう話をするところではなかったな。


勉強会自体のことを少し書こう(少しかい・・・)。

初めてそういうのに参加したので、意表を突かれたのが「名刺交換」だ。
普段の仕事では、配るとしても最高で5人くらい。
まあ、普段の仕事では、配ることがないけど。

そういえば、いろいろな分野の人が集まっていた。
私は一応組み込み屋さん、ということにしているが、Web屋さんも多かった。
なんとなく、Androidの勉強会というのは、Androidアプリを作るんだ、と思っていたので、斬新だった。
特に、Androidアプリでなくても、WebkitブラウザなんだからWebでもできるよ、というところ。
ほほー、と目から鱗が落ちる音がはらはらとしていた。
(目から鱗が落ちる、というのは聖書から来た言葉らしい。なぜか先週調べた。)

あとは、Open Space Technologyという技を使ってミーティング。
詳細は調べてほしいが、OpenなSpaceを使うTechnologyだ。
私は、
 ・Androidアプリで対価を得るには(もうけよう)
 ・Androidアプリと家電
に参加。
私の視点からすると、Android OSって単なるOSだから、それを与えられたハードウェアに載せるからあとはがんばってねー、みたいな気持ちがあった。
けど、それでは当たり前だけど視点が足りないわな・・・。
勉強になりました。


勉強会は、こんなところで。
あとは議事録を見てくだされ。

JavaだのC++だのは・・・また機会があれば。ぜひ(姉妹サイトに書くかな…)。

2009/09/24

Google Checkoutのデポジット

日本でも、Androidアプリが販売できるようになった。
Google Checkoutなるものを使うらしい。

Android Marketのアカウント登録の際に使ったので、お金を払う方はわかった。
問題は、お金をもらう方だ。

もちろん、今すぐに売り物になるようなものが作れるとはとても思わない。
買って24時間以内ならば、1回は払い戻しができるということからすると、私みたいなちょっと見て満足するようなアプリでは売り物にならないだろうと思う。

が、準備くらいしてもいいではないか。

というわけで、販売側の準備をしている。


登録する際、銀行の口座名を書かねばならない。
振り込んでくれるのだから、そうだろう。
が、その記入が英語表記にしなくてはならんようなのだ。
銀行名だけとはいえ、英語表記がよくわからん・・・
私は三井住友銀行にしたので、ホームページに書いてあった「Sumitomo Mitsui Banking」と入力してみた。
これでわかってくれるよなぁ・・・。

確認が取れると、その銀行に振り込みがあるらしい。
それを「デポジット」と呼ぶようだ。
その額をGoogle Checkoutに書き込むと、登録完了だ。

そのデポジット振込が、まだない・・・。
最大5営業日ということで、明日が5日目に当たる。
情報の入力をし損なっているところがあるのかなぁ。

ネットドラゴン?

ケサロニケ人・・・ではないが、英語の人からメールが来ていた。
あまり長くないので、そのまま載せよう。
Subjectは「request for permission from ND CO.」。
ちなみに、メールに出てくる「IKAKU! SYAA!!」は、私がAndroid Marketにアップしたアプリである。


Hello,

This is Anita from NetDragon Websoft Inc. (China). We saw your android application - "IKAKU! SYAA!!" on Android Market.

It is a very nice application for Android, so we hope to get your permission to localize (if necessary) and introduce it

to the Chinese users through our android site-http://android.sj.91.com and other distribution platforms.

Our company is one of the leading online game developers and operators in the PRC.

Besides the online game business, we have been extending our business into wireless enterprise and smart phones.

Here is the Chinese website of our company: http://www.nd.com.cn, and the English website: http://ir.netdragon.us.

Currently, our charging system is under construction, so we can only provide this free service to translate (if necessary)

and distribute free or trial versions. If you have other apps and want to translate them into Chinese, we would love to help, too.

Anyway, if you are interested, or have any questions, please let me know.

2009-08-05

Thanks & Best Regards,

Anita


何も読まずに、自分のアプリ名だけ見たときは「おっ、ユーザから反響があったのかな?」だった。
嬉しかったのだが・・・その喜びは続かなかった。

あのアプリを使ってみたらわかるけど「 to localize (if necessary)」はないだろう。
この時点で、適当に送ってきたことがわかる。
いや、ボタンが2つあるから、翻訳が必要と言われれば、全くないとは言わないのだが。。。

2009/09/23

UnitTestを追加してみる

単体テストをしたくなることもあろう。
そういうときには、JUnit。

と書いてみたが、使ったことはない・・・。
eclipseでなるべくやってみよう。


新規プロジェクト作成。これはテスト対象のプロジェクト。
デフォルトのまま使うことにする。

ここでNextを押すと・・・
左上に、「Create a Test Project」が出てくる。
が、今回は「後から追加する」イメージでやってみる。

Finishすると、eclipseのプロジェクト画面に戻る。
赤いマークがでているのは、genディレクトリ以下が見つからなかったためだろう。
自動ビルドにてgen以下を生成してくれるので、実は問題ないのだが、気になる。
これは、プロジェクトのPropertiesを開いて、OKすると消える(プロジェクト名を右クリックして出てくるコンテキストメニューの一番下にある)。
F5で更新しても消えなかったから、何か更新する必要があるということか。
よくわからん。

左側のプロジェクト(パッケージ?)をマウスで選んで右クリック。
下の方に「Android Tools」があるので、開く。
開くと「New Test Project...」があるので、選択。

ダイアログが出てくる。
ここで「Test Target」を選ぶと、他の空欄を埋めてくれる。
「This project」でもよさそうな気はするのだが、Browseから選ばないとうまくいかないように見える。

Finishすると、プロジェクトが追加される。
さっきと同じく赤いマークがついているのが気にくわないが、今回はPropertiesでやることがあるので、それで解決できるだろう。

・・・と思ったら、自動でそこまでやっていた。
生成したテスト用プロジェクトのPropertiesを選び、「Java Build Path」を選択。
タブの「Projects」を選び、ここにテスト対象のプロジェクトを追加する必要があるのだ。
あるのだけど、やってくれるのね。。。

さて、ここまでは何とかなる。
問題はここからだ。

Androidのサンプルにはtestsの下にテストが書いてあるので、まねをしよう。
まねをするだけなのだが、ApiDemosとHelloActivityでは作りが違う。
ApiDemosにはAllTestsがあるのだけど、HelloActivityにはHelloActivityTestしかない。
「俺はActivityしかテストしないぜ」と主張している。
ApiDemosは、私の中ではちょっと毛色が違ったアプリという扱いになっている。
他のはActivityを継承するが、ApiDemosはApplicationを継承している。
まあ勉強不足なので、Applicationは後回しにしよう。
何となく、Activityが1つのときと、複数の時で作り方が違うんじゃないか、という気がするが、それはそのときでよかろう。

しかし・・・HelloActivityTest.javaを見るとわかるが、中身はスカスカだ。
テストしてない。
なので、ここからはAndroid Wiki*さんを参考に。

eclipseから新規追加で「JUnit Test Case」を選択。

順番はよくわからんけど、「Class under test」を追加。
たぶん、テスト対象のクラスだと思う。
Browseを選んでも何も出てこない…ので、文字を入力する必要がある。
これになかなか気付かなかった。

そのあと、「Superclass」。
これはデフォルトで埋まっていたのだが、AndroidではAndroid用のを使うとよさそうだ。
どれかわからないので、Android Wiki*にもあり、ApiDemosにもあった「ActivityInstrumentationTestCase2」を選択。
AndroidのサンプルにはActivityInstrumentationTestCaseという「2」がないやつになってるけど、もう推奨されていないらしい。
Android Wiki*の説明によると、これは「Activityの機能テストを行う」らしい。
他のは、単体テスト用。
ApiDemosの下の方では、それらを使ったテストになっていた。
まあ、テストの中身についてはまた考えよう。
「そんなSuperclassはないぞ」と言われているが、無視。

setUp()とtearDown()にチェックをし、Nameを適当に(今回は「HelloActivityTest01」)につけた。
そしてNext。

今度は、テストするメソッドを選択するようである。
HelloActivity.onCreate()にチェック。

Finishすると、プロジェクトに戻る。

eclipseに頼るのは、ここまで。
あとは手でぽちぽちとやらねばならぬ。

まず、追加したTestCaseが怒られているので、何とかせねば。
テンプレート(というのかな?)のtypenameに当たる部分が「T」のままなので、テスト対象のクラス名にしてやる。
ここでは「HelloActivity」。

(ここにきて「HelloAndroidクラスじゃないことに気付く・・・。まあいいや。)

そうすると、今度は「HelloActivityなんか知らない」とおっしゃる。
まずは何も考えずに、Ctrl+Shift+O。
テスト対象クラスへのimportを追加してくれたので、よし(あ、これはeclipseの機能か)。

しかし、また赤マークがついている。
今度はコンストラクタがないとのこと。
赤マークのところにマウスを持っていくと、「add constructorなんちゃら」と書いてあるので、クリックしてみよう。
・・・追加されたけど、Android Wiki*のと違う・・・
よくわからないので、このままやってみて、だめなら修正しよう。

では、ここまでで赤マークが消えたと思うので、動かしてみよう。
まずは、HelloAndroidプロジェクトで右クリックして、「Run As→1. Android Application」。
エミュレータがのしのしと起動して、こんな画面が出てくる。

さて、次はTestアプリ。
これもeclipseからHelloAndroidTestプロジェクトで右クリックして、「Run As→2. Android JUnit Test}。
動いているかどうかは、eclipseのConsoleを見るしかない。
最後に「HelloAndroidTest]Test run complete」と出てくれば、動いたのだろう。


が、これでは何かわからん。
そもそも、テストケースは追加したものの、テスト自体は何もしていない。
testOnCreateBundle()というメソッドに「fail」があるから、失敗しそうなのだが、それすらもわからない。。。

ということは、さっきのコンストラクタか?

	public HelloActivityTest01() {
		super("jp.justblog.hirokuma.HelloActivity", HelloActivity.class);
	}

こんなコンストラクタを追加した。
第1引数はクラスまでのフルパス。第2引数はテスト対象のクラス。 これで動かすと・・・

おお、失敗している。
というわけで、コンストラクタは自分で追加しなくてはならない。

しかし、ActivityInstrumentationTestCase2のコンストラクタは引数2つなのになぁ。
なんで引数なしコンストラクタが有効なのだろう?
Javaの言語ルールなのか、JUnitのルールなのか、AndroidのJUnitルールなのかは気になるところだ。

ちなみに、成功するとこんな画面だ。

R.javaがない

Androidでは、リソース類はR.javaというファイルにIDをまとめる。
まとめるというか、自動でまとめてくれる。

eclipseでプロジェクトのクリーンをかけると、genディレクトリごと削除してしまい、R.javaも消してしまう。
genディレクトリだけは作ってくれるのだが、R.javaまではやってくれないようだ。
自動ビルドモードにしていても、作ってくれない。
手動ビルドモードにしてビルドしても、作ってくれない。
作ってくれないと、ビルドできない。
antを使えばいいのだろうけど、なるべくeclipseだけでうまくやりたい。
どうすればいいんだ?

私の出した結論は・・・resディレクトリ内のファイルを更新して、日付を新しくする、というものだ。
そうすると、eclipseが「ビルドすべきだ!」と認識してR.javaを作ってくれる。
作ってくれるんだけど・・・そんなのは私の望む方法じゃないなぁ。

いつか解決する日を期待しておこう。

2009/09/22

初アップ後

初アプリの「IKAKU! SYAA!!」だが、予想通りほとんどダウンロードされていない。
いや、ずいぶんされていると思った方がよいのかな?

0.1.0をアップして、こりゃあんまりだと思い、画像を3枚増やして0.1.2をアップしている。
カテゴリーの分け方がよくわからず、最初はゲームにしていたけど、何か違う・・
ということで、途中からエンターテイメントに変更。

現在のところ、86ダウンロード。そのうち生きているのは22。
25%か。まあまあだ。
有償アプリなら、きっと0%だったに違いない。

これは、Androidの私のページだ。
何の画面なんだろう?
タイトルが「デベロッパー コンソール」となっているので、そうなのだろう。
星が1つか・・・。
そう評価した人が2人もいる!
まあ、評価されないよりもいいや。

もう少しちゃんとしたアプリを出したいなー、と野望を持った私であった。

2009/09/19

初アップ

初めて、AndroidアプリをAndroid Marketにアップしてみました。
・・・ごめんなさい、としかいいようのないできばえです。

ポイントは、
・Androidらしい技術は使っていない
・そもそも、技術っぽいところがみられない
の2点です。

「IKAKU! Syaa!!」みたいな名前でアップしているので、気になった方はどうぞ。
リンクがどこにあるのかなどは、わからないんですよねぇ・・・
Android Marketへは、Android上のブラウザからしか入れないのかしら?

2009/09/15

Android用です

はじめまして。

Androidアプリの配布にはURLが必要だったので、作りました。
有料アプリを配布できるくらいまでがんばりたいところです。
が・・・実力に見合ったものができればと思います。

よろしくお願いします。