小ネタ 2007-019

iPhoneでアプリを作ってみる - 開発環境準備


<iPhone 1.0〜1.1について(iPhoneファームウェア1.0〜1.1.xについて)書いています。iPhone 3G等 ファームウェア2.0からは使えないかもしれないです。>


iPhoneがhackされて勝手アプリが作れてしまうというので、試してみることにした。

もう既に先行している開発者はだいぶ進んでいるようで、特にこのアプリとか凄いと思った。
 

自分でもやってみたいネタがあったので早いうちにiPhoneを入手していたが、勝手アプリの開発環境を準備するのに手間取ってかなり時間がかかった。

まだいろいろ試行錯誤中で、よくわかってないことが多いので、あやふやな記述や間違っている記述があるかもしれない。


実際にやってみた手順は以下のとおり。
 (1)iPhoneを入手する
 (2)iPhoneをjailbreakする
 (3)iPhoneにファイル転送する
 (4)Macにtoolchainをインストールする
 (5)サンプルのソースコードをコンパイルして実行する



現時点(2007年12月)での結論は以下のような感じ。
 ・iPhoneは、正規にAT&T契約でアクティベーションしたあとに解約した状態のものを使った。
 ・jailbreakは、iPhoneのファームウェアがFW1.0.2の場合、iBrickrかAppTappInstallerを使う。FW1.1.1の場合jailbreakme.comを使う。
  (iPhoneのFWを入れ替える場合、iTuneを使って特定キーを押しながら復旧を開始すると任意のFWで復旧できるが、ちょっと危ない。)
 ・iPhoneとPCとの通信/ファイル転送は、FW 1.0.2の場合iBrickrを使う。FW1.1.1の場合は対応ソフトがまだないみたいで、SSHを使うしかないか? (TouchExplorerが使えるみたいだ。)
 ・iPhoneとMacとの通信/ファイル転送は、特にこれというものが見つからなかった。VMware Fusionを使ってWindows用のソフトを動かして使う。
 ・iPhoneを無線LANで直接ネットにつないでInstaller.appで勝手アプリをインストールするのが簡単。今はこの方法が主流のようだ。
 ・toolchainはバイナリ配布版iPhoneToolchainv05.dmgを使う。Intel Macで、Mac OS X 10.4 Tiger上で使うとHello,Worldサンプルのビルドまではうまく動いた。他のソースで色々と機能を使ったアプリだと追加で色々必要らしい。Mac OS X 10.5 Leopardの場合、MacPorts版バイナリが使えるが、この場合もヘッダファイルを追加で入れたり、設定をいろいろ手動でする必要がある。
 ・Hello,Worldソースコードのコンパイルは、makeするだけでコンパイルできる。使用するtoolchainの違いによって、Makefileの中のtoolchainの関係のフォルダのパス指定部分の書き換えが必要。
 ・iPhone固有のライブラリを使うためのヘッダファイルは、頻繁に改善されて中身が変わってきている。ソースコードとヘッダファイルが合わなくてコンパイルエラーがでることがある。最新のヘッダファイルをGoogleCodeのサイトからsubversionコマンドで取得するのが良さそう。コンパイルできない古いソースがあったらヘッダファイルを追加したり順序を変えたりしてコンパイル出来る場合もある。





1. iPhoneを入手する

 日本では未発売なので、海外からネットオークションを通じて購入した。
 携帯電話のキャリアAT&Tとの契約しないと使えないようにロックされた状態で売っているので、入手の際にはどのような状態になっているのかを注意しなければならない。

 正規に契約してアクティベーションを済ませてから解約した状態のiPhoneというのがあり、自分はこの状態のものを入手した。この状態だと、電話以外の機能は基本的に全部使うことができる。使い始めに毎回アクティべーションを促す表示が画面に出るのが難点。

 これ以外にも、各種hackツールにより中身を書き換えて強引にロック解除して起動できるようにされた状態のものも出回っていたようだが、詳しくは不明。偽アクティべーションなどと呼ばれたりする。最近だと、SIMアンロックというのもあるらしい。iPhoneファームウェアを更新やリカバリーすると使えなくなる場合があるので、そこだけ気をつけて使わないといけないらしい。




