一、引子
前段時間看到了apple公司發(fā)布了iphone os4.0的預覽視頻,iphone終于打算支持多任務(wù)了,尤其是對于預覽視頻中的skype軟件的展示讓人印象深刻。
一般來說,想做一 名正規(guī)的iphone應(yīng)用開發(fā)者應(yīng)當至少準備三件事情:
(1)一臺 apple的電腦
可以是mac book或者mac mini,國內(nèi)比較“節(jié)儉”的公司大都選擇mac mini(現(xiàn)價大概5k左右),然后配個便宜的顯示器;而對于mac book最便宜的也要上萬,在此按下不表。沒辦法,iphone的集成開發(fā)環(huán)境只能夠在apple的電腦上運行。
(2)一臺iphone
最好是iphone 3gs,(現(xiàn)價大概4.5k左右);當然iphone 3g也可以,不過從開發(fā)者的角度來看,最好性能能強一些(不保證每一位開發(fā)者一開始接觸iphone開發(fā)就能寫出高效率的代碼)。
(3)一個開發(fā)者授權(quán)
到蘋果開發(fā)者網(wǎng)站上面注冊一個開發(fā)者ID,然后為 這個ID申請開發(fā)者授權(quán)(需要每年交納99美金,注意,單位是美金,需要考慮匯率問題,呵呵)。
有了這些以后就是下載iphone的 sdk,用xcode開發(fā)應(yīng)用,真機測試,然后送到app store里面發(fā)布,最后就是每天看看帳戶。雖然網(wǎng)上一直有謠傳說iphone的用戶“人傻、錢多”,隨便做點啥都能賺錢,但經(jīng)過偶的觀察,iphone 的用戶是強調(diào)創(chuàng)意、時尚和個性的,對于操作流暢性非常挑剔(這主要是由于apple“寵壞”了這些用戶)。所以在app store里面絕對不可能“隨便”做點東西就能賺到錢的,“隨便”做點東西的結(jié)果就是讓apple公司“隨便”地賺到了那可憐的99美金(當然,還包括賣 給開發(fā)者的mac電腦和iphone的收入),而到頭來開發(fā)者還是兩手空空。
當然,上面這些是對于想通過app store賺到錢的開發(fā)者來說的。偶個人對apple向開發(fā)者收錢的這個事情一直比較反感(同樣,對于symbian sign要花170歐元的行為,在此也一并聲討一下)。所以,偶在做一些研究和實驗的時候,一般都是從最省錢的角度出發(fā)。于是偶決定在辦公電腦上搭建一套 簡單的開發(fā)環(huán)境(一直以來,偶的辦公電腦上只有l(wèi)inux),閑暇時候可以玩玩home brew。(還是印證了那句名言:少壯不努力,老大做it)。
二、準備工作
1、基本原理
iphone 2g/3g的cpu都是采用三星的S3C6400,而3gs的cpu是采用S5PC100總體上來講都是arm體系結(jié)構(gòu)。從原理上來說,給iphone開 發(fā)應(yīng)該與其他的嵌入式設(shè)備開發(fā)沒有什么區(qū)別,把代碼用支持arm指令集的編譯程序編譯一下,生成在arm系統(tǒng)下可以運行的文件即可(例如,在pc上面生成 arm平臺可以運行的文件,這也就是所謂的“交叉編譯”了)。下面,偶就要在linux平臺下面建立這樣一套交叉編譯的環(huán)境了,跟著偶一步一步的來,應(yīng)該 可以順利完成環(huán)境搭建(看個人的造化了,哈哈)。
2、開始前要想好 的事情
缺點:
(1)linux下面的sdk開發(fā)出來的軟件只能夠用于被jailbreak(俗稱越獄)過的iphone手 機。
(2)不支持iphone模擬器,不支持單步調(diào)試,不支持真機調(diào)試,沒有ide集成開發(fā)環(huán)境。
(3)目前最高版本只能支持到 iphone sdk 3.1.2(估計3.2未來也不會出了,都在等4.0呢)。
(4)環(huán)境配置過程繁瑣耗時,即使按照本文也有可能失?。?#8220;即 使自宮,未必成功?!”,哈哈)。
(5)運行此sdk開發(fā)出來的應(yīng)用,存在讓iphone變磚的可能(其實只要jailbreak,就會有變磚的 可能)。
優(yōu)點:
(1)不用交99美金購買開發(fā)者權(quán)限。
(2)不用購買apple的電腦。
(3)。。。可以用來消 磨時間(不知道這算不算是優(yōu)點)。
如果面對上述這么多缺點,仍然執(zhí)意要安裝的話,請跟隨偶繼續(xù)往下做:
3、開始前的準備工作
偶的電腦是:thinkpad sl400。
系 統(tǒng)是:slackware 13.0
內(nèi)核版本:Linux wayne 2.6.29.6-smp-wayne #1 SMP Thu Mar 18 20:00:29 HKT 2010 i686 Intel(R) Core(TM)2 Duo CPU T5870 @ 2.00GHz GenuineIntel GNU/Linux
gcc版本信息:
Reading specs from /usr/lib/gcc/i486-slackware-linux/4.3.3/specs
Target: i486-slackware-linux
Configured with: ../gcc-4.3.3/configure --prefix=/usr --libdir=/usr/lib --enable-shared --enable-bootstrap --enable-languages=ada,c,c++,fortran,java,objc --enable-threads=posix --enable-checking=release --with-system-zlib --disable-libunwind-exceptions --enable-__cxa_atexit --enable-libssp --with-gnu-ld --verbose --with-arch=i486 --target=i486-slackware-linux --build=i486-slackware-linux --host=i486-slackware-linux
Thread model: posix
gcc version 4.3.3 (GCC)
測試手機是jailbreak過的iphone 3gs,系統(tǒng)為iphone os 3.1.2
理論上來說,按照下面的方式開發(fā)出來的程序在iphone 3g平臺上也能夠運行。
(1)下載iphone的sdk
此sdk必須是3.1.2的官方 sdk,下載地址如下:
http://ipsw.info/iphone_sdk_3.1.2_with_xcode_3.2.1__snow_leopard__10m2003.dmg
預 先說明,這東西可是非常大,2.5G,要下載一整天呢!(想到可以免費用。。。偶忍了。。。)
(2)下載iphone 3g的firmware(固件)
注 意,一定是iphone 3g的,3gs的firmware是不可以的。
(好在開發(fā)出來的軟件在3g和3gs上面都可以跑!apple的向下兼容 做得不錯)
下載地址如下:
http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-7265.20091008.Xsd32/iPhone1,2_3.1.2_7D11_Restore.ipsw
(3)通過svn下載工具鏈腳本
cd ~
mkdir -p iphone_dev/toolchain
cd iphone_dev/toolchain
svn checkout http://iphonedevonlinux.googlecode.com/svn/trunk/ ./
這個腳本工程很小,如果網(wǎng)絡(luò)沒問題 的話,應(yīng)該很快就會下載好。
(4)下載darwin- tools.list里面的所有文件
這個文件是在iphone_dev/toolchain目錄下可以找到,這個文件里面有一個長 長的文件列表。
可以用kget或者wget把這些文件都下載好。
(5)xar工具下載和安裝
http://xar.googlecode.com/files/xar-1.5.2.tar.gz
這 個工具是用來解包dmg文件的,slackware上面默認是沒有這個工具的,直接通過源代碼安裝即可。
上面這幾個步驟可以說是整個 linux環(huán)境下iphone應(yīng)用編譯環(huán)境最為耗時的準備工作了。
三、 讓我們開始吧(按照老外的說法就是——get our hands dirty)
以下操作,為了方便起見,直接輸入命令了。
(1)進入安裝腳本目錄
cd ~/iphone_dev/toolchain
(2)創(chuàng)建 files目錄和子目錄
mkdir -p files/{firmware,darwin_sources}
(3)把iphone 3g的固件拷貝到files/firmware目錄下
cp ~/downloads/iPhone1,2_3.1.2_7D11_Restore.ipsw ./files/firmware/
(4)把iphone sdk拷貝到files目錄下
cp ~/downloads/iphone_sdk_3.1.2_with_xcode_3.2.1__snow_leopard__10m2003.dmg ./files/
(5)把前面下載的darwin- tools.list中的所有文件拷貝到darwin_sources目錄
cp ~/downloads/*.tar.gz ./files/darwin_sources/
(6)開始修改 toolchain.sh腳本
原本不需要修改這個腳本的,但是由于一些網(wǎng)絡(luò)和諧的問題,導致國外的一個提供解碼串的wiki無法訪 問,因此只好用這種土一點的辦法來解決了。
用喜愛的編輯器打開toolchain.sh文件,找到下面這一行:
if [ -z "$DECRYPTION_KEY_SYSTEM" ] ; then
echo "We need the decryption key for `basename $FW_RESTORE_SYSTEMDISK`."
echo "I'm going to try to fetch it from $IPHONEWIKI_KEY_URL...."
然后在上面 的if [....] ; then這一行語句的上面(再次強調(diào),是上面!)添加如下的一行: DECRYPTION_KEY_SYSTEM=
"a8a886d56011d2d98b190d0a498f6fcac719467047639cd601fd53a4a1d93c24e1b2ddc6"
修 改完畢后,保存并退出。
(7)開始解包頭文件
./toolchain.sh headers
(8)開始解包firmware文件
./toolchain.sh firmware
(9)開始解包drawin_sources
./toolchain.sh darwin_sources
這個過程會比較漫長,要有耐心。
(10)最后一步編譯,這一步事關(guān)成敗
./toolchain.sh build
(11)錯誤處理
ld: library not found for -lc
collect2: ld returned 1 exit status
make[3]: *** [libgcc_s.dylib] error 1
....
make[2]: *** [stmp-multilib] error 2
rm gcov.pod fsf-funding.pod gfdl.pod gpl.pod cpp.pod gcc.pod
....
make[1]: *** [all-gcc] error 2
make[1]:leaving dir `/home/xxx/toolchain/toolchain/bld/gcc-4.2-iphone'
make: *** [all] error 2
則可以執(zhí)行如下命令:
cp ./sdks/iPhoneOS3.1.2.sdk/usr/lib/libSystem.B.dylib ./toolchain/bld/gcc-4.2-iphone/gcc/libc.dylib
然后,再次運行如下命令:
./toolchain.sh build
如果看到如下提示,就代表環(huán)境搭建成功了。
It seems like the toolchain built!
ps:
這里提一句,關(guān)于上面的拷貝libc.dylib的命令,其實可 以在運行./toolchain.sh build命令以后,稍微等一小會兒,等到它開始編譯的時候,直接打開一個新的terminal窗口,然后進入toolchain目錄,然后執(zhí)行這個拷貝 的命令,這樣以來,就可以一次性編譯成功了。
(12)設(shè)定環(huán)境變量
關(guān) 于這個,偶只把自己的配置貼出來,各位可以根據(jù)自己的配置進行修改和調(diào)整:
export PATH=/home/wayne/iphone_dev/toolchain/toolchain/pre/bin:$PATH
可以把這個設(shè)置 保存在.bashrc或者/etc/profile里面,這些偶就不聒噪了。
四、測試編譯環(huán)境
1、編譯程序
這 個過程很簡單,只要進入~/iphone_dev/toolchain/apps目錄下即可看到兩個用于測試的工程:
HelloToolchain 和HelloWorldFirst。這個HelloWorldFirst是一個命令行的軟件,在iphone上面即使可以運行了,也是在終端輸入一個 HelloWorldFirst以后輸出一個hello world;而那個HelloToolchain是支持gui界面的,是一個textview,因此,比較有說服力一些。
在這兩個目錄下 面默認的都有一個Makefile文件,這個文件應(yīng)該是缺少一些路徑的定義,怕麻煩的朋友可以直接使用偶的Makefile(參見本文的附件),這是偶手 工改過的并且也在真機上運行過的。用偶的Makefile替換掉原來那兩個項目的Makefile,然后執(zhí)行make即可。
如果這個過程 中沒有顯示什么錯誤,那么恭喜你,你的linux平臺的sdk已經(jīng)搭建成功了。
2、真機上運行程序
好了,接下來就是更加有挑戰(zhàn)性的工作了——在真正的 iphone上面運行程序。但是在這之前還是要確認一下手機沒有問題。偶使用的是jailbreak過的iphone 3gs,利用blackrain越獄,利用cydia+wifi安裝的openssh,apt和ldid(這部分偶就懶得寫了,iphone越獄的方法, 幾乎“滿大街”都是)。
需要提一點的是關(guān)于ldid,這個工具是在iphone平臺上對二進制文件進行簽名的,網(wǎng)上很多人反應(yīng)在 iphone 3gs下面,這個工具不好使了,但是經(jīng)過偶的真機測試,這個工具完全沒有問題。
偶就把如何正確地安裝這個工具來簡單地提一 下:
(1)通過cydia安裝一個叫做terminal的程序,它是一個虛擬的命令行終端。
(2)把iphone聯(lián)上wifi,然后啟動 這個terminal。
(3)運行su,輸入密碼(如果從沒輸入過密碼,默認的密碼就是“alpine”,建議大家都給改掉,安全一些),得到 root權(quán)限
(4)運行如下命令:apt-get install ldid
(5)當命令行界面上提示已經(jīng)安裝成功后才能代表安裝成功 了。
好,開始把HelloToolchain拷貝到手機的/Applications目錄下了。
(1)首先查看iphone連接 wifi的ip地址(這個如果不會的話,可以直接跳過偶的文章。)
(2)在linux下面運行如下命令:
cd ~/iphone_dev/toolchain/apps/HelloToolchain
make clean ; make
scp -rp ./HelloToolchain.app root@192.168.0.2:/Applications/
如果看到下面的輸出(別忘 記輸入密碼!):
RSA key fingerprint is 33:bc:25:5a:a6:3c:21:72:5d:84:22:d4:4b:62:43:25.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.2' (RSA) to the list of known hosts.
root@192.168.0.2's password:
icon.png 100% 1073 1.1KB/s 00:00
Info.plist 100% 746 0.7KB/s 00:00
HelloToolchain_ 100% 13KB 13.2KB/s 00:00
HelloToolchain 100% 61 0.1KB/s 00:00
代表文件上傳成功。
(3)登錄到iphone里面,為剛 剛的程序簽名
ssh root@192.168.0.2(輸入root密碼)
cd /Applications
cd /HelloToolchain
ldid -S HelloToolchain_ (注意,這里是HelloToolchain_,下劃線一定要有!)
好了,如此一來,就都準備好了!
很多人納悶,怎么在iphone的桌 面上看不到程序的圖標呢?!
別著急,運行一下如下命令即可:
killall SpringBoard
這個命令是強行把 iphone的桌面程序殺掉,然后iphone會自動重新把這個桌面打開,這個時候就可以看到測試程序的圖標了。
網(wǎng)上有句俗話“有圖有 相”,偶就照兩張圖片上來秀一秀:
這是測試手機iphone 3gs的版本。
恩,界面上很漂亮,各位可以看到有“紅,藍,綠”三種顏色的問號圖標(這是偶手工改的圖標,原本的圖標是白色的三個 問號)。
這個就是程序運行起來的樣子,就是一個簡單的text view。
下面就是偶改過的 Makefile,各位可以根據(jù)需要進行更改:
下載