Ubuntu12.04上编译Android2.3.7源码

缘起

    今年技能学习的一大目标是研究安卓的系统框架,因此最近业余时间在折腾编译Android源码。至于为嘛去编译那么老的2.3.7的源码,主要是因为买的老罗的源代码情景分析是基于2.3.7的,直接用2.3.7的源码看的时候不会有差异。

编译过程

    0、系统情况

    开始是选择直接在MBP上编译的,奈何mac上的Android编译依赖于XCode,而2.3.7的源码依赖XCode很老的版本(3.x大约),这在我的mac上是不行的,因此选择了比较容易配置的ubuntu系统,配置如下。

    系统版本:Ubuntu12.04 amd64@ VirtualBox虚拟机,宿主机就是MBP咯
    磁盘情况:80G虚拟磁盘,注意不要使用NTFS之类的移动硬盘以及共享文件夹来放源码
    内存情况:5G内存(此处太少内存会导致编译出现离奇错误)

    

    1、编译过程

        0)源码下载,这里我就不讲了,直接repo同步就好。由于众所周知的原因,这里推荐使用USTC镜像同步,速度杠杠的

        1)按照安卓官方的build步骤,准备必备的工具,apt-get分分钟搞定,谷歌build步骤

            

    $ sudo apt-get install git gnupg flex bison gperf build-essential \
      zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
      libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
      libgl1-mesa-dev g++-multilib mingw32 tofrodos \
      python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

        2)直接开始构建咯

            

     source build/envsetup.sh
     lunch full-eng
     make -j4

        3)运行构建产物看看效果吧

            执行out/host/linux_x86/bin/emulator就可以启动一个虚拟机运行编译好的系统啦

构建问题

    构建中还是遇到不少问题的,总结下来有下面几个啦


    0)gcc、g++版本问题

          由于Ubuntu12.0.4系统中默认的gcc以及g++版本是4.6x,而Android2.3.7的编译需要gcc4.4版本,所以我们需要手工安装4.4版本并且链接,方法如下

    sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib
    sudo rm -f /usr/bin/gcc
    sudo ln -s gcc-4.4 gcc
    sudo rm -f /usr/bin/g++
    sudo ln -s g++-4.4 g++

    1)/usr/bin/ld: cannot find -lz问题

            原因是系统中没有按照libz的库,可以用下面命令安装

    apt-get install zlib1g-dev

    2)repo同步问题

            在代码同步的时候遇到一个奇怪的问题,error.GitError: platform/system/bluetooth rev-list ('^276070fe8d015f3f58a515511d69a26bf863d499', 'HEAD', '--'): fatal: Not a git repository (or any parent up to mount parent /media),看描述是物理文件不全导致的,下面是解决方法

    1、删除源码目录下除了.repo文件夹的所有源码文件
    2、再次运行repo sync同步,如果代码已经同步完的话此处是很快的,相当于从git的object对象文件中迁出当前的文件到磁盘

一个要特别注意的点

    下面要说一个十分十分坑,而且容易被忽略的问题

    

    一定不要把代码放在ntfs等不区分大小写的分区,一定不要使用经过不区分大小写分区之后压缩得到的源码包

    一定不要把代码放在ntfs等不区分大小写的分区,一定不要使用经过不区分大小写分区之后压缩得到的源码包

    一定不要把代码放在ntfs等不区分大小写的分区,一定不要使用经过不区分大小写分区之后压缩得到的源码包


    如果用虚拟机一定不要用共享文件夹来放代码

    如果用虚拟机一定不要用共享文件夹来放代码

    如果用虚拟机一定不要用共享文件夹来放代码

    

    重要的事情说6遍,当年被这个问题坑了很久没找到原因也是醉。。。。。。。。  

    顺便吐槽下,难道谷歌的代码库中又同一目录放大小写不同的2个同名文件???这是什么鬼的代码规范(纯吐槽,木有验证咯)  

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。