mac os 平台下载并编译android2.3.3源码

现在在做有关android平台下的项目,最初对android环境各种不熟悉,搞了几个月终于有点眉目了,由于需要用到android本身提供的一些类似gps,tts等服务,单纯的看android提供的java层的api感觉还是不甚痛快,最终还是痛定思痛决定看源码,也好为以后系统的移植打点基础;(ps:我要下载的是android2.3.3版本的代码)废话就到这,准备下载源码了。。。、

step1、由于mac默认的磁盘格式是Mac OS 扩展(日志式),这个对大小写不敏感,所以需要自己动手再重新创建一个建立大小写敏感硬盘镜像,

网上有两种方法       

第一种:

磁盘工具 –>新建镜像,随便取个名字,比如Android,30GB足够了(官方建议创建的空间最小25G,创建大点的空间有助于以后的更新升级),然后注意选成Mac OS Extended (Case-sensitive, Journaled), –> Create; 路径一定要保存为~/Android.dmg。这种方法我试了下感觉好慢啊,所以我最终选择了第二种方法。

第二种:

通过terminal命令行来创建。打开terminal,在命令行中输入命令:

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 30g ~/android.dmg    

这将建立一个 .amg或者是一个.dmg.sparseimage后缀的磁盘映像. 将下面的命令添加到~/.bash_profile 文件里面.这样的话当你在命令行中执行"mountAndroid的时候,就可以加载映像文件了.

mount the android file image function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; } 

如果你的文件后缀是android.dmg.sparseimage那添加的就是

mount the android file image function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }

一旦安装,您将做所有你的工作在“android”体积。你可以驱逐它(卸载它)就像使用一个外部驱动。这里很不幸,按照上面在.bash_profile文件种添加上述代码在我使用source命令时一直报错,mountAndroid命令找不到,所以我这里只能手动输入

hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android

如果遇到这这种情况的还是手动输入吧。

step2、上面是把存放源码的空间给弄好了,下面是要弄下载和编译的准备工作了

2.1: Xcode是少不了的,没有安装的同学还是安装吧,我也是刚安装的。没安装的就安装个最新版的,这个直接在appStore就下载了方便。

2.3:安装MacPorts之前需要确认环境变量PATH中,/opt/local/bin出现在/usr/bin之前,可以运行一下这行来确认:

echo $PATH 

否则,在.bash_profile文件种添加

 PATH=/opt/local/bin:$PATH

特别说明:下面的一些知道step3的步骤我这边总出问题就跳过了,事实上也没影响后面源代码的下载,跳不跳过就取决与你了

从MacPorts安装make, git, and GPG packages:

POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg

如果你是Mac OS X 10.4版本的话,还要安装个bison

POSIXLY_CORRECT=1 sudo port install bison

下面要把gmake 3.82还原到3.81,否则之后编译源码会出错:(3.82有Bug,用不了):

sudo vim /opt/local/etc/macports/sources.conf

然后在rsync那行的上面一行加上

file:///Users/Shared/dport

之后按这个步骤来就行了:

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

安装3.81版的:

sudo port install gmake @3.81

检查一下gmake版本,看到版本号是3.81就对了:

gmake --version

于是最后下载Android源码前的最后一步就是,修改文件标识符限制:
由于Mac OS 默认将同时打开的文件标识符数量限制得太小,并行编译处理时可能会超出这个限制。所以在 ~/.bash_profile 里加上这么一段:
# set the number of open files to be 1024

ulimit -S -n 1024

step4、开始下载android的源码了,开心啊

4.1,在你的home目录下创建文件夹 /bin

mkdir ~/bin

4.2,设置环境变量

PATH=~/bin:$PATH

4.3,下载repo工具.并且给这个工具可执行权限

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo

4.4,初始化repo客户端,因为是mac os系统,所以将之前创建的 android.dmg.sparseimage 映像挂载上,执行下面的命令:

//挂载映像(ps: 这个命令我这边没法执行只能退而求其次执行这个 hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android)
mountAndroid  
//进入到这个映像目录里面
cd /Volumes/android
//创建工作目录文件夹 
mkdir WORKING_DIRECTORY
//进入到这个目录下
cd WORKING_DIRECTORY 

4.5、初始化repo工具,准备访问google源码仓库:

repo  init -u  https://android.googlesource.com/platform/manifest -b android-2.3.3_r1 

 有的时候如果使用上面的命令不能连接android服务器,我们可以使用下面的命令连接:

repo init -u   https://android.googlesource.com/a/platform/manifest -b android-2.3.3_r1

这个时候,要保证您的mac能够上网,并且能正常连接到Android服务器,在初始化完repo工具后,会让你输入gmail邮箱及用户名验证。

4.6、下载源码通过执行下面的命令,开始下载Android源码:

repo sync  

如果你的PC机足够给力,可以在命令后面加上–jn,n表示多个线程同时下载,可以提高下载速度。

然后是漫长的等待,当然如果你网速足够给力下载时间会被大大的压缩的,我这20M的带宽下完也就4个小时左右,

小睡一会打打游戏或者干点别的很快就过去了。。