2. iPhoneをjailbreakする

 iPhoneにはプロテクトが掛かっていて、それを解除するとiPhone内のファイルシステムの全部にアクセスできるようになる。これがjailbreakと呼ばれている。
 jailbreakソフトの動作の原理は、iPhoneのリカバリーモード(復旧モード)を使うとiTuneでiPhoneのファームウェアを出荷状態に書き戻すことができるのを利用して、iTuneの代わりにiPhoneに偽のファイルを渡してリカバリー手順を乗っ取ってiPhoneの中身をうまく書き換えるということらしい。
 上記のような原理なので、iPhoneの中身のファームウェアのバージョンの違い等で、jailbreakのやり方が異なる。

 jailbreak用のソフトは多数あり、うまくいかないことが結構多かった。FWのバージョンによってiPhoneの挙動が微妙に異なっていたり、iPhoneの中のファイルの書き換え内容が違っていたり、セキュリティホールが直っていたり、いろいろ原因がありそうだ。どうもMacOS上で動かすjaibreakソフトはうまく動かないことが多かった。Windows上で動かすソフトのほうがちゃんと動くことが比較的多かった。インストールされているiTuneのバージョンもひょっとすると関係しているのかも知れない。コツとしては、iPhoneをリカバリーモードにするためにボタン2つを長押しして、三角のアイコンが表示されたときにすぐにボタンを離さずに、数秒余分にボタンを押し続けると成功しやすいように感じた。 (後日加筆 MacOS用ではiNdependenceというソフトはよくできている。)

・FW 1.0.0は、当時いろいろな方法を試したがうまくいかなかった。WiFiも調子が悪かったので、あきらめてFW 1.0.2に更新してしまった。
・FW 1.0.2は、iBrickrというソフトでjailbreakできた。古いiBrickrの時にはうまくいかなくて、iBrickrに付属のjailbreakを手動でオプションを適切に指定して動かしてみたところ、何回か試したらjailbreakできた。 今は他にAppTappInstallerというソフトがあり、このソフトのWindows版では比較的簡単にjailbreakできた。
・FW 1.1.1は、ソフトは不要で、jailbreakme.comというサイトにiPhone内蔵のSafariを使ってアクセスするだけなので、すごく簡単にjailbreakできる。無線LAN環境が必要。リカバリーモードを使わない方法なので安定している。jailbreakme.comが潰されたりしないか心配だ。この方法はSafariのTIFF関係の脆弱性を利用しているのだが、新しいファームウェアでこのセキュリティホールは修正されている。
・FW 1.1.2は、試していないが、いまのところは方法がないらしい。特にFW 1.1.2で出荷されている新しいロットのiPhoneはブートROMの内容が新しくなっていて、リカバリーモードの起動シーケンスにも変更が加えられているらしい。


 iTuneでファームウェアの更新ができるのだが、不用意に更新するとプロテクトがきつい新FWになってしまうので、いろいろと必要なhackツールが新FWに対応して出回るまでアップデートは避けるのがよさそうだ。逆に古すぎると最新のツールが対応してなくて動かなくて困ったりする。
 iPhoneのFWを入れ替える作業では、iTuneを使って特定キーを押しながら復旧を開始すると任意のFWで復旧できるが、途中でエラーが出たりして危険だ。
 実際にFW 1.1.1からFW 1.0.2に戻してみたが、復旧作業の最後でエラー表示が出て、iPhoneの画面に黄色の三角のアイコンが表示した状態で止まってしまうのであせる。ちなみにFW 1.1.1だと黄色の三角のアイコン表示が変更されているので別の表示になっている。今回、作業後に黄色の三角アイコン表示に戻っているので、FWは古いものにちゃんと書き換わっているのだが、再起動が掛からない。この状態から正常に直すことは可能で、Windows上でiBrickrやAppTappInstallerを使うと正常にiPhoneが再起動できた。




