Palmwareの開発プロセス

prev. next.

概要

このページでは、ごく簡単なアプリケーションを題材に、開発のプロセスをなぞってみることにする。
Palmwareを作成するには、以下の手順を踏む:

  1. Cでコードを書く。
  2. コンパイラを用いてコンパイルし、m68k用のa.outを作成する。
  3. リソース定義ファイルを用意する。
  4. リソースコンパイラを用いてコンパイルし、リソースバイナリを作成する。
  5. 同時に、a.outをコードリソースバイナリに変換する。
  6. リソースバイナリを結合し、prcファイルを作成する。

一度に全部やるのはしんどいので、とりあえずリソースを使わないアプリを作るところからはじめる。
アプリケーションを起動すると、画面中央に "Hello World!" という文字列を表示し、アプリケーションアイコンをタップすると終る。ただそれだけのアプリを作成してみよう。

コードを作る

palmwareは、pilotMain という名前の関数から始まり、この関数を抜けたときに動作を終らせる。ユーザによる操作はすべてイベントとしてイベントキューに入る。イベントキューからイベントを取りだして、それが終了イベントだったら、関数から抜ける。
Cで書くと、こんな感じになる:

#include <PalmOS.h> UInt32 PilotMain(UInt16 cmd, void *cmdPBP, UInt16 launchFlags) { /* ここから */ EventType event; if(cmd != sysAppLaunchCmdNormalLaunch) return 0; /* 通常起動以外は無視 */ WinDrawChars("Hello, World!",13,50,50); /* 画面中央に文字列を描く */ do { EvtGetEvent(&event,evtWaitForever); /* イベントキューから取りだし */ SysHandleEvent(&event); /* 規定の処理を行なっておく */ /* ..... */ } while (event.eType != appStopEvent); /* 終了イベントでなければ繰り返す */ }

これを、例えば MyFirstApp.c というファイル名で保存する。

コンパイル、ビルドする

こんな感じ。

% m68k-palmos-gcc -g MyFirstApp.c % build-prc -c test -n test a.out

この手順で、 a.prc というファイルが出来ているはず。
一行目では、Cソースファイルをコンパイルし、mc68k COFF object という型式の a.out というファイルを作成している。
二行目では、a.outからコードリソースを取りだし、a.prc という名前の PalmOS application ファイルにしている。
指定しているオプションは、 -c は CreatorID。-n は、そのアプリケーションの名前。

CreatorIDってなによ

CreatorIDとは、アプリケーションそれぞれに割り当てられた識別子である。palmデバイスはファイルシステムを持たず、すべて「データベース」と呼ばれる型式で情報を貯えている。
このほかの識別子として、データベースの種別を表す Type というものがあり、prcファイルは通常、appl というType値を持っている。palmデバイス上では、今回作成したアプリケーションは、appl/test という識別子で認識されることとなる。
後に、同じ appl/test というIDをもつデータベースをPalmデバイス上に導入した場合、既存のデータベースは上書きされることになる。
アプリケーション固有のこの識別子は、test, ???? などいくつか特定のものがテスト用として予約されているので、今回は test というIDを使うことにした。

エミュレータ上で動かす

ではさっそく、エミュレータ上で動かしてみよう。

$ pose &

のようにエミュレータを起動すると、" Right click on this window to show a menu of commands. " と書かれたウィンドウが表示される。
右クリックして "New..."を選択し、ROM File, Device, Skin, RAM-Size を適切に設定し、[OK]すると、ウィンドウ上でPalmが起動する。
さらに右クリックして、"Install Application/Database" を選択し、さっき作った a.prc を取りこむ。エミュレータのホームシルクをクリックすると、"test" という名前のアプリケーションがあるはず*
testアプリのアイコンをタップすると、期待したとおり、画面中央に "Hello, World!"と表示され、ホームアプリをタップすると終了する。

*: すでにホーム画面にいた場合、testアプリがみつからないことがある。こんなときはなにかアプリを起動し、またホーム画面に戻ってくればいい。

あとはばりばり書けっ

デバッグする

printf流

Palmには標準出力がないので、適当な方法がない。代替案として、画面の邪魔にならないところにBlipを表示するなどの方法がないでもないが、そんなことより、デバッガ経由で動作を追っかけたほうが早い。

assert流

ErrFatalDisplayIf(Boolean cond, const char *message); というAPIを使って、Assertできる。条件が成り立つとエラーメッセージを出して停止する。メッセージが出たら、ユーザはリセットすることで復旧できる。

デバッガ流

POSEはgdbと連携する機能がある。gdbと連携すれば、ブレークポイントを設定しておき、実行しながら変数の内容を確認したり、Cのソースコードを見ながらステップ実行したり、というデバッグを行なうことができる。
POSEを起動している状態で、以下のようにデバッガを起動する:

$ m68k-palmos-gdb a.out GNU gdb 5.0 Copyright 2000 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "--host=i686-pc-linux-gnu --target=m68k-palmos"... (gdb)

以下のようにしてエミュレータに接続する。Waiting... と表示され、一旦停止したら、POSE上でターゲットアプリ "test" をタップして起動してやる。すると、PilotMain関数に入ったところで、以下のように停止する。

(gdb) target pilot localhost:2000 Remote debugging under PalmOS using localhost:2000 Waiting... (Press Ctrl-C to connect to halted machine) Program received signal SIGSTOP, Stopped (signal). 0x25cda in PilotMain (cmd=1, cmdPBP=0xab060000, launchFlags=520) at MyFirstApp.c:3 3 UInt32 PilotMain(UInt16 cmd, void *cmdPBP, UInt16 launchFlags) { (gdb)

あとは print cmd やら step やら、すきにデバッグできる。

終らせるときは、以下のようにしておく:

(gdb) detach Ending remote debugging. (gdb) quit $

POSEのほうは、右クリックして"Reset" で、ソフトリセットでもしておく。

トラブルシューティング

リセットする

リセットには4種類ある。

ソフトリセット

エラーダイアログで[Reset]をタップするか、デバイス裏面のリセット穴をつつくと、ソフトリセットがかかる。アプリケーションやデータは消去されない。

ハードリセット

リセットして起動画面がでる瞬間に電源ボタンが押されていると、ハードリセット画面となる。"Erase All Data? YES - "up" button, No - any other button" とたずねられるので、上ボタンを押すと、アプリケーションやデータなど、すっかり消去され、購入時の状態に戻る。
OSのパッチなども消去されてしまうので注意。

デバッグリセット

リセットして起動画面がでる瞬間に下ボタンが押されていると、デバッグリセットとなる。画面左上に点滅する■が表示され、デバッグモードとなる。あまり使わないモードなので詳細は割愛。

バイパスリセット

リセットして起動画面がでる瞬間に上ボタンが押されていると、拡張機能がすべてOFFになって起動する。すべてのアプリケーションの初期化もバイパスされる。アプリケーション初期化ルーチンにバグがあった場合、バイパスリセットを行なうことで回避できる。

データの削除

不用なアプリ、データは削除しておきましょう。不具合がでるならなおさら。

アプリケーションの削除

ホーム画面で、メニューから "Delete..." を選ぶと、アプリケーションの削除画面となる。アプリケーションを選択して[削除]することで、そのアプリケーションと、同一のCreatorIDを持つデータベースがすべて削除される。

データベースの削除

アプリケーションは保持したまま、データベースだけを削除する手段は標準では用意されていない。filezDB DAなどを使って削除する。

Prefs.の削除

データベース以外に、アプリケーションごと、ちょっとしたデータを貯える Prefs. という領域がある。ここに保存したデータだけを削除したいときは、「アプリケーションの削除」の際に、そのアプリケーションを選択し、[Delete]にスタイラスを置き、下ボタンを押しながらスタイラスを離すことで、そのアプリの Prefs.データだけを削除することができる。
たとえば拙作Palmwareでは、ユーザ登録情報を Prefs.に保管しているので、この操作を行なうことで ユーザ未登録な状態に戻る。

リリース

CreatorIDを取得する

ここまではテスト用として、予約済の "test" というCreatorIDを用いてきた。リリースにあたっては、そのアプリケーション固有のCreatorIDを取得し、それを設定してやる必要がある。
CreatorIDは32bit値であり、通常、4文字のASCII文字で表現される*。すべて英小文字のIDは Palm, Inc. が予約しているので、英大文字や数字などを混ぜて、任意の4文字のIDを決めて http://dev.palmos.com/creatorid/ で登録する。

* 0..31や127..255とかを表現するには、ASCII文字だけでは足りないはず。しかし現状、ASCII文字で表現できる範囲のみが流通しているようだ。


prev. next.
Last Modified: Sept. 16, 2002. Copyright © 2002 by matobaa.