为了能够同时开发iPhone
应用程序和Android
应用程序,我将所有的开发环境都集成到了自己的Macbook
上,虽然用Macbook
开发普通的Android
应用程序没什么问题,但是你要是想用Eclipse
浏览和编译Android
源代码并且对其SDK
进行调试,就是很麻烦的事情了。通过Google
发现绝大部分Android
源代码的编译和开发环境都是在Ubantu
系统上,虽然Android
官网提供了在MacOS X
上编译源码的方式,但是尝试了多次总是发现有问题。
刚好这段时间Android
源码网站被黑,终于找了一个方法能够下载到完整的代码,于是就借此机会再次尝试一下编译源码,同时在Eclipse
里面调试成功,记录下来整个过程方便以后查阅。
一.
设置MacOS X
编译环境
这一点是根据Android
官方网站提供的方法来设置的,我这里只做了一些翻译和解释工作。我自己的Macbook
已经升级到了Lion
,对于操作系统配置什么就不用去担心了。直接上吧。
1.
创建一个大小写敏感的磁盘镜像文件
由于编译Android
源代码需要将代码存放在大小写敏感的磁盘当中,所以我们需要首先创建一个大小写敏感的磁盘镜像文件(如果你的磁盘已经是大小写敏感的,则省略这个步骤,直接进入步骤2
).
进入应用程序/
实用工具/
磁盘工具,选择文件->
新建->
新建空白映像:
其中名称可以随意,大小可以选择自定义30G
,格式选用MacOs
扩展(区分大小写),映像格式选择稀疏磁盘映像,这样文件的大小会随着文件的多少而增长,不用一上来就搞30G
那么大,其它都是默认选项。
同时,你还可以通过命令行方式生成该磁盘镜像:
$hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 30g /
path-to-image
/AndroidDisk.sparseimage
生成的硬盘镜像文件名就是
AndroidDisk.sparseimage了。似乎创建完以后OS
会自动把这个镜像加载上去,挂载点是/Volumes/android
,其中android
就是上面我们为磁盘镜像设置的名称
。
另外也可以将如下一行代码加入到~/.profile
当中,function mountAndroid { hdiutil attach /
path-to-image
/AndroidDisk.sparseimage -mountpoint /Volumes/android; }
这样以后每次用mountAndroid
命令就行了。
2.
安装所需要的包
1
)首先你要安装的就是Xcode
,由于我的机器本身就是用来开发iPhone
应用程序的,所以我的Xcode
是最新的版本,如果你没有Xcode
,可以到苹果的官网注册一个appleid
,然后可以免费下载最新的Xcode
工具和MacOS SDK
。
2
)从macports.org
安装MacPorts
工具
安装MacPorts
之前需要确认环境变量PATH
中,/opt/local/bin
出现在/usr/bin
之前,可以运行一下这行来确认:
$echo $PATH
否则,就将如下代码加入~/.profile
当中。
export PATH=/opt/local/bin:$PATH
3
)从MacPorts
安装make,git, and GPG packages
:
$POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg
4
)将gmake3.82
还原到3.81
gmake3.82
版本存在一个Bug
,所以我们要将其还原为3.81
版本。
$sudo vim /opt/local/etc/macports/sources.conf
然后在rsync
那行的上面一行加上:
file:///Users/Shared/dports
然后按照下面的步骤依次执行:
$mkdir /Users/Shared/dports
$cd /Users/Shared/dports/
$svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/devel/gmake/
$portindex /Users/Shared/dports
$ sudo port install gmake @3.81
执行完成后,检查一下gmake
的版本:
$gmake –version
GNUMake 3.81
5
)修改文件标识符限制
于是最后下载Android
源码前的最后一步就是,修改文件标识符限制:
由于MacOS
默认将同时打开的文件标识符数量限制得太小,并行编译处理时可能会超出这个限制。所以在 ~/.profile
里加上这么一段:
#set the number of open files to be 1024
ulimit -S -n 1024
二.
下载gingerbread
源代码
Android
源代码网站android.git.kernel.org
已经被黑了很长一段时间,后来在网上另外找到一网站提供源代码下载。
1.
创建~/bin/
目录
$mkdir ~/bin
$PATH=~/bin:$PATH
2.
安装repo
$curl http://git-repo.googlecode.com/files/repo-1.12 > ~/bin/repo
3.
设置repo
可执行权限
$chmoda +x ~/bin/repo
4.
修改~/bin/repo
文件将第五行
REPO_URL='https://code.google.com/p/git-repo/'
改为
REPO_URL='http://code.google.com/p/git-repo/'
5.
新建目录gingerbread
,并进入该目录
$mkdir android_gingerbread_src
$cd android_gingerbread_src
6.
执行repoinit
$repo init -u git://Android.git.linaro.org/platform/manifest.git -b gingerbread
7.
找到android_gingerbread_src
目录中的.repo
下面的manifest.xml
文件,该文件只是一个链接,实际上是manifest
目录下面的default.xml
文件,将
fetch="git://Android.git.kernel.org/"
改为
fetch="git://Android.git.linaro.org/"
8.
回到android_gingerbread_src
目录下,执行reposync
$repo sync
这一步需要很长时间,喝杯茶等吧。
三.
编译gingerbread
源代码
1
)设置必要的编译环境
编译gingerbread
首先需要jdk1.6
版本,不过Mac
上已经自带了,所以省却这个步骤。
其次是gingerbread
的编译还依赖于MacOSX10.5.sdk
,但是我安装Xcode
最新版本后,始终都无法通过编译,后来自己看了一下编译脚本配置文件external/qemu/Makefile.android
,其中第72
行,LEOPARD_SDK:= /Developer/SDKs/MacOSX10.5.sdk
,将其修改为:
LEOPARD_SDK:= /Developer/SDKs/MacOSX10.6.sdk
,即可通过编译。
初始化编译环境:
$source build/envsetup.sh
2
)选择编译目标
$lunch full-eng
3
)开始编译代码
$make
如果运气好的话,你可以看到最终成功的提示,goodluck
!
四.
将源代码导入Eclipse
1.
拷贝.classpath
进入gingerbread
源代码目录,也就是上面的android_gingerbread_src
。
$cd android_gingerbread_src
$cp ./development/ide/eclipse/.classpath ./
将.classpath
设置为可写
$chmod +w .classpath
2.
新建Eclipse
工程
运行Eclipse
,选择File->New->Java Project
,项目位置就选择android_gingerbread_src
根目录,导入成功以后,Eclipse
开始编译源代码,不过会报告两个错误,如下:
Project'gingerbread' is missing required library:'out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar'
Project'gingerbread' is missing required library:'out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar'
删除.classpath
中的这两行路径:
<classpathentrykind="lib"path="out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar"/>
<classpathentrykind="lib"path="out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar"/>
添加
<classpathentrykind="lib"path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/>
然后重启Eclipse
,即可解决。
五.
利用Eclipse
调试gingerbread
代码
通过对gingerbread
源代码的调试,我们可以更为清晰的了解Android
的内部工作机制,也可以省却大量的阅读代码的时间,提高学习效率。
如果要想通过Eclipse
来调试gingerbread
代码,我们必须首先能够成功通过编译,编译以后,会生成几个系统文件,其中包括system.img
,userdata.img
和ramdisk.img
,三个文件位于源码目录下的out/target/product/generic
子目录下,如果熟悉Android
系统开发的朋友应该知道,一个完整的Android
映像应该还包括一个叫kernel-qemu
的文件,这就是Linux
内核镜像,不过我们并没有编译内核,所以这里没有生成这个文件。
要想成功调试,我们还需要安装androidsdk
,网上此类文章很多,这里就不多说了。将上述三个文件拷贝到/path-androidsdk/platforms/android-10/images
目录下,替换该目录下的三个同名文件(由于gingerbread
代码版本是2.3.3
,这个版本对应的就是android—10
,一定不要搞错了)。
创建一个新的avd
虚拟设备,Target
选择Android2.3.3
,如图,并启动模拟器。
我们可以看出,Android
的版本是2.3.5
,Build number
是full-eng 2.3.5 GINGERBREAD eng,
编译时间是2011.10.15
日。确实是我们自己编译的镜像。
启动Eclipse
,选择gingerbread
源码工程后,选择Run->Debug Configurations
,在左边列表中选择“Remote Java Application”
,并创建一个新的项目gingerbread
,将端口(Port
)设置为8700
,其它保持缺省,如图所示:
在eclipse
中,选择DDMS
视图,并选中你要调试的进程,如图:
回到上面的Remote Java Application
界面,点击“Debug”
按钮来启动调试,此时再打开DDMS
视图,可以看到我们要调试的进程显示一个绿色的小图标:
你可以在eclipse
中下断点开始调试了。