转自:http://www.cnblogs.com/xyz123753/p/3322453.html
现在在做有关android平台下的项目,最初对android环境各种不熟悉,搞了几个月终于有点眉目了,由于需要用到android本身提供的一些类似gps,tts等服务,单纯的看android提供的java层的api感觉还是不甚痛快,最终还是痛定思痛决定看源码,也好为以后系统的移植打点基础;(ps:我要下载的是android2.3.3版本的代码)废话就到这,准备下载源码了。。。、
网上有两种方法
第一种:
磁盘工具 –>新建镜像,随便取个名字,比如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
如果遇到这这种情况的还是手动输入吧。
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
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
前面所述的下载步骤是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
至此源代码下载完毕。。。
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 编译排错/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 下面是网友提供的下载链接
sudo mkdir /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的内核编译出来了:
如果想要了解,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/
擦,终于整理完了好累,好辛苦,写博客确实好累真心感觉到了,在这里对那些发表过博文的博主说声谢谢了。。。好饿有木有,中午饭还没吃,赶紧吃饭去了;有问题请留言。。