Android源代码的编译

    技术2025-12-09  1

     

    1.搭建Android源码编译环境

    操作系统平台:Ubuntu (推荐8.04以上)

     

     

    类型选择:32位或者64位(推荐 android2.2以上默认编译平台为64位)

    官方文档说32位需要jdk1.5用来编译android api docs,要用jdk1.6则需要用64位操作系统。Vmware虚拟机内编译的用户请确认CPU支持64位并且BIOS固件开启VT虚拟化技术选项。

    更新源设置为http://mirrors.163.com/ubuntu即可(系统-系统管理-更新管理器-设置-ubuntu软件-下载至 选择163这个)

     

    下载下列必要的编译软件:

    sudo apt-get install gcc g++ flex bison gperf libsdl-dev libesd0-dev libwxgtk2.8-dev build-essential zip valgrind sun-java6-jdk zlib1g-dev libncurses5-dev

    如果编译时仍有缺少一些软件,apt-get即可

     

    安装JAVA环境:

           下载JDK

    http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载最新jdk

           安装JDK:

    sudo chmod 755 jdk-6u23-linux-i586.bin

    sudo ./ jdk-6u23-linux-i586.bin

    sudo mkdir /usr/java

    sudo mv jdk1.6.0_23/ /usr/java

    添加JAVA环境变量:

    sudo vim /etc/profile

    在文件的末尾追加:export JAVA_HOME=/usr/java/jdk1.6.0_23/

    ##注意把新添加的JDKbin目录追加在$PATH的最前面,这样当系统中安装有多个JDK版本时,程序会优先搜寻排在最前面的JDK版本。

    export PATH=$JAVA_HOME/bin:$PATH

    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

    保存/etc/profile之后,别忘了执行下面的这个命令,可以使环境变量的更改马上起作用。

    source /etc/profile

    最后检查环境变量更改是否生效:

    运行java –version 查看版本号验证成功安装了java

    到此JAVA环境和编译环境搭建完成。

     

    2.获取Android源代码

    1.Git的安装

    Ubuntu 8.10上安装git只要设定了正确的更新源,然后使用apt-get就可以了。cURL是一个利用URL语法在命令行下工作的文件传输工具,会在后面安装Repo的时候用到。

    sudo apt-get install git-core curl

    2.安装Repo

    首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中

    接下来通过cURL来下载Repo脚本,保存到~/bin/repo文件中

    curl http://android.git.kernel.org/repo >~/bin/repo

    需要给repo可执行权限

    chmod a+x ~/bin/repo

    3.初始化版本库

    如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。

    先建立一个目录,比如~/android,进去以后用repo init命令即可。 repo init -u git://android.git.kernel.org/platform/manifest.git ##注意如果出现服务器无法响应,尝试将git://改成http:// 最后会看到 repo initialized in /android这样的提示,就说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode

     

    如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如: repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

    另一种情况是,我们只需要某一个project的代码,比如kernel/common,就不需要repo了,直接用Git即可。 git clone git://android.git.kernel.org/kernel/common.git

    这也需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。

    如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.git的代码,那就先进入到common目录,然后用下面的命令: git checkout origin/android-goldfish-2.6.27 -b goldfish 

    Goldfish内核分支是可以将内核编译成avd虚拟机内核镜像的版本分支 这样我们就在本地建立了一个名为goldfishandroid-goldfish-2.6.29分支,代码则已经与android-goldgish-2.6.29同步。我们可以通过git branch来列出本地的所有分支。

    4.同步版本库 使用epo sync命令,我们把整个Android代码树做同步到本地,同样,我们可以用类似 repo sync project1 project2 …  这样的命令来同步某几个项目

    如果是同步Android中的单个项目,只要在项目目录下执行简单的 git pull即可。

     

    3.编译Android源代码

    获取Android源文件:

    比如在~/下创建一个android目录用来创建仓库:

    mkdir ~/android cd android

    repo init -u git://android.git.kernel.org/platform/manifest.git 

    repoandroidgit的一个封装,简化了一些git的操作,更容易管理和使用。初始化后会在目录下留下.repo文件,类似于git仓库下的.git一样。

    执行repo sync 同步到最新的Android源代码

     

    编译源代码:

    直接make即可

    此过程根据机器性能好坏,时间不等,起码也得一两个小时吧。耐心等待,一般没什么问题。

    加载运行:

    编译好android之后,文件会在下面目录:avd emulator~/android/out/host/linux-x86/bin

    ramdisk.imgsystem.imguserdata.img则在~/android/out/target/product /generic

    emulator的路径添加入环境变量 用如下命令加载avd虚拟机(过程略)

    emulator -system system.img -data userdata.img -ramdisk ramdisk.img

          

    4.Android模块的编译:

    android中的一个应用程序可以单独编译,编译后要重新生成system.img在源码目录下执行 $ .build/envsetup.sh

    就多出一些命令:

    - croot:   Changes directory to the top of the tree.   - m:       Makes from the top of the tree.   - mm:      Builds all of the modules in the current directory.   - mmm:     Builds all of the modules in the supplied directories.   - cgrep:   Greps on all local C/C++ files.   - jgrep:   Greps on all local Java files.   - resgrep: Greps on all local res/*.xml files.   - godir:   Go to the directory containing a file.

    可以加-help查看用法我们可以使用mmm来编译指定目录的模块

    如编译联系人:$ mmm packages/apps/Contacts/编完之后生成两个文件:out/target/product/generic/data/app/ContactsTests.apkout/target/product/generic/system/app/Contacts.apk可以使用make snod重新生成system.img,再加载运行模拟器即可

     

    5.内核镜像的编译:

    设置交叉编译链工具:

     

    android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。

    具体在/prebuit/linux-x86/toolchain/下 如:arm-eabi-4.4.0目录等

    可以选择一个工具,把该目录路径加入系统环境变量,如果是64位系统,需要安装以下软件:

    sudo apt-get install ia32-libs  这个软件允许64位系统上运行32位程序

    #注意如果在添加正确环境变量的情况下编译时出现“/bin/sh: arm-eabi-gcc: not found” 这样的错误,那么最好从CodeSourcery上面载用于交叉编译的工具链:

    http://www.codesourcery.com/gnu_toolchains/arm/download.html

    选择:EABI

    并且将下载的包解压并且添加入环境变量,使arm-none-eabi-有效

          

    获得合适的内核源代码:

    cd ~/android获得内核源代码仓库:

    git clone git://android.git.kernel.org/kernel/common.git kernelcd kernelgit branch显示* android-2.6.27

    说明你现在在android-2.6.27这个分支上,也是kernel/common.git的默认主分支。显示所有head分支:git branch -a显示* android-2.6.27remotes/origin/HEAD -> origin/android-2.6.27remotes/origin/android-2.6.25remotes/origin/android-2.6.27remotes/origin/android-2.6.29remotes/origin/android-goldfish-2.6.27remotes/origin/android-goldfish-2.6.29选取最新的android-goldfish-2.6.29goldfishandroid的模拟器模拟的CPUgit checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29git branch显示android-2.6.27* android-goldfish-2.6.29我们已经工作在android-goldfish-2.6.29分支上了。   

    设定交叉编译参数:

    打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt

    arm-eabi编译器

    ARCH ?= armCROSS_COMPILE ?= arm-none-eabi-

     

    编译内核映像:cd ~/android/kernelmake goldfish_defconfigmake     

    测试生成的内核映像:

    emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage

     

     

    有关具体细节也可以参看以下博客:

    http://www.cublog.cn/u1/41160/showart_2383618.html

    http://www.189works.com/article-6185-1.html

    http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/

     

    最新回复(0)