ubuntu 11.10下载和编译Android源码

         由衷感谢网上的各个博主的文章,给了小弟我莫大的帮助。这里呢,小弟也把自己的经历记录下来,以供大家参考^^。这篇应该算是零基础、从无到有的流程介绍了。
         由于是事后写这篇文章,算是总结吧,可能会遗漏一些东西,但我会尽力写清楚的!
 

一、安装ubuntu 11.10

         官方很照顾我们啊,还专门有中文的下载链接,而且在“4)安装程序”内将步骤也阐述的非常清晰明了,照着做就行了。
         官方网址(下载&安装): http://www.ubuntu.com/download/ubuntu/download-zh
 
1 )我的ubuntu
         单系统,总320G,分区:/,50G;swap,1G?;/home:其余。

         1、swap不记得是1G还是2G了,多方资料查说不建议超过2G,总之我是照办了。更权威点的是:if (M<2) S=M*2 else S=M+2。M->RAM、S->swap。(执行sudo fdisk –l查了分区,那串数字是位数么T^T)

         2、至于分区时这些挂载点的意义,只需Google下“Linux 挂载点”就成。
 
         更多有关ubuntu的东西,可以去ubuntu中文找找( http://forum.ubuntu.org.cn/及其Wiki标签)。
 
2 )快捷操作
         1、复制&粘贴(最快捷的):鼠标左键选中即复制,鼠标中间按下去即粘贴。
         2、Alt+F10:窗口最大化;Alt+F5:窗口恢复;Alt+F9:窗口最小化;更多:系统设置->键盘->快捷键。
         3、Ctrl+Alt+T:打开终端(这个最重要了)
 
3 )shell 命令

         注意$前~表示用户目录开始(即/home/<user name>),而/是系统目录开始。执行pwd可查看当前工作目录。

         还有Tab键自动补全路径,上下方向浏览之前的命令等。和windows下类似,这些都能加快我的效率。(有点废话==)
         具体步骤内shell命令的作用都会简单注明,更多请参见附件《Linux命令大全(修改版).chm》^^。
 
二、 SDK 集成开发环境
         搭建过程和Windows下类似。注意:Eclispe最好从官网下载,不要用下载中心的,需要添加Eclispe版本更新源什么的。(我一开始是用应用中心下载的Eclispe,一些问题也解决了,但更新下载时在某处卡住,试了多次后,流泪奔向了官方的怀抱T^T)
         需要搭建的请挪至: http://my.oschina.net/taskiller/blog/38849?catalog=136911
 
三、 Android 源码下载
         我下载和编译的是2.3.3_r1和4.0.3_r1两个版本的源码。之前有弄2.2的,但是一直下载不下来,伤心T^T(关了部分服务器的原因么?)。补充一点:2.2及之前的需要JDK5。
 
1 )更新ubuntu 源为网易源
         为了下载速度,更新下比较好,至少也可以心里安慰下自己吗。(虽然我是后来更新的,但没比较前后效果==)
 
         1、sudo –s(superuser do,提至root权限,exit退出)

         2、cp /etc/apt/sources.list /etc/apt/sources.list.bak(copy,备份下文件)

         3、gedit /etc/apt/sources.list(编辑源列表。gedit,默认的文档编辑器)
 

deb http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse

deb-src http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse

deb http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted

deb-src http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted

deb http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted

deb http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted

deb-src http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted

deb http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted

deb-src http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted

deb-src http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted

 
         4、apt-get  update(更新源地址)
 
         更多Ubuntu 11.10 更新源地址列表: http://bolg.malu.me/wap/index-wap2.php?p=1190
 
2 )安装JDK6
         应用中心只有OpenJDK,不记得默认是否安装了==。这个倒是不影响源码下载,但是在编译的某步会报缺少tool.jar的错误(jdk lib内的包)。
 
         1、下载jdk&jre(jre可不需要)
         不需要用jdk7,以下是Java 6u29版本的相关地址。
 
         2、创建/usr/lib/jvm/java目录,并把下载的xxx.bin文件移到该目录。

         sudo -s(或者在下述命令前加sudo,否则是动不了usr/lib下东西的)

 
         cd /usr/lib(进入/usr/lib)
         mkdir jvm(没有jvm,就这样创建)
         cd jvm(进入/usr/lib/jvm)
         mkdir java(没有java,就再创建)
 

         mv 文件绝对路径 /usr/lib/jvm/java(移动文件至/usr/lib/jvm/java)

         如:sudo mv ~/下载/jdk-6u29-linux-i586.bin /usr/lib/jvm/java

 
         3、安装jdk(配环境变量等)

         cd /usr/lib/jvm/java(说明是在该目录下罢了)

         chmod +x jdk-6u29-linux-i586.bin(增加可执行权限)

                  Linux权限的解释: http://www.artms.cn/article.asp?id=925,汗颜啊==

         ./ jdk-6u29-linux-i586.bin(执行文件,会将jdk解压至当前文件夹)

 

         gedit /etc/environment(修改变量)

                   用vi的话,最好先在文本编辑好。:d删除当前那行,:i把复制内容输进去
 
