Android 系统编译环境设置及源代码编译

一. 摘要
   虽然已经在Android系统工作了一段时间, 但是每次需要重新setup环境的时候,都需要花一点时间, 所以就想借着这次在ubuntu 12.04 64bits系统上重新安装的机会, 将安装过程记录下来, 下次照着做就行了, 或者将所有步骤做成一个脚本, 直接运行, 即可以轻松的将环境设置好。
   本文还包括如何编译Android系统源代码, 其中包含kernel部分的编译和上层系统的编译, 本文所使用的环境是在Ubuntu 12.04 64bits系统上, 所用的Android系统的版本号是4.2.1_r1, 编译后的image在Galaxy Nexus上可以运行成功。

二. 环境设置及软件安装
    首先要安装必要的linux工具, 操作系统的选择是必须选择64位操作系统, 一般是Ubuntu 11.04, 11.10 和12.04 版本。12.04系统虽然不是Google推荐的系统, 但是有了很多前人的尝试后, 这个系统也能用来编译Android系统源代码了。
    如果选择的是Ubuntu 11.04 系统, 请运行命令安装工具:
    $ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc
 
    On Ubuntu 11.10, 还要再执行:
    $ sudo apt-get install libx11-dev:i386
 
    On Ubuntu 12.04:
    $ sudo apt-get install git-core 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 openjdk-6-jdk 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
    如果选择Ubuntu 12.04 版本, 因为这个版本自带的gcc版本为4.6, 编译Android源代码有些问题, 所以还需要安装4.4 版本的gcc。
    $ sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib

    安装JAVA SDK
    因为Android系统所需的JAVA SDK 必须采用Oracle公司的JDK, 所以需要从Oracle网站下载相应版本的JDK, 本文所选用的是jdk-6u33-linux-x64.bin。
    在JDK文件所在的目录执行命令:
    $ chmod a+x jdk-6u33-linux-x64.bin
    $ ./jdk-6u33-linux-x64.bin
    $ sudo mv jdk1.6.0_33  /usr/lib/jvm/

    这样JDK已经安装在系统的/usr/lib/jvm/下, 还需要将JAVA的路径放在系统的环境变量中。
    打开/etc/profile文件:
    $ sudo gedit /etc/profile
    将以下文字拷贝到此文件中:
    export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_33   
    export JRE_HOME=${JAVA_HOME}/jre   
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib   
    export PATH=${JAVA_HOME}/bin:$PATH  
    
    因为在Ubuntu 12.04系统中 ,系统中默认的JDK环境是OpenJDK, 所以需要设置Oracle JDK为默认的JDK环境:
    $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_33/bin/javac 300
    $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_33/bin/java 300
    $ sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_33/bin/javaws 300
    $ sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.6.0_33/bin/jar 300
    $ sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/jdk1.6.0_33/bin/javadoc 300
    $ sudo update-alternatives --config javac
    $ sudo update-alternatives --config java
    $ sudo update-alternatives --config javaws
    $ sudo update-alternatives --config jar
    $ sudo update-alternatives --config javadoc

    最后敲入下面命令检查JDK环境是否安装成功。

    $ java --version

    配置udev, 使之能够识别Android手机, 并装上USB驱动, 能够运行adb命令。

    $ sudo gedit /etc/udev/rules.d/51-android.rules
    This file should get the contents:
    Quote:
    # adb protocol on passion (Nexus One)
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
    # fastboot protocol on passion (Nexus One)
    SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
    # adb protocol on crespo/crespo4g (Nexus S)
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
    # fastboot protocol on crespo/crespo4g (Nexus S)
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
    # adb protocol on stingray/wingray (Xoom)
    SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
    # fastboot protocol on stingray/wingray (Xoom)
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
    # adb protocol on maguro/toro (Galaxy Nexus)
    SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
    # fastboot protocol on maguro/toro (Galaxy Nexus)
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
    # adb protocol on panda (PandaBoard)
    SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
    # fastboot protocol on panda (PandaBoard)
    SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
    # usbboot protocol on panda (PandaBoard)
    SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
    # usbboot protocol on panda (PandaBoard ES)
    SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"

    Don't forget to replace the red marked text with your username from Ubuntu or Linux Mint.

    在谷歌官方网站下载Android SDK, 安装步骤安装SDK及工具。安装好后, 记得将工具adb, fastboot所在的目录放在当前用户和root用户的PATH路径中。
    

