iphone 3.1.2开发环境搭建——linux平台 (2010-04-24 19:24)

来源:互联网 发布:平板双系统切换windows 编辑:程序博客网 时间:2024/04/25 12:20

北京理工大学  20981  陈罡
一、引子
前段时间看到了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。

下面就是偶改过的Makefile,各位可以根据需要进行更改:
文件:makefiles.tar.gz大小:1KB下载:下载

原创粉丝点击