3. iPhoneにファイル転送する

3.1 iPhoneとPC等とを接続してファイル転送できるようにする

 基本的には、iPhoneの中のUNIX由来のリモートコンソールのソフトを使ってSSH等でiPhoneとPC等を接続してファイル転送できる。
 勝手アプリのバイナリファイルとか、着信メロディのデータファイルとか、UI部品のデータファイルなど、好きなファイルを転送してiPhoneを好き勝手にいじることができるが、反面、下手にiPhoneの中身を変更してしまって壊すこともありうる。

 iPhoneのアプリは、/Applicationフォルダ内にXXX.appという拡張子appのアプリ用フォルダがあり、そのフォルダ内にアプリのバイナリとplistファイルとアイコンデータファイルや画像などのデータファイル一式が入っている。この形式はMacのアプリと一緒のようだ。 勝手アプリをiPhoneに転送してインストールするには、appフォルダを作ったり、いくつものファイルを転送しないといけないので、コマンドを手で打っていると煩雑でかなり面倒だ。

 GUI式の便利なファイル転送用のツールが存在する。勝手アプリもワンタッチでインストールすることができたりする。ただし、これらはjailbreakと同様、何種類もあるがうまく動かないことも多い。Mac用のソフトよりもWindowsのソフトのほうがうまく動くことが多かった。

 勝手アプリは、昔はバイナリファイルそのままが配布されていたりしたが、今はアーカイバーソフトを使ってパッケージ化されて配布されている。

 パッケージの形式は、PXL用のパッケージ形式とInstaller.app用のパッケージ形式がある。パッケージと言っても、勝手アプリのファイル一式がzipで圧縮されてまとめられているだけである。

 PXL形式の勝手アプリをインストールするためのソフトとしては、Windows用のiBrickrというソフトがある。FW 1.0.2で試したところiPhoneにファイル転送できた。iBrickrで最初に設定した後だと、Mac上でBreezyというソフトも動いた。(Breezyが動いたのは以前の話で、今また試したら動かない。なぜ?)
 PXL対応のソフトはiPhoneに PXLdaemonというソフトを常駐させて使う。PXLdaemonというソフトは、iPhone上で勝手アプリを管理して、勝手アプリが追加されたらメニューに反映されるようにiPhoneの中で作業してくれる常駐ソフトのようだ。
 FW 1.1.1では、iBrickrが対応していないので使えなかった。

 (後日加筆1)
 Windows用のTouchExplorerというソフトでもファイル転送することができた。

 (後日加筆2)
 Mac上で勝手アプリをコンパイルしたらiPhoneに転送しなければならないのだが、そのためには結局Windowsでツールを使っている。MacとWindowsマシンを2つも使うのは面倒というのもあり、Mac上でWindows XPを動かすためにVMware Fusionを試してみた。Mac OS X 10.4 / 10.5でVMware Fusionを使ってWindows XP ProとSP2をインストールし、Windows版iTune7.4.2をインストールして仮装環境を準備した。実際動かしてみたところ、Windows版のiTuneやiBrickrでiPhoneとUSB接続してファイル転送することができた。たまにiPhoneを認識しないこともあるが、そういう時にはコネクタを接続しなおすとうまくいったりすることがあるようだ。