三. 下载源代码
    源代码的下载可以参照Google网站 https://source.android.com/source/downloading.html 来做, 但是由于国内网络的原因, google网站又是不能访问, 所以需要单独来讲。
    Google Android的代码使用Git来管理的, 在Git的基层上, Google自己用Python语言重新封装一套代码管理工具, 也就是Repo。

    首先建立存放工具的目录:
    $ mkdir ~/bin
    $ export PATH=~/bin:$PATH
    
    下载并安装Repo:
    $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo

    但是由于在国内该网站经常不能访问, 所以建议使用 http://code.google.com/p/git-repo/downloads/list 此链接下载。
    
    接下来下载Android系统源代码, Android源码现在直接由Google(android.googlesource.com)管理。
    按照Google官方网站上来做的话, 用repo/git下载源码时,执行

    $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.2.1_r1

    会报错误 异常为  DownloadError: android.googlesource.com: <urlopen error [Errno 110] Connection timed out>

    解决方法

    1. 浏览器登录https://android.googlesource.com/new-password,并用gmail帐号登录;
    2. 点击网页上的“允许访问”,得到类似
       machine android.googlesource.com login git-<userName>.gmail.com password <password>  
       machine android-review.googlesource.com login git-<userName>.gmail.com password <password>
    3. 把上面那段信息追加到~/.netrc文件结尾(请检查当前用户的权限, 如果不存在此文件则自己新建一个);
    4. 下载地址的URI更改为https://android.googlesource.com/a/platform/manifest(中间加上了“/a”)。
    5. $ repo init -u https://android.googlesource.com/a/platform/manifest -b android-4.2.1_r1
    6. $ repo sync

    即可拉下Android源码。

    官方的说法是:因为访问基本是匿名的,为了防止连接过多(指内网/虚拟机),对同一IP地址的连接数做了一定的限制。看来是用gmail帐号进行认证。这样的话,在公司网络内或者用虚拟机下载的话,会经常遇到这问题。

    接下来是下载Kernel代码:
    下载Kernel代码之前, 可以不下载Android系统的源代码, 如果这样的话, 先要下载Android系统 device部分的代码,以Galaxy Nexus 为例, Galaxy Nexus代号为maguro.

    点击网址 https://android.googlesource.com/device/samsung/maguro, 获取想要下载的branch:
    Quote:
    $ mkdir ~/src/kernel
    $ cd ~/src/kernel
    $ git clone https://android.googlesource.com/device/samsung/maguro -b jb-mr1-release
    
    点击网站 https://android.googlesource.com/kernel/omap.git, 获取想要下载的branch:
    Quote:
    $ cd maguro
    $ git clone https://android.googlesource.com/kernel/omap.git -b android-omap-tuna-3.0-jb-mr1

    确定ARM编译工具在你的路径中.
    如果你之前下载了Android系统代码, 就不需要这一步, 否则需要敲入如下命令。
    Quote:
    $ git clone https://android.googlesource.com/platform/prebuilt -b jb-mr1-release
    $ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
    $(pwd) is a variable holding the current working directory.

    你同样可以将工具链下载在另外的目录.
    Quote:
    $ mkdir ~/src/toolchain
    $ cd ~/src/toolchain
    $ git clone https://android.googlesource.com/platform/prebuilt -b jb-mr1-release
    $ export PATH=~/src/toolchain/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
    
    
四. 编译代码
    Android系统源代码编译:
    如果使用的是Ubuntu 12.04 系统, 在编译前先检查文件:build/core/combo/HOST_linux-x86.mk, 确保HOST_GLOBAL_CFLAGS的定义是这样的:
    HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

    然后敲入命令进行编译:
    $ source ./build/envsetup.sh
    $ lunch 12
    $ make CC=gcc-4.4 CXX=g++-4.4 -j4

    kernel源代码编译方法:
    Quote:
    $ cd omap
    $ export ARCH=arm
    $ export SUBARCH=arm
    $ export CROSS_COMPILE=arm-eabi-
    $ make tuna_defconfig

    $ make -j4

    kernel编译成功后, 需要将编出的zImage文件拷贝到device/samsung相应的目录, 再使用上面系统编译的方法生产boot.img文件。


五. 烧写image
    编译成功后, 得到boot.img, system.img, userdata.img, 重烧系统是主要是将这三个文件重新flash进手机的ROM里, 其中boot.img是内核文件, system.img包含Android底层, framework, 和应用程序, userdata.img是用户数据, 一般是空的。
    首先使手机进入fastboot mode, 有些手机是在关机时按住音量键的同时开机, 可以进入fastboot mode。或者敲入命令:
    $ adb reboot bootloader
    
    在烧写image前, 确保手机的bootloader是解锁的, 如果没有解锁, 请在手机进入fastboot mode后敲入命令:
    $ fastboot oem unlock

    然后依次烧写image
    $ sudo fastboot flash boot boot.img
    $ sudo fastboot flash system system.img
    $ sudo fastboot flash userdata userdata.img
    $ sudo fastboot reboot


六. Android系统常用命令
    经过上面的步骤后, Galaxy Nexus手机已经可以运行我们自己编译的系统了, 要开发应用程序的同学可以安装Eclipse进行开发, 或者在Android源代码包里直接添加相应的文件进行应用程序的开发。

    Android系统上常用的命令是adb, 全名是 Android Debug Brdige。此命令需要在开启开发模式后方可使用。Android 4.2的系统默认隐藏了开发模式, 开发者需要连续点击 设置里的关于手机里的版本号七次, 方可启动开发模式。

    ADB 常用命令:
    $ adb root               #切换为root用户
    $ adb remount            #挂载手机文件系统
    $ adb push               #拷贝文件如手机
    $ adb pull               #把文件从手机拷出, 某些安检严格公司的员工必用
    $ adb logcat             #打印手机log
    $ adb shell              #登录手机
    $ adb shell strace       #察看某些手机程序的系统调用
    $ adb shell cat /proc/kmesg     #察看手机内核打印消息

<本文linker : http://blog.csdn.net/amicablehj/article/details/8570334>

其他参考:

http://blog.csdn.net/mr_raptor/article/details/7539978

posted @ 2013-12-25 01:33  MMLoveMeMM  阅读(730)  评论(0编辑  收藏  举报