PATH=”……:$JAVA_HOME/bin”(……为原PATH)
CLASSPATH=”.:$ JAVA_HOME/lib”
JAVA_HOME=”/usr/lib/jvm/java/jdk1.6.0_29”
 

         source ~/.bashrc(设置变量)

 

         update-alternatives --install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_29/bin/java 300

         update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_29/bin/javac 300

         (安装jdk至java选单)
 

         update-alternatives --config java(选择默认jdk)

 

         java –version(确认查看版本)

 
         更多参考网址:
 
         1、ubuntu安装jdk全过程(仅供参考)
                    http://forum.ubuntu.org.cn/viewtopic.php?t=183803
         2、ubuntu 11.10 安装 java环境
 
3 )安装开发包
         具体什么不管了,当时执行的是这个^^。

         sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6

 
4 )下载源码

         以下载android-4.0.3_r1至/home/<user name>/env/android_src/4.0.3_r1目录下为例。

         cd ~/env/android_src/4.0.3_r1/(进入该目录,没有就mkdir)

         curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo >repo(创建repo文件)

         sudo chmod a+x repo(增加可执行权限)

         ./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1(初始化版本库为支线上的android-4.0.3_r1版本)

 

         Your Name [<user name>]:(会跳至这个,要求输入用户名,随意)

         Your Email [<user name>@xxx]:(继续要求输入邮箱,随意)

         Your identity is: xxx xxx

         is this correct [y/N]? y(确认用户名、邮箱)

         repo initialized in /home/join/env/android_src/4.0.3_r1(初始化完毕的提示)

 
         ./repo sync(同步版本库,即开始下载)
 

         1、遇到异常时重执行./repo sync,卡主时先Ctrl+C中断再执行./repo sync,继续下载。

         2、中断会造成no repository什么的,再次中断并把提示的目录删除再继续./repo sync。
 
         总之,最后会是统计,然后一列100% done,就OK了。
 

         想下载其他指定版本的源码,我是在初始化版本库时故意打错再查看的==。如:./repo init -u https://android.googlesource.com/platform/manifest -b xxx,然后找支线名称(repo没去了解,就这么用了-_-!)。一般具体到哪个发布版本,XXX用发布的版本别名代替就好,都是小写。

 

         问题追加^^

         1)DownloadError: android.googlesource.com: <urlopen error [Errno 110] Connection timed out>

         解决方式简述如下(执行上述步骤前,已执行过,则删除重来):
         1.打开 https://android.googlesource.com/new-password,gmail账号登录
         2.点击“允许访问”,得到一串信息,加入至~/.netrc。
         3.执行上述下载步骤,不过有条命令要做下修改,具体如下:
         原:./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1
         新:./repo init -u https://android.googlesource.com/a/platform/manifest -b android-4.0.3_r1
         详细请见网址: http://www.haogongju.net/art/1428426
 
5 )参考网址
         1、Android源码下载方法详解
         2、Git和Repo扫盲——如何取得Android源代码
                    http://www.williamhua.com/2009/04/git-and-repo-for-dummies/
         3、ubuntu 11.04下Android源码的获取
                    http://www.cnblogs.com/dwayne/archive/2011/11/11/2245383.html

         4、ubuntu 11.04+获取Android源码(补充篇)

                    http://www.cnblogs.com/dwayne/archive/2011/11/16/2250732.html
         5、ubuntu 11.10下android2.2 源码获取
                    http://www.cnblogs.com/ouling/archive/2011/09/02/2163829.html
 
四、 Android 源码编译
         4.0.3_r1在32位下直接编译就ok了,但2.3.3_r1配置的是64位的,还要改写东西才成。
 
1 )安装软件包
         好吧,我这里又执行了一遍乱七八糟的东西-_-!好像还是多安装了几样的。

         sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc

 
2 )配置USB 权限
         不知道不配有什么影响==。

         sudo gedit /etc/udev/rules.d/51-android.rules

 
# adb protocol on passion (Nexus One)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"

# fastboot protocol on passion (Nexus One)

SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"

# adb protocol on crespo/crespo4g (Nexus S)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"

# fastboot protocol on crespo/crespo4g (Nexus S)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"

# adb protocol on stingray/wingray (Xoom)

SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"

# fastboot protocol on stingray/wingray (Xoom)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"

# adb protocol on maguro/toro (Galaxy Nexus)

SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"

# fastboot protocol on maguro/toro (Galaxy Nexus)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"

# adb protocol on panda (PandaBoard)

SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"

# fastboot protocol on panda (PandaBoard)

SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"

 
         需要将"<username>"替换成当前用户名。
 
3 )配置ccache
         可以不必配置,而且不知道到底有效了没==。
 

         gedit ~/.bashrc(添加用户环境变量,注销重登)

 
export USE_CCACHE=1
 

         cd ~/env/android_src/4.0.3_r1/(进入源码目录)

         prebuilt/linux-x86/ccache/ccache -M 50G(设置ccache缓存上限)

 
         到这先看下有效不,不行的话再按下面的步骤执行。我当时是倒过来的,不确定上述可不可行==。
 

         sudo apt-get install ccache(下载ccache)

 

         mkdir ~/.bin(创建.bin文件)

         cd ~/.bin/(进入.bin文件)

 

         which ccache(确认安装在/usr/bin/ccache)

 

         ln -s /usr/bin/ccache gcc

         ln -s /usr/bin/ccache g++

         ln -s /usr/bin/ccache arm-linux-gcc

         ln -s /usr/bin/ccache arm-linux-g++
         (重新链接各编译命令)
 

         gedit ~/.bashrc(行尾添加如下环境变量配置,注销重登)

 
export USE_CCACHE=1
export PATH="/home/<user name>/.bin:$PATH"。
 

         which arm-linux-gcc(确认链接至/home/<user name>/.bin/arm-linux-gcc)

 

         ccache –M 50G(设置ccache缓存上限)

 

         然后又在执行的prebuilt/linux-x86/ccache/ccache -M 50G。(好像很ok的样子==)

 
         1、ccache ubuntu配置
 
4 )gcc&g++ 换较低版本
         说是原版本编译4.0.3会有错误,要怎么怎么样。我没试,直接换低版本了==
 
         sudo apt-get install gcc-4.4(安装gcc-4.4)
         sudo apt-get install g++-4.4(安装g++-4.4)
 

         cd /usr/bin(进入/usr/bin)

 

         ls -l gcc*(查看文件详细信息,gcc*过滤用,结果显示gcc->gcc4.6)

         sudo mv gcc gcc.bak(将gcc备份)

         sudo ln -s gcc-4.4 gcc(链接gcc4.4至gcc)

         ls -l gcc*(再次查看确认,这时gcc->gcc4.4)

 

         ls -l g++*(查看文件详细信息,g++*过滤用,结果显示g++->g++4.6)

         sudo mv g++ g++.bak(将g++备份)

         sudo ln -s g++-4.4 g++(链接g++4.4至g++)

         ls -l g++*(再次查看确认,这时g++->g++4.4)

 

         gcc –v(确认版本)

         g++ -v(确认版本,多虑症的孩子T^T)

 
5 )编译源码

         cd ~/env/android_src/4.0.3_r1/(进入源码目录)

         source build/envsetup.sh(初始化安装环境)
         lunch full-eng(选择编译目标)

         make –j4(开始编译,4表示线程数,为内核总数或其两倍)

 
         1、如果还是open-jdk,source build/envsetup.sh时会提示找不到tool.jar
(或者是因为CLASSPATH没配的原因?我就是在这步才换的sun-jdk==)
         2、lunch为python-lunch什么的,没装的话会提示安装的
         3、未执行好source build/envsetup.sh,full-eng会提示找不到
 
         2.3.3_r1这样编译时提示需要64位系统==。这时我们需要改写配置,如下:
 

         cd ~/env/android_src/2.3.3_r1/(进入源码目录)

         gedit build/core/main.mk(编辑main.mk)

 

         ifneq (64,$(findstring 64,$(build_arch)))

修改为

         ifneq (i686,$(findstring i686,$(build_arch)))

 
继续依次修改以下文件:
         external/clearsilver/cgi/Android.mk
         external/clearsilver/java-jni/Android.mk
         external/clearsilver/util/Android.mk
         external/clearsilver/cs/Android.mk
 

         LOCAL_CFLAGS += -m64

         LOCAL_LDFLAGS += -m64

修改为

         LOCAL_CFLAGS += -m32

         LOCAL_LDFLAGS += -m32

 
         进而再执行开始描述的命令。
 
         编译完成后,会提示在out目录下生成了system.img。至于其他问题、启动我们编译的系统,参见网址吧^^。
 
6 )参考网址
         1、Ubuntu11.10下编译android源码4.0.3
                    http://taskiller.tk/archives/860
         2、ubuntu 11.10(32位系统)下编译android源码
                    http://www.cnblogs.com/dwayne/archive/2011/11/16/2251734.html
 
五、后记
         好累,终于写完了。
 
         哦,对了,这位的blog有些关于Android4.03系统的分析,大牛啊T^T。

 

         ps:下篇《使用Eclispe进行Android系统应用的开发和调试