3.2 iPhoneを無線LANに接続して直接ネットからファイル転送する

 PCとのファイル転送ができなくても、Installer.appというソフトをiPhoneに入れれば、ネット上で公開されている勝手アプリをインストールすることができる。たぶんこの方法が今は主流。自分も近いうちにこちらの方式に移行したい。

 最初にこのアプリを入れるのだけなんとかすればよい。それには以下の方法がある。

 FW 1.0.2の場合には、AppTappInstallerというソフトを使ってインストールする。jailbreakソフトも中に含まれているので、前もってjailbreakしておかなくてもよい。
 FW 1.1.1の場合には、jailbreakme.comでjailbreakするときに同時に自動的にインストールされる。

 このインストーラーは、ネット上で公開されている勝手アプリをインストールするのには便利なのだが、反面、自作等の手元にあるバイナリファイルを直接インストールすることができないのが難点か。

 新しいバージョンのInstaller.appだと、勝手アプリを探す対象のホストを自由に追加できるようになっている。自前でホストを用意できれば、自作ソフトもネット経由になるがインストールできるようだ。あとで試してみよう。




4. Macにtoolchainをインストールする

 iPhoneのOSは、MacOSの組み込み版というかミニチュア化して組み込みCPU向けにビルドしたものが入っているそうだ。PC用のWindowsとPDAの組み込み用OSのWindows CEというのがあるのと似ている。Mac OS X用の開発環境は、GNUのGCCをベースにしたObjective-Cという言語を含むXcodeというのがMac OS Xに付属している。このMacOS用開発ソフトはソースコードも公開されているので、組み込みCPU向けにソースコードを多少手直ししてビルドしなおすことでiPhone用の開発環境を構築できる。構築したiPhoneの開発用の道具一式がiPhone toolchainと呼ばれている。(後日加筆 GCCでなく、LLVMというコンパイラを使っているらしい。GCC互換で使える。)

 toolchainを使って実際にiPhoneのアプリを開発するには、以下の3つの要素が必要である。

 ・toolchainに含まれるGCCのコンパイラやリンカーなどのコマンド
 ・iPhone用のライブラリ (toolchainに含まれるのは汎用の開発環境のみで、iPhone専用のUI等のライブラリが付属していない。)
 ・iPhone用のライブラリを使用するためのヘッダーファイル



4.1 toolchainに含まれるGCCのコンパイラやリンカーなどのコマンドをインストールする

 当初、toolchainのソースコードのみが公開され、各自でビルド作業をしなければならなかった。ビルドにはMacPortsとかSubversionとかUNIX由来の他のいろいろなツールや依存するライブラリを先にインストールしなければならなかったり、Makefileやconfigを手作業で修正しなければならなかったりするので、かなり難しい。自分も実際にやろうとしてみたのだが、正常にビルドできず、自分でビルドするのは断念した。

 ビルド済みのバイナリファイル一式を配布してくれるサイトなどが出てきたので、それを使うと比較的楽にインストールはできる。ただし、初期のものは、中身に不備があったり、インストールすべき場所が/opt/local/arm-apple-darwinか/Developer/SDKs/iPhoneの下か/usr/local/arm-apple-darwinの下かという違いがあったりして、最初のうちは正常に動くようにするのが少し難しかった。最近のバージョンv05のiPhoneToolchainv05.dmgは良くなってきている。これはIntel Mac用なので、IntelのCPU入りのMacが必要。OSは、Mac OS X 10.4 Tiger上で使う。Mac OS X 10.5 Leopardだとうまく動かせなかったので、Mac miniのOSを古いものに入れなおして使っている。とりあえずHello,Worldのコンパイルまでは問題なく動かすことができた。 より複雑なソースをコンパイルするにはヘッダーファイルが不足するので、別にインストールする必要がある。

 Mac OS X 10.5 Leopardでtoolchainをインストールするのも試してみた。なぜなら最近MacBookを買ったらLeopardが入っていたのである。古いTigerに戻して使いたかったが、古いOSは入手できないようだ。しかたがないので、Leopardにtoolchainをインストールする方法を色々試してみた。結論としては、MacPortsでiPhone toolchainのバイナリが配布されているので、それを入れたら動いた。MacPortsを使って「sudo port install arm-apple-darwin-binutils arm-apple-darwin-cc arm-apple-darwin-runtime」というコマンドでインストールした。heavenlyの手順(後述)をするようにインストール途中でエラー表示が出たりするので、heavenlyインストールをして、再度この手順を実行しないと最後までtoolchainがインストールされないので注意。

 あと、ミスしやすいのは、PATHの設定(複数toolchainインストールをした場合には特にチェックすべき)、GCCの設定ファイル /(インストール先フォルダ)/arm-apple-darwin/etc/arm-cc-specの内容と~/.arm-cc-specs(後者は普通は無いはず)。

 Makefileの内容にも注意すること。CC,LD,LDFLAGSの内容は、どのtoolchainを使うかによって変えなければならない。特にXcode用Makefileだったりすると新しくシンプルなMakefileを作り直した方が楽なこともある。