有的时候,网络可能会断,或者出现什么别的错误我们可以使用下面的脚本来进行下载,当出错时,会自动下载。

 1 #!/bin/bash
 2 PATH=~/bin:$PATH
 3 repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_r1
 4 repo sync
 5 while [ $? != 0 ]; 
 6 do
 7          echo “  **Error: sync failed, re-sync again”
 8          sleep 5
 9          repo sync
10 done

 

如果你执行这个脚本有问题的的可以手动执行下面命令,反正都是下载同步都OK啦

$ repo sync

4.7、其它源码下载源

前面所述的下载步骤是Google放出一官方版本的Android代码,它里面通常只有模拟器和部分和Google有合作关系设备的源码,如果要想编译一个目标设备的Android4.0.1系统,我们肯定要对其进行定制,不过有一些知名的设备生产厂商或第三方厂商,也会开源针对自己设备的Android系统,如:三星,高通等,比较专业的,网址如下:

www.linaro.org

linaro网站主要是ARM的芯片的最新Android解决方案,如:基于三星猎户座芯片的origen开发板,基于TI的OMAP系统芯片的PandaBoard板,基于Nova A9500 ARM 双核Cortex A9的snowball开发板等。

如果从上述网站上下载源码,要根据上述网站的说明进行相关操作。

4.8、下载Goldfish内核源码

Google在开发Android系统的同时,使用qemu开发了针对每个版本的一个模拟器,这大大降低了开发人员的开发成本,便于Android技术的推广。qemu是一个开源的模拟处理器软件,而Google使用qemu模拟的是ARM926ej-S的Goldfish处理器,如果开发人员在没有目标开发板的情况下,要对硬件进行操作的话,必然要去操作Android底层的驱动,我们可以使用模拟器的内核源码。

从Android的远程源码仓库下载源码

git clone http://android.googlesource.com/kernel/goldfish.git 

 当然,如果你要编译指定目标平台的kernel的话,也可以从指定的仓库里下载,官方给出了下列处理器的kernel:

1 git clone https://android.googlesource.com/kernel/common.git
2 git clone https://android.googlesource.com/kernel/exynos.git
3 git clone https://android.googlesource.com/kernel/goldfish.git
4 git clone https://android.googlesource.com/kernel/msm.git
5 git clone https://android.googlesource.com/kernel/omap.git
6 git clone https://android.googlesource.com/kernel/samsung.git
7 git clone https://android.googlesource.com/kernel/tegra.git

大概几十分钟后,下载完了,如下图所示:

 

进入到goldfish目录下:

cd goldfish
ls -al

通过ls –al命令查看当前目录,可以看到隐藏的.git

 

通过git branch –a来查看所以分支:

git branch -a

 

通过git checkout来得到源码

git checkout remotes/origin/android-goldfish-2.6.29

如下图所示,当前目录下出现了Linux内核源码的目录结构:

至此源代码下载完毕。。。

  step 3准备编译源代码喽

关于android系统的编译,Android的官方网站上也给出了详细的说明。

http://source.android.com/source/building.html

3.1、初始化编译环境

切换到Android源码目录:

cd WORKING_DIRECTORY

执行下面命令,加载编译过程中用到的命令、环境变量:

source build/envsetup.sh

3.2 选择编译选项

执行下面的命令,从列表中选择一个编译项:

$ lunch
You're building on Darwin
 
Lunch menu... pick a combo:

     1. generic-eng
     2. full_passion-userdebug
     3. full_crespo-userdebug

 

当然在lunch命令时出现的提示可能有所不同这个都没有关系

我们选择:1,也就是说,编译generic-eng的目标,当然我们也可以直接指定编译项,如下:

lunch generic-eng

 

其中,lunch命令是指打印或设置出当前系统中设置的编译项,generic-eng这个编译项由两部分组成,其中前半部分generic表示目标设备为Android的模拟器,官方解释为:后半部分eng表示带有调试功能的工程机。

3.3 编译源码

输入下面命令开始编译:

 $ make -jn

 其中,-jn表示,n个线程同时编译,一般n的值为CPU核的2倍,但是,也要和你的Ubuntu的内存有关系,每个线程在编译时最少需要1G内存,如果你没有很多内存,还是直接使用make命令吧,否则,编译到后面会出错。

 3.4 编译排错
真的很讨厌编译的时候竟然还不能顺顺当当的
问题1、
由于我装的Xcode是最新版本4.6.3,它所带的SDK的版本是10.8,而且也没有生成/Developer之类的目录,所以make的时候就出现下面的提示
Please install the 10.5 SDK on this machine at /Developer/SDKs/MacOSX10.5.sdk
下面这个是MacOSX SDK安装路径,后面会用到
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

 

解决方法有两个
这个是
  第一个:修改如下几个文件:

此时请保准你当前的路径是在你下载android源代码的目录下 

修改 external/qemu/Makefile.android

LEOPARD_SDK :=/Developer/SDKs/MacOSX10.5.sdk

 

改为:
LEOPARD_SDK :=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

 第二个文件:build/core/combo/HOST_darwin-x86.mk

