このページでは、ごく簡単なアプリケーションを題材に、開発のプロセスをなぞってみることにする。
Palmwareを作成するには、以下の手順を踏む:
一度に全部やるのはしんどいので、とりあえずリソースを使わないアプリを作るところからはじめる。
アプリケーションを起動すると、画面中央に "Hello World!" という文字列を表示し、アプリケーションアイコンをタップすると終る。ただそれだけのアプリを作成してみよう。
palmwareは、pilotMain という名前の関数から始まり、この関数を抜けたときに動作を終らせる。ユーザによる操作はすべてイベントとしてイベントキューに入る。イベントキューからイベントを取りだして、それが終了イベントだったら、関数から抜ける。
Cで書くと、こんな感じになる:
これを、例えば MyFirstApp.c というファイル名で保存する。
こんな感じ。
この手順で、 a.prc というファイルが出来ているはず。
一行目では、Cソースファイルをコンパイルし、mc68k COFF object という型式の a.out というファイルを作成している。
二行目では、a.outからコードリソースを取りだし、a.prc という名前の PalmOS application ファイルにしている。
指定しているオプションは、 -c は CreatorID。-n は、そのアプリケーションの名前。
CreatorIDとは、アプリケーションそれぞれに割り当てられた識別子である。palmデバイスはファイルシステムを持たず、すべて「データベース」と呼ばれる型式で情報を貯えている。
このほかの識別子として、データベースの種別を表す Type というものがあり、prcファイルは通常、appl というType値を持っている。palmデバイス上では、今回作成したアプリケーションは、appl/test という識別子で認識されることとなる。
後に、同じ appl/test というIDをもつデータベースをPalmデバイス上に導入した場合、既存のデータベースは上書きされることになる。
アプリケーション固有のこの識別子は、test, ???? などいくつか特定のものがテスト用として予約されているので、今回は test というIDを使うことにした。
ではさっそく、エミュレータ上で動かしてみよう。
のようにエミュレータを起動すると、" Right click on this window to show a menu of commands. " と書かれたウィンドウが表示される。
右クリックして "New..."を選択し、ROM File, Device, Skin, RAM-Size を適切に設定し、[OK]すると、ウィンドウ上でPalmが起動する。
さらに右クリックして、"Install Application/Database
testアプリのアイコンをタップすると、期待したとおり、画面中央に "Hello, World!"と表示され、ホームアプリをタップすると終了する。
*: すでにホーム画面にいた場合、testアプリがみつからないことがある。こんなときはなにかアプリを起動し、またホーム画面に戻ってくればいい。
Palmには標準出力がないので、適当な方法がない。代替案として、画面の邪魔にならないところにBlipを表示するなどの方法がないでもないが、そんなことより、デバッガ経由で動作を追っかけたほうが早い。
ErrFatalDisplayIf(Boolean cond, const char *message); というAPIを使って、Assertできる。条件が成り立つとエラーメッセージを出して停止する。メッセージが出たら、ユーザはリセットすることで復旧できる。
POSEはgdbと連携する機能がある。gdbと連携すれば、ブレークポイントを設定しておき、実行しながら変数の内容を確認したり、Cのソースコードを見ながらステップ実行したり、というデバッグを行なうことができる。
POSEを起動している状態で、以下のようにデバッガを起動する:
以下のようにしてエミュレータに接続する。Waiting... と表示され、一旦停止したら、POSE上でターゲットアプリ "test" をタップして起動してやる。すると、PilotMain関数に入ったところで、以下のように停止する。
あとは print cmd やら step やら、すきにデバッグできる。
終らせるときは、以下のようにしておく:
POSEのほうは、右クリックして"Reset" で、ソフトリセットでもしておく。
リセットには4種類ある。
エラーダイアログで[Reset]をタップするか、デバイス裏面のリセット穴をつつくと、ソフトリセットがかかる。アプリケーションやデータは消去されない。
リセットして起動画面がでる瞬間に電源ボタンが押されていると、ハードリセット画面となる。"Erase All Data? YES - "up" button, No - any other button" とたずねられるので、上ボタンを押すと、アプリケーションやデータなど、すっかり消去され、購入時の状態に戻る。
OSのパッチなども消去されてしまうので注意。
リセットして起動画面がでる瞬間に下ボタンが押されていると、デバッグリセットとなる。画面左上に点滅する■が表示され、デバッグモードとなる。あまり使わないモードなので詳細は割愛。
リセットして起動画面がでる瞬間に上ボタンが押されていると、拡張機能がすべてOFFになって起動する。すべてのアプリケーションの初期化もバイパスされる。アプリケーション初期化ルーチンにバグがあった場合、バイパスリセットを行なうことで回避できる。
不用なアプリ、データは削除しておきましょう。不具合がでるならなおさら。
ホーム画面で、メニューから "Delete..." を選ぶと、アプリケーションの削除画面となる。アプリケーションを選択して[削除]することで、そのアプリケーションと、同一のCreatorIDを持つデータベースがすべて削除される。
アプリケーションは保持したまま、データベースだけを削除する手段は標準では用意されていない。filezやDB DAなどを使って削除する。
データベース以外に、アプリケーションごと、ちょっとしたデータを貯える Prefs. という領域がある。ここに保存したデータだけを削除したいときは、「アプリケーションの削除」の際に、そのアプリケーションを選択し、[Delete]にスタイラスを置き、下ボタンを押しながらスタイラスを離すことで、そのアプリの Prefs.データだけを削除することができる。
たとえば拙作Palmwareでは、ユーザ登録情報を Prefs.に保管しているので、この操作を行なうことで ユーザ未登録な状態に戻る。
ここまではテスト用として、予約済の "test" というCreatorIDを用いてきた。リリースにあたっては、そのアプリケーション固有のCreatorIDを取得し、それを設定してやる必要がある。
CreatorIDは32bit値であり、通常、4文字のASCII文字で表現される*。すべて英小文字のIDは Palm, Inc. が予約しているので、英大文字や数字などを混ぜて、任意の4文字のIDを決めて http://dev.palmos.com/creatorid/ で登録する。
* 0..31や127..255とかを表現するには、ASCII文字だけでは足りないはず。しかし現状、ASCII文字で表現できる範囲のみが流通しているようだ。