现在在做有关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,在命令行中输入命令:

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

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

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

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

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

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

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

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

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

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

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

  1. echo $PATH 

否则,在.bash_profile文件种添加

  1. PATH=/opt/local/bin:$PATH

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

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

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

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

  1. POSIXLY_CORRECT= sudo port install bison

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

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

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

  1. file:///Users/Shared/dport

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

  1. mkdir /Users/Shared/dports
  2. cd /Users/Shared/dports/
  3. svn co --revision http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
  4. portindex /Users/Shared/dports

安装3.81版的:

  1. sudo port install gmake @3.81

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

  1. gmake --version

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

  1. ulimit -S -n

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

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

  1. mkdir ~/bin

4.2,设置环境变量

  1. PATH=~/bin:$PATH

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

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

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

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

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

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

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

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

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

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

  1. 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 [ $? != ];
  6. do
  7. echo **Error: sync failed, re-sync again
  8. sleep
  9. repo sync
  10. done

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

  1. $ 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的远程源码仓库下载源码

  1. 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目录下:

  1. cd goldfish
  2. ls -al

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

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

  1. git branch -a

通过git checkout来得到源码

  1. git checkout remotes/origin/android-goldfish-2.6.

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

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

  step 3准备编译源代码喽

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

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

3.1、初始化编译环境

切换到Android源码目录:

  1. cd WORKING_DIRECTORY

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

  1. source build/envsetup.sh

3.2 选择编译选项

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

  1. $ lunch
  2. You're building on Darwin
  3.  
  4. Lunch menu... pick a combo:
  5.  
  6. . generic-eng
  7. . full_passion-userdebug
  8. . full_crespo-userdebug

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

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

  1. lunch genericeng

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

3.3 编译源码

输入下面命令开始编译:

  1. $ 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安装路径,后面会用到
  1. /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
解决方法有两个
这个是
  第一个:修改如下几个文件:

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

修改 external/qemu/Makefile.android

  1. LEOPARD_SDK :=/Developer/SDKs/MacOSX10..sdk
改为:

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

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

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

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

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

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

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

下载地址:http://download.csdn.net/detail/guoguoljg/4095743(感谢gougouljg的贡献)
  1. sudo mkdir /Developer
安装时要选择安装在/Developer中。两种方法挑一个吧,我选的是第一个,哈哈……
  1. 问题2
  1. host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c
  2. external/clearsilver/java-jni/j_neo_util.c::: error: expected expression
  3. return nerr_raise(NERR_ASSERT,
  4. ^
  5. external/clearsilver/java-jni/../util/neo_err.h::: note: expanded from macro 'nerr_raise'
  6. nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
  7. ^
  8. external/clearsilver/java-jni/j_neo_util.c::: error: expected expression
  9. return nerr_raise(NERR_ASSERT,
  10. ^
  11. external/clearsilver/java-jni/../util/neo_err.h::: note: expanded from macro 'nerr_raise'
  12. nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
  1. 解决办法:
  1. sudo bash
  2. mv /usr/bin/cc /usr/bin/cc_bak
  3. mv /usr/bin/c++ /usr/bin/c++_bak
  4. ln -s /usr/bin/llvm-gcc-4.2 /usr/bin/cc
  5. ln -s /usr/bin/llvm-g++-4.2 /usr/bin/c++
  1. 问题3 strnlen错误
  1. ./external/elfutils/config-compat-darwin.h:: 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 = ;
  4. while (__maxlen-- && *__string++)
  5. len++;
  6. return len;
  7. }

替换为:

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

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

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

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

3.5 编译goldfish内核源码 

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

  1. ls WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4./bin

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

  1. #!/bin/bash
  2.  
  3. export PATH=/home/farsight/andorid/android4./prebuilt/linux-x86/toolchain/arm-eabi-4.4./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添加可执行权限,然后执行该编译脚本:

  1. chmod a+x make_zImage.sh
  2. ./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

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

mac os 平台下载并编译android2.3.3源码的更多相关文章

  1. 【转】如何下载并编译Android4.0内核源码goldfish(图文)

    原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...

  2. Mac OS平台下应用程序安装包制作工具Packages的使用介绍(补充)

    上一篇:Mac OS平台下应用程序安装包制作工具Packages的使用介绍 补充说明 上一篇文章中介绍了如何使用Packages如何创建mac下的安装包.但是这样制作出来的安装包只能安装到系统的文件路 ...

  3. Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS)   1. 数据库表设计. 说明:无论是支付宝还 ...

  4. Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

    ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...

  5. Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...

  6. 自己动手编译hadoop-2.5.2源码

    搭建环境:Centos x 6.5  64bit (后来:我才知道原来官网上发布的就是64位的,不过这个对我来说是个学习过程,对以后进行其他平台编译的时候有帮助!) 1.安装JDK 我这里用的是64位 ...

  7. 编译最新版webrtc源码和编译好的整个项目10多个G【分享】

    编译最新版webrtc源码和编译好的整个项目10多个G[分享] 参考https://webrtc.org/native-code/development/编译最新版webrtc源码: Git clon ...

  8. 编译python(cpython)的源码及其用途

    获取python的源码 3.x及最新版本的源码:https://github.com/python/cpython python2.7分支的源码:https://github.com/python/c ...

  9. Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

    昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...

随机推荐

  1. UVA-4288 Cat vs. Dog (最大独立集)

    题目大意:猫狗大赛,s个猫和t个狗,有v个投票者,他们不是爱猫者就是爱狗者,所以爱猫者一定会对某条猫投晋级票,对某条狗投淘汰票,爱狗者亦然.现在已知这v个人的投票情况,应该使哪些畜牲晋级或淘汰才能使投 ...

  2. 12.2 Web窗体--代码片段详解

    第12章  使用Web窗体  ※ 除常规HTML元素之外,Web窗体文件还包含另外3种内容:代码片段.可编程HTML元素和控件 ※ 代码隐藏类只应包含特定于单个Web窗体的代码.如果存在多个Web窗体 ...

  3. Psping 实例

    PsPing v2.1 https://docs.microsoft.com/zh-cn/sysinternals/downloads/psping 2016/06/29 4 分钟阅读时长 By Ma ...

  4. java并发编程:线程安全管理类--原子操作类--AtomicIntegerArray

    1.类 AtomicIntegerArray

  5. 如何写入和读取从 Microsoft 消息队列在 Visual C#

    注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成.微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章.然而由机器翻译的文章并不总是完美的.它 ...

  6. Bayes' theorem (贝叶斯定理)

    前言 AI时代的到来一下子让人感觉到数学知识有些捉襟见肘,为了不被这个时代淘汰,我们需要不断的学习再学习.其中最常见的就是贝叶斯定理,这个定理最早由托马斯·贝叶斯提出. 贝叶斯方法的诞生源于他生前为解 ...

  7. 解决Jenkins权限配置错误,导致登录时出现没有Overall/read权限

    问题 由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->configure Global Security里设置用户的权限. 在启用安全-& ...

  8. protel99 se中出现许多Backup of 文件,修改过保存时,总会出现备份文件,怎么才能取消这一设置?

    在file选项左边有个向下的大箭头标示 点开 有个prefereces项 点开之 把create backup项勾掉即可

  9. Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 (需暂停服务的方式)

    Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 本机采用Ubuntu16.04系统,tar方式安装MySQL5.7.21 数据库安装文件夹为    /home/devil/mysql 现 ...

  10. Spinner的用法

    1.先自定义一个数组 2.在new一个ArrayAdapter方法: ArrayAdapter<String> adapter = new ArrayAdapter<String&g ...