- 有关源码下载与开发环境配置权威的请参见http://source.android.com/source/index.html
- Android源码的编译只能在基于Linux的系统中执行,本人是在Mac系统下进行的尝试;
- Mac系统中开发环境的相关准备
- Mac系统默认的磁盘文件系统格式是不区分大小写(Case-insensitive)的,而android源码的编译必须基于区分大小写(Case-sensitive)的文件格式,主要是因为某些命令(比如git status)不支持,可能会导致很多莫名其妙的问题;
如何查询当前磁盘文件系统格式到底是大小写敏感还是不敏感这个没找到方法,磁盘信息里面也没有该项,命令行也没找到,知道的同学告诉下哈; - 解决办法是在Mac中新建一个独立的磁盘映像文件系统,书中说可以用系统的可视化“磁盘工具”来新建,但必须有一个条件:就是至少已经有一个磁盘映像存在了,此时新建才有我们需要的那些参数选项;否则的话就只有是否加密、是否压缩/读写这两个选项;我的Mac系统版本为10.7.5;
- 其实可以通过命令行来解决,执行hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
- 参数SPARSE表示创建为稀疏格式,即不需要一开始就真正分配40G的空间,而是按需分配,创建之处也就只有一百多兆;
- 参数Journaled表示记录所有磁盘操作日志,便于出问题后恢复;
- 实际生成的文件名为android.dmg.sparseimage;
- 创建好之后就需要装载该磁盘映像,可以直接双击,或者执行命令hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android;
书中和官方文档中都说可以写一个function放在.bash_profile文件中,然后执行function name,但在我的机器上没成功,原因未知;
- 其实可以通过命令行来解决,执行hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
- 若要编译4.0.*及其更老的版本则需要做更多的准备工作,比如要确保make的版本为3.81,若已经是3.82则必须要降级;xcode的版本也最好是3.1.4,4.x系列的版本可能会出现很多问题;
若是编译4.1.*及其更新的版本只要系统在10.6以上、Xcode在4.2以上即可;- Xcode的下载详见https://developer.apple.com/xcode/;做iphone开发的一定太熟悉了,也可以直接在AppStore里面下载;
特别注意,Xcode最新版4.6中已经没有了MacOSX10.6.sdk(Mac OS X 10.6 Core Library),而苹果又没有提供单独下载SDK的渠道,所以你只能去google一些老版本的下载地址,本人编译时使用的是4.3.3; - 若你需要校验下载的源码是否完整,就需要下载如下的2个小工具软件:
- 安装port,他是mac系统中用于智能下载软件的一个小工具,类似于Ubuntu中的apt-get,可直接到https://distfiles.macports.org/MacPorts/中下载适合于自己系统版本的最新pkg安装包,目前最新版本是2.1.3,非常方便,安装后会自动设置系统环境变量;
- 执行sudo port install gnupg安装GPG,他是一个开源的加密、解密、签名、证书管理的命令行工具,在利用repo下载源码时会自动检测是否安装了该软件,若没安装会出warning,当你源码下载完成之后可以用该工具来校验是否OK;
具体介绍详见http://www.huangwei.me/blog/2010/10/25/gnupg-quickstart/这里的相关链接;
使用port install过程中若遇到问题,可使用port clean --all <portname>来清除残存信息;
- Xcode的下载详见https://developer.apple.com/xcode/;做iphone开发的一定太熟悉了,也可以直接在AppStore里面下载;
- Mac系统默认的磁盘文件系统格式是不区分大小写(Case-insensitive)的,而android源码的编译必须基于区分大小写(Case-sensitive)的文件格式,主要是因为某些命令(比如git status)不支持,可能会导致很多莫名其妙的问题;
- 源码下载与编译
- 在刚才新建好的磁盘映像中依次执行如下命令
01
cd
/Volumes/untitled
##具体挂载点视自己设置会有所不同
02
mkdir
bin
03
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ./bin/repo
04
chmod
a+x ./bin/repo
05
mkdir
android-4.2.2_r1
##即将要下载的版本号,详见http://source.android.com/source/build-numbers.html
06
cd
android-4.2.2_r1
07
repo init -u https://android.googlesource.com/platform/manifest -b android-4.2.2_r1
##初始化过程中会让你提供user name和email信息,该信息与google账号无关,可以随便填
08
../bin/repo
sync
##由于下载时间很长中间可能出现各种问题,出现错误后请重复执行该命令;下载完成后源码约8G;
09
. build/envsetup.sh
##初始化某些编译过程中需要用到的函数
10
lunch full-eng
##lunch是一个function名称,在上一步中初始化,full-eng代表的是PRODUCTION,详见18章说明
11
make
-j4
##执行具体的编译操作,对整个系统代码进行编译,最后会生成相应的img文件,在我的MBP中执行耗时约2.5h
- 为了避免源码服务器被非法攻击,google默认对匿名用户下载的IP有下载配额限制,当你网速很给力的情况下下载一会儿之后可能会被google拒绝请求,此时你可以有两种选择,重新连接网络自动换一个IP,或者进行认证用户下载;
- 认证用户就是要生成一个正式的git用户名和密码放在本地的~/.netrc文件中;
密码的生成详见https://android.googlesource.com/new-password
此时需要有google账号,并进行登陆,登陆后系统就会自动生成访问git的用户名和密码; - 之后对repo init时采用认证的URL:https://android.googlesource.com/a/platform/manifest
- 区别就是在URL中多了一级/a/;
- 本人开始抱着侥幸心理以为重连个2次应该就差不多下载完了吧,结果没那么乐观,后面还是转换为认证用户下载了,推荐大家一开始就采用认证下载的方式,反正也不麻烦,只是登陆google账号自动生成git用户和密码而已;
- 认证用户就是要生成一个正式的git用户名和密码放在本地的~/.netrc文件中;
- 在刚才新建好的磁盘映像中依次执行如下命令
- Eclipse中调试Framework中的代码
- 首先新建一个Java工程,路径指向之前下载的源码根目录;
- 将./development/ide/eclipse/.classpath文件copy到源码根目录后重启Eclipse,此时就能够看到非常多的java source被导入了;
注意:这里并没有导入所有子项目代码,若需要其他子项目,请自行添加到source中; - Framework代码的调试和普通Java工程的调试完全一样,主要有两种方式:
- 针对自己的APP应用可直接通过Eclipse的run启动应用并断点,此时可以通过eclipse窗口中Attach Sources…选择我们刚才新建的android工程;
- 针对直接在设备或模拟器中运行的APP应用,包括系统原生的通讯薄、甚至system_process等,都可以在Run/Debug Configurations …中新建Remote Java Application进行调试;而选项中的Connection Port就是DDMS中APP进程所对应的tcp监听端口号;