一、引子
前段時間看到了apple公司發布了iphone os4.0的預覽視頻,iphone終於打算支援多任務了,尤其是對於預覽視頻中的skype軟體的展示讓人印象深刻。
一般來說,想做一名正規的iphone應用開發人員應當至少準備三件事情:
(1)一台apple的電腦
可以是mac book或者mac mini,國內比較“節儉”的公司大都選擇mac mini(現價大概5k左右),然後配個便宜的顯示器;而對於mac book最便宜的也要上萬,在此按下不表。沒辦法,iphone的整合式開發環境只能夠在apple的電腦上運行。
(2)一台iphone
最好是iphone 3gs,(現價大概4.5k左右);當然iphone 3g也可以,不過從開發人員的角度來看,最好效能能強一些(不保證每一位開發人員一開始接觸iphone開發就能寫出高效率的代碼)。
(3)一個開發人員授權
到蘋果開發人員網站上面註冊一個開發人員ID,然後為這個ID申請開發人員授權(需要每年交納99美金,注意,單位是美金,需要考慮匯率問題,呵呵)。
有了這些以後就是下載iphone的sdk,用xcode開發應用,真機測試,然後送到app store裡面發布,最後就是每天看看帳戶。雖然網上一直有謠傳說iphone的使用者“人傻、錢多”,隨便做點啥都能賺錢,但經過偶的觀察,iphone的使用者是強調創意、時尚和個性的,對於操作流暢性非常挑剔(這主要是由於apple“寵壞”了這些使用者)。所以在app store裡面絕對不可能“隨便”做點東西就能賺到錢的,“隨便”做點東西的結果就是讓apple公司“隨便”地賺到了那可憐的99美金(當然,還包括賣給開發人員的mac電腦和iphone的收入),而到頭來開發人員還是兩手空空。
當然,上面這些是對於想通過app store賺到錢的開發人員來說的。偶個人對apple向開發人員收錢的這個事情一直比較反感(同樣,對於symbian sign要花170歐元的行為,在此也一併聲討一下)。所以,偶在做一些研究和實驗的時候,一般都是從最省錢的角度出發。於是偶決定在辦公電腦上搭建一套簡單的開發環境(一直以來,偶的辦公電腦上只有linux),閑暇時候可以玩玩home brew。(還是印證了那句名言:少壯不努力,老大做it)。
二、準備工作
1、基本原理
iphone 2g/3g的cpu都是採用三星的S3C6400,而3gs的cpu是採用S5PC100總體上來講都是arm體繫結構。從原理上來說,給iphone開發應該與其他的嵌入式裝置開發沒有什麼區別,把代碼用支援arm指令集的編譯器編譯一下,產生在arm系統下可以啟動並執行檔案即可(例如,在pc上面產生arm平台可以啟動並執行檔案,這也就是所謂的“交叉編譯”了)。下面,偶就要在linux平台下面建立這樣一套交叉編譯的環境了,跟著偶一步一步的來,應該可以順利完成環境搭建(看個人的造化了,哈哈)。
2、開始前要想好的事情
缺點:
(1)linux下面的sdk開發出來的軟體只能夠用於被jailbreak(俗稱越獄)過的iphone手機。
(2)不支援iphone模擬器,不支援單步調試,不支援真機調試,沒有ide整合式開發環境。
(3)目前最高版本只能支援到iphone sdk 3.1.2(估計3.2未來也不會出了,都在等4.0呢)。
(4)環境配置過程繁瑣耗時,即使按照本文也有可能失敗(“即使自宮,未必成功?!”,哈哈)。
(5)運行此sdk開發出來的應用,存在讓iphone變磚的可能(其實只要jailbreak,就會有變磚的可能)。
優點:
(1)不用交99美金購買開發人員許可權。
(2)不用購買apple的電腦。
(3)。。。可以用來消磨時間(不知道這算不算是優點)。
如果面對上述這麼多缺點,仍然執意要安裝的話,請跟隨偶繼續往下做:
3、開始前的準備工作
偶的電腦是:thinkpad sl400。
系統是:slackware 13.0
核心版本: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,系統為iphone os 3.1.2
理論上來說,按照下面的方式開發出來的程式在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是不可以的。
(好在開發出來的軟體在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/ ./
這個指令碼工程很小,如果網路沒問題的話,應該很快就會下載好。
(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環境下iphone應用編譯環境最為耗時的準備工作了。
三、讓我們開始吧(按照老外的說法就是——get our hands dirty)
以下操作,為了方便起見,直接輸入命令了。
(1)進入安裝指令碼目錄
cd ~/iphone_dev/toolchain
(2)建立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指令碼
原本不需要修改這個指令碼的,但是由於一些網路和諧的問題,導致國外的一個提供解碼串的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這一行語句的上面(再次強調,是上面!)添加如下的一行: DECRYPTION_KEY_SYSTEM="a8a886d56011d2d98b190d0a498f6fcac719467047639cd601fd53a4a1d93c24e1b2ddc6"
修改完畢後,儲存並退出。
(7)開始解包標頭檔
./toolchain.sh headers
(8)開始解包firmware檔案
./toolchain.sh firmware
(9)開始解包drawin_sources
./toolchain.sh darwin_sources
這個過程會比較漫長,要有耐心。
(10)最後一步編譯,這一步事關成敗
./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
則可以執行如下命令:
cp ./sdks/iPhoneOS3.1.2.sdk/usr/lib/libSystem.B.dylib ./toolchain/bld/gcc-4.2-iphone/gcc/libc.dylib
然後,再次運行如下命令:
./toolchain.sh build
如果看到如下提示,就代表環境搭建成功了。
It seems like the toolchain built!
ps:
這裡提一句,關於上面的拷貝libc.dylib的命令,其實可以在運行./toolchain.sh build命令以後,稍微等一小會兒,等到它開始編譯的時候,直接開啟一個新的terminal視窗,然後進入toolchain目錄,然後執行這個拷貝的命令,這樣以來,就可以一次性編譯成功了。
(12)設定環境變數
關於這個,偶只把自己的配置貼出來,各位可以根據自己的配置進行修改和調整:
export PATH=/home/wayne/iphone_dev/toolchain/toolchain/pre/bin:$PATH
可以把這個設定儲存在.bashrc或者/etc/profile裡面,這些偶就不聒噪了。
四、測試編譯環境
1、編譯器
這個過程很簡單,只要進入~/iphone_dev/toolchain/apps目錄下即可看到兩個用於測試的工程:
HelloToolchain和HelloWorldFirst。這個HelloWorldFirst是一個命令列的軟體,在iphone上面即使可以運行了,也是在終端輸入一個HelloWorldFirst以後輸出一個hello world;而那個HelloToolchain是支援gui介面的,是一個textview,因此,比較有說服力一些。
在這兩個目錄下面預設的都有一個Makefile檔案,這個檔案應該是缺少一些路徑的定義,怕麻煩的朋友可以直接使用偶的Makefile(參見本文的附件),這是偶手工改過的並且也在真機上運行過的。用偶的Makefile替換掉原來那兩個項目的Makefile,然後執行make即可。
如果這個過程中沒有顯示什麼錯誤,那麼恭喜你,你的linux平台的sdk已經搭建成功了。
2、真機上運行程式
好了,接下來就是更加有挑戰性的工作了——在真正的iphone上面運行程式。但是在這之前還是要確認一下手機沒有問題。偶使用的是jailbreak過的iphone 3gs,利用blackrain越獄,利用cydia+wifi安裝的openssh,apt和ldid(這部分偶就懶得寫了,iphone越獄的方法,幾乎“滿大街”都是)。
需要提一點的是關於ldid,這個工具是在iphone平台上對二進位檔案進行簽名的,網上很多人反應在iphone 3gs下面,這個工具不好使了,但是經過偶的真機測試,這個工具完全沒有問題。
偶就把如何正確地安裝這個工具來簡單地提一下:
(1)通過cydia安裝一個叫做terminal的程式,它是一個虛擬命令列終端。
(2)把iphone聯上wifi,然後啟動這個terminal。
(3)運行su,輸入密碼(如果從沒輸入過密碼,預設的密碼就是“alpine”,建議大家都給改掉,安全一些),得到root許可權
(4)運行如下命令:apt-get install ldid
(5)當命令列介面上提示已經安裝成功後才能代表安裝成功了。
好,開始把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會自動重新把這個案頭開啟,這個時候就可以看到測試程式的表徵圖了。
網上有句俗話“有圖有相”,偶就照兩張圖片上來秀一秀:
這是測試手機iphone 3gs的版本。
恩,介面上很漂亮,各位可以看到有“紅,藍,綠”三種顏色的問號表徵圖(這是偶手工改的表徵圖,原本的表徵圖是白色的三個問號)。
這個就是程式運行起來的樣子,就是一個簡單的text view。