sdk_105_root :=/Developer/SDKs/MacOSX10.5.sdk
改为: 
sdk_105_root :=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

 以上两个文件解决了下面的问题:

Please install the 10.5 SDK on this machine at /Developer/SDKs/MacOSX10.5.sdk  
external/qemu/Makefile.android:82: *** Aborting the build..  Stop.  

网上有人建议将external/qemu/Android.mk文件全部注释或者删除,此方法不可取,因为这样做你最后是得不到emulator这个可执行文件的,相当于大部分工作没做.

  第二个解决方法就是手动安装 MacOSX10.5.sdk 下面是网友提供的下载链接

下载地址:http://download.csdn.net/detail/guoguoljg/4095743(感谢gougouljg的贡献)
sudo mkdir /Developer
安装时要选择安装在/Developer中。两种方法挑一个吧,我选的是第一个,哈哈……
问题2
host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c
external/clearsilver/java-jni/j_neo_util.c:258:12: error: expected expression
    return nerr_raise(NERR_ASSERT,
           ^
external/clearsilver/java-jni/../util/neo_err.h:88:69: note: expanded from macro 'nerr_raise'
   nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
                                                                    ^
external/clearsilver/java-jni/j_neo_util.c:269:12: error: expected expression
    return nerr_raise(NERR_ASSERT,
           ^
external/clearsilver/java-jni/../util/neo_err.h:88:69: note: expanded from macro 'nerr_raise'
   nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
解决办法:
sudo bash
mv /usr/bin/cc /usr/bin/cc_bak
mv /usr/bin/c++ /usr/bin/c++_bak
ln -s /usr/bin/llvm-gcc-4.2 /usr/bin/cc
ln -s /usr/bin/llvm-g++-4.2 /usr/bin/c++
问题3 strnlen错误
./external/elfutils/config-compat-darwin.h:42: error: static declaration of ‘strnlen’ follows non-static

修改 ./external/elfutils/config-compat-darwin.h.

1 static inline size_t strnlen (const char *__string, size_t __maxlen)
2 {
3 int len = 0;
4 while (__maxlen-- && *__string++)
5 len++;
6 return len;
7 }

替换为:

#if 0
static inline size_t strnlen (const char *__string, size_t __maxlen)
{
int len = 0;
while (__maxlen-- && *__string++)
len++;
return len;
}
#endif
//其实也就将这个strnlen这个函数注释掉,本身就是因为重复定义strnlen这个函数导致的问题

 问题4 symbol(s) not found for architecture i386

解决:
--------------------------------------------
cp external/qemu/Android.mk external/qemu/Android.mk_backup
vim external/qemu/Android.mk
 //全部加#注释掉

 问题解决了,就好好的等吧,

3.5 编译goldfish内核源码 

编译Linux源码必然要先指定gcc交叉编译器,我们直接使用Android自带的arm-eabi-4.4.3编译器,它在WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin路径下。 

ls WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

我们编译下面一个编译脚本make_zImage.sh,让这个脚本去编译goldfish的内核

1 #!/bin/bash
2 
3 export PATH=/home/farsight/andorid/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
4 export ARCH=arm
5 export SUBARCH=arm 
6 export CROSS_COMPILE=arm-eabi-  
7 make goldfish_armv7_defconfig  
8 make

 

给make_zImage.sh添加可执行权限,然后执行该编译脚本:

chmod a+x make_zImage.sh
./make_zImage.sh

当我们看到下面的结果时,表示goldfish的内核编译出来了:

3.6 Android编译过程分析

如果想要了解,Android的编译过程,可以参照下面三篇博文:

Android编译系统详解(一):http:/blog.csdn.net/mr_raptor/article/details/7539978

Android编译系统详解(二):http://blog.csdn.net/mr_raptor/article/details/7540066

Android编译系统详解(三):http:/blog.csdn.net/mr_raptor/article/details/7540730

按照google给出的编译步骤如下:

  1> source build/envsetup.sh:加载命令

  2> lunch:选择目标平台编译选项

  3> make:执行编译

我们按照编译步骤来分析编译过程的细节,最终添加自己的平台产品的编译选项。

参考文章

 很感谢下面的博主,他们的博文让我解决了一个又一个问题,在这真诚的说声谢谢!!

http://blog.csdn.net/mr_raptor/article/details/7946254  (ps:我不会告诉你这位博主很牛XX的)

http://blog.csdn.net/ym19860303/article/details/7735010

http://blog.csdn.net/wawxf2008/article/details/8648662

http://blog.csdn.net/anydroid/article/details/8228415

http://jinganglang777.blog.163.com/blog/static/79085497201273061657988/

http://blog.sephiroth.it/

PS

擦,终于整理完了好累,好辛苦,写博客确实好累真心感觉到了,在这里对那些发表过博文的博主说声谢谢了。。。好饿有木有,中午饭还没吃,赶紧吃饭去了;有问题请留言。。

posted @ 2013-09-15 12:41  戊辰岁终  阅读(1700)  评论(0编辑  收藏  举报