现在在做有关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= sudo port install gmake libsdl git-core gnupg

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

POSIXLY_CORRECT= 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 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 

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个小时左右,

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

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

 #!/bin/bash
PATH=~/bin:$PATH
repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_r1
repo sync
while [ $? != ];
do
echo “ **Error: sync failed, re-sync again”
sleep
repo sync
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:

 git clone https://android.googlesource.com/kernel/common.git
git clone https://android.googlesource.com/kernel/exynos.git
git clone https://android.googlesource.com/kernel/goldfish.git
git clone https://android.googlesource.com/kernel/msm.git
git clone https://android.googlesource.com/kernel/omap.git
git clone https://android.googlesource.com/kernel/samsung.git
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.

如下图所示,当前目录下出现了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: . generic-eng
. full_passion-userdebug
. 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..sdk
改为:

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

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

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

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

Please install the 10.5 SDK on this machine at /Developer/SDKs/MacOSX10..sdk
external/qemu/Makefile.android:: *** 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::: error: expected expression
return nerr_raise(NERR_ASSERT,
^
external/clearsilver/java-jni/../util/neo_err.h::: note: expanded from macro 'nerr_raise'
nerr_raisef(__PRETTY_FUNCTION__,__FILE__,__LINE__,e,f,__VA_ARGS__)
^
external/clearsilver/java-jni/j_neo_util.c::: error: expected expression
return nerr_raise(NERR_ASSERT,
^
external/clearsilver/java-jni/../util/neo_err.h::: 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:: error: static declaration of ‘strnlen’ follows non-static

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

 static inline size_t strnlen (const char *__string, size_t __maxlen)
{
int len = ;
while (__maxlen-- && *__string++)
len++;
return len;
}

替换为:

#if 0
static inline size_t strnlen (const char *__string, size_t __maxlen)
{
int len = ;
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./bin

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

 #!/bin/bash

 export PATH=/home/farsight/andorid/android4./prebuilt/linux-x86/toolchain/arm-eabi-4.4./bin:$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make goldfish_armv7_defconfig
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

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

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. javascript垃圾收集

    javascript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存.而在C和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况 ,这是造成许多问题的一个根 ...

  2. Java 调用 PHP 实例(五)

    java代码: package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException ...

  3. js 数据函数

    //shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5]  ...

  4. 在JavaScript中进行文件处理,第五部分:Blobs

    译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 到目前为止,这个系列的帖子集中在和这些文件交互- ...

  5. Android Studio利用GitHub托管项目

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  6. GPU编程自学7 —— 常量内存与事件

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  7. MacBook下配置android adb命令使用环境

    想在Mac下使用android adb命令,常用的两种配置方式: 在MacBook下配置adb命令环境(方法一) 1.下载并安装IDE (android studio) 人性化的安装,直接点击下一步下 ...

  8. CH1807 Necklace

    题意 背景 有一天,袁☆同学绵了一条价值连城宝石项链,但是,一个严重的问题是,他竟然忘记了项链的主人是谁!在得知此事后,很多人向☆同学发来了很多邮件,都说项链是自己的,要求他归还(显然其中最多只有一个 ...

  9. XSS 与 CSRF 两种跨站攻击

    在前几年,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式, 但是现在参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了.但是历史同样悠久的 ...

  10. 使用anaconda安装tensorflow (windows10环境)

    版权声明:勤学 修德 明辨 笃实 - CSDN周雄伟 https://blog.csdn.net/ebzxw/article/details/80701613 已有环境:python3.7.1 ana ...