zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    OC 单例实现
    iOS 代码调试
    iOS
    iOS 11 scroll滚动偏移,tableview偏移44,获取view的宽和高
    swift 约束
    OC
    OC 线程操作
    OC 线程操作
    【第35题】2019年OCP认证12C题库062考试最新考试原题-35
    【第34题】2019年OCP认证12C题库062考试最新考试原题-34
  • 原文地址:https://www.cnblogs.com/xyz123753/p/3322453.html
Copyright © 2011-2022 走看看