4.2 iPhone用のライブラリをインストールする

 toolchainに含まれるのは汎用の開発環境のみで、iPhone専用のUI等のライブラリが付属していない。iPhoneからライブラリ一式を取り出してMacにコピーをしておく必要がある。heavenlyという名前のフォルダに入れるので、このライブラリをheavenlyと呼んだりすることもある。iPhone実機から直接取り出してもよいし、iPhone用のFWのファイルから取り出してもよい。後者が楽だった。

 手順によってはlibarmfp.dylibというライブラリがインストールされなかったりする。ARM-CPU用のfloating pointのダイナミックライブラリらしい。浮動小数を自作アプリで使わなければ問題がないかもしれないが、使う場合が多いので入れておくべきである。インストールされていない場合、iPhone内の/usr/local/libあたりから取り出して、heavenly内の適当な場所にコピーする必要がある。



4.3 iPhone用のライブラリを使用するためのヘッダーファイル

 Google CodeのiPhone toolchainのサイトからsubversionを使用して最新版をダウンロードしてインストールするのが推奨。 「svn checkout http://iphone-dev.googlecode.com/svn/trunk/include iphone-dev/include」というようなコマンドで取り出せる。取り出したらconfigureとインストールする。インストールされる場所が/usr/local/arm-apple-darwin/includeなので、シンボリックリンクを作って、toolchainから参照できるようにしておくこと。

 ヘッダーファイルの内容は日々改良されてきており、昔のヘッダーを使ったソースファイルがコンパイルできなくなっている場合もある。そういう場合は#importの順序を変えたり、必要な#importを見つけて追加したりすればコンパイルできるように修正可能なことが多い。




5. ソースコードをコンパイルして実行する

 サンプルコードHello, worldをコンパイルして、実行してみた。

5.1 コンパイル

 シェルからmakeを使ってソースコードをビルドするか、Xcodeという統合環境を使用するかで手順が違ってくる。統合環境が苦手なので自分は使っていない。
 Makefileは、開発環境の差異により内容を変える必要がある。UNIXの一般的なソースの場合configureというスクリプトが用意してあり環境の差異を吸収してくれる仕組みがあるのだが、iPhone toolchainの場合にはそういうのはないので、手動でMakefile等を直す必要がある。
 CC,LD,LDFLAGSの内容は、どのtoolchainを使うかによって変えなければならない。特にXcode用Makefileだったりすると新しくシンプルなMakefileを作り直した方が楽なこともある。


5.2 作ったアプリを実行する

 ・PXLパッケージ化
  コンパイルしたアプリはパッケージ化しておく。
  PXL形式は今はもうほとんど使われていないので、ここに何か書いても役に立つようなことはなさそう。
  おおざっぱなPXL化の手順は、必要なファイルをzipで固めて拡張子をPXLにリネーム。

 ・インストール
  iBrickr等を使ってインストールする。
  iPhoneのメインメニューに自作アプリのアイコンが表示され、実行できるようになる。




(後日加筆 2008.4.8)

WindowsにiPhone toolchainをインストールしてみた。

Cygwinを使ってビルドしたバイナリ版を配布しているサイトがあり、これをインストールした。
・Windows Cygwin Binary Toolchain Installation - http://wiki.iphonegameover.com/Windows_Cygwin_Binary_Toolchain_Installation

手順
 (1) Cygwinのインストーラーをダウンロードする。
 (2) Cygwinのインストーラーを実行する。
   設定する項目はrecommendの項目で設定する。
   インターネットからのインストールを選んで、'http://www.iphonegameover.com/cygwin'を追加して、ここからインストールする。
   インストールが終了すると、デスクトップにショートカットが作られる。
 (3) XcodeのパッケージからArchive.pax.gzというファイルを取り出して用意する。
   Xcodeのパッケージ'xcode25_8m2558_developerdvd.dmg'をAppleのサイトからダウンロードする。
   このファイルを PowerISOというソフトで開く。 (Macで開いたのではダメ)
   中からArchive.pax.gzというファイルを取り出して、Cygwinのホームフォルダに入れる。ただし、フォルダに入れるのは次の(4)の手順の後で。
 (4) デスクトップのショートカットCygwinを実行する
   自動的にiPhone toolchainのセットアップ用のスクリプトが起動する
   ライブラリのファイルをiPhone本体からコピーするため、iPhoneとSSHで接続する設定を入力する。
   自動的にiPhone上で、必要なファイルがiphone-root-fs.tarというファイルにまとめられる。
   自動的にWindows上で、iPhoneからiphone-root-fs.tarファイルを転送するのだが、途中で止まってしまう。(なぜ?)
   ここで一旦スクリプトを中断して終了させる。
 (5) 手動でiphone-root-fs.tarをiPhoneから取り出す。
   SCP等を使って、手動でiphone-root-fs.tarをiPhoneから取り出す。
   Cygwinのホームフォルダに残っている不完全なiphone-root-fs.tarファイルを消して、iPhoneから手動で取り出したものと差し替える。
 (6) 再度セットアップスクリプトを起動する。自動的に作業の途中から再開される。
   iphone-root-fs.tarが/usr/local/arm-apple-darwinあたりに展開される。
   もしなんらかの手違いで、再開時に/usr/local/arm-apple-darwinフォルダが存在すると、tarファイルの展開されないので、注意。
   tarファイルの展開後、Archive.pax.gzも解凍されて、インストールされる。
   正常にセットアップスクリプトが終了するはず。

 ここまでの手順で、アプリのビルドができなかったりした場合に、以下の(7)、(8)をする必要があった。
 (7) ヘッダファイルがインストールされないので、googlecodeから取ってきてインストールする。
   Windows版Subversionを使って、googlecodeからヘッダを取ってくる。
   ./configureでMacOSX用にオプションを指定してカスタマイズし、 bash install-header.shでインストールする。
 (8) csuのライブラリcrt1.o等がインストールされないので、他から持ってくる。
   自分の場合、MacOS版iPhone toolchainの/opt/local/arm-apple-darwin/libと/opt/local/arm-apple-darwin/csuの中身をコピーした。
   持ってきたファイルは、/usr/local/arm-apple-darwin/に置く。

 以上で、アプリのビルドができるようになった。

 ただし、実際にビルドする時は、MakefileのCC,LD,CFLAGS,LFLAGSを書き換える必要がある。


 (後日加筆 2008.4.18 上記のiPhoneGameOverのサイトのバイナリは改良されているようだ。最近インストールし直したところ、ヘッダファイルは上の(6)までの手順でちゃんと入るし、ライブラリもちゃんと揃っている。)


 (後日加筆 2008.4.21 上記のiPhoneGameOverのサイトがいつか無くなったりしないか不安なので、ネットワーク無しでローカルでインストールするのを試してみた。Cygwinインストーラーにはローカルからのインストール機能があるので、問題なくできると思ったが、多少工夫が必要だった。iPhoneのファイルシステム部分のインストールもちゃんと動かなかったので、手動でインストールする必要があった。 インストール後にアプリのビルドもできたので、とりあえず、ちゃんとインストールできたようだ。)



- See Also -

iPhoneの自作アプリを作ってみる - その1 おみくじ
iPhoneの勝手アプリをインストールする方法