编译, Ubuntu, 环境, 文件

    本文只是叙述Ubuntu下编译环境的搭建和ROM的编译过程,过程中可能会需要一些Ubuntu的常规操作技巧,在本文里就不详细介绍了,Ubuntu的新手可以通过谷歌学习一下,笔者也是新手,刚用没多久,谷歌一下并不难,另外由于源码和编译后生成的文件都比较大,如果想要折腾起来的话,ubuntu的分区最好能有30G,20G的话一会就用完了,笔者之前也是分了20G,但不一会就空间不足了,故最后格掉分区,重新分了100G给ubuntu。

编译环境的搭建

    JDK安装

    a) JDK是Ubuntu下使用Android SDK,编译源代码等必备的软件包,首先我们现来装这个

    b) 从sun官方网站下载最新版的JDK,一般是个.bin的文件,笔者下载的是jdk-6u20-linux-i586.bin(根据文件不同,命令的也会有所变化,大家在使用的时候要注意,主要是文件名和路径的变化)。

    c) 由于JDK运行时会在当前目录下安装,所以在安装前,先把它移动到你想要安装的目录,比如笔者将其安装在/usr/lib/jvm/java目录下,如果你也想安装在相同目录,可以照着我下面的命令来做

    代码:
   

sudo –i 


    cd /usr/lib 


    mkdir jvm 


    cd jvm 


    mkdir java 


    cd java 


    cp “jdk-6u20-linux-i586.bin所在目录“/jdk-6u20-linux-i586.bin /usr/lib/jvm/java 


    chmod u+x jdk-6u20-linux-i586.bin 


    jdk-6u20-linux-i586.bin



    此时会出现JDK的安装提示说明,按着回车不放,提示说明会持续滚动,直到屏幕提示需要输入Yes/NO,输入YES后,即开始安装,安装完成后提示按回车继续,按完回车后,安装即告成功

    d) 与Windows不同,Ubuntu是没有注册表的,故安装完成后,我们需要把我们安装JDK的目录告诉系统,故在刚才的终端里执行如下命令(如果是新开的终端,没有执行过“sudo -i”,则需要在命令前+“sudo”获得权限)

    代码:
    gedit /etc/environment

    此时在会弹出一个文本编辑器,里面显示

    代码:
    PATH=”……”

    其中省略号部分是其默认的路径,这里我们不要动它,我们需要对这个进行一些修改,将我们的JDK安装路径写进去,告诉系统我们的JDK装在哪里,去哪里调用,故做如下修改:

  

i. 在原有的 PATH=”……” 的省略号里面添加: 


    代码: 

    PATH=”……:/usr/lib/jvm/java/jdk1.6.0_20/bin” 


    ii. 添加两行,输入如下内容: 


    代码: 

    CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_20/lib 


    JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_20 


    最后生成如下形式: 


    代码: 

    PATH=”……:/usr/lib/jvm/java/jdk1.6.0_20/bin” 


    CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_20/lib 


    JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_20


    其中,省略号部分是文件原有内容,我们在后面新加了一部分内容和两个新行。修改完成后保存退出。

    e) Ubuntu有可能会自带JDK或者安装多个JDK,此时需要将我们安装的这个设置为默认

    i. 首先,将我们的JDK安装目录加入到JDK的选择菜单,执行如下代码:

    代码:
   

update-alternatives –install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_12/bin/java 300 


    update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_12/bin/javac 300



    ii. 其次,通过命令来选择默认的JDK,执行如下代码:

    代码:

update-alternatives –config java



    iii. 最后,再来检查一下系统当前的JDK版本,输入以下代码查看:

    代码:
    java -version

    f) 至此,JDK即告安装成功。

Android SDK安装

    a) 既然是做rom,那肯定需要调试和测试的工具,Android的官方SDK同样提供官方版本,我们直接下载安装即可。

    b) 去谷歌的官网下载最新的SDK版本,前几天刚跟新了支持2.2的r6,不过SDK的官方网站在墙后,我们只能科学上网过去下载,这点比较无奈。官方提供Windows,Mac OS X,Linux三个版本,毫无疑问,我们需要下载Linux的版本。

    c) SDK不需要安装,直接解压就可以使用。建议放在主目录下,方便调用。

    d) 为了方便adb命令的使用,我们同样需要将adb命令所在的目录添加到系统环境变量中去,这样,在任何目录下都能直接调用adb,不需要现cd到SDK目录,这样会比较方便,实现方法如下:

  

代码: 

    sudo gedit ~/.bashrc 


    用文本编辑器打开.bashrc文件,然后在最后添加一行: 


    代码: 

    export PATH=${PATH}:<你sdk的目录>/tools 


    这里的需要将你sdk的安装目录添写进去,保存后即可。 


    e) 把手机连上usb,然后在终端中输入: 


    代码: 

    adb devices



    会列出所有连接在电脑上的android设备,如果看到一串数字和字母的序列号的显示的话,即表示SDK安装成功。

软件安装

    a) 配置源,更新源之类的问题就不再说了,直接说我们需要的软件,从同步源码到编译rom我们总计需要用到以下几个软件,有部分软件在我们更新过程中可能已经自动安装了,但这不影响我们工作,我把所有需要用到的程序列了出来:

• git-core 


    • gnupg 


    • flex 


    • bison 


    • gperf 


    • libsdl-dev 


    • libesd0-dev 


    • libwxgtk2.6-dev 


    • build-essential 


    • zip 


    • curl 


    • libncurses5-dev 


    • zlib1g-dev 


    • valgrind 


    • libreadline5-dev



    b) 以上这些程序均通过apt-get命令来安装,比如要安装git-core软件,我们通过输入如下命令来实现:

    代码:
    sudo apt-get install git-core

    c) 其它软件的安装过程类似,替换掉最后的软件名称即可。

    d) 安装完所有软件后,编译CyanogenMod所需要的所有环境均搭建完成了。

源码同步repo的安装

    a) CyanogenMod的源码地址是http://github.com/cyanogen/android,你可以通过网址右上角的Download Source来下载源码。不过我们并不推荐这种方式下载,因为源码的变化较为频繁,每次一旦源码有变化,我们就需要重新下载完整的源码包,既费时又费力,效率也很低,故推荐通过repo同步的方式来做,在同步过程中,仅会同步源码的变化部分,效率较高。

    b) Repo的安装

    i. repo的安装比较方便,之需要下载一个文件,并设置成可执行权限,并添加到系统环境中去即可,具体命令如下:

    代码:
    cd ~

    mkdir bin

    在你的home根目录下创建名为bin的文件夹。

    代码:
    sudo gedit ~./bashrc

    打开你的环境变量配置文件,在最后加一行:

    代码:
    export PATH=$PATH:~/bin

    修改后保存文件退出,关闭终端,重新打开一个终端,输入如下命令验证路径是否成功添加到环境变量中去了:

    代码:
    echo $PATH

    确认完后,开始安装repo,执行如下命令:

    代码:
    curl http://android.git.kernel.org/repo > ~/bin/repo
    chmod a+x ~/bin/repo

    通过curl命令将repo下载到bin中,并强其权限修改为可执行文件,至此repo的安装结束。

Repo的配置和同步

    i. 在主目录下新建一个文件夹,作为源码的存放目录

    代码:

cd ~ 


    mkdir cyanogenmod 


    cd cyanogenmod


    ii. 在cyanogenmod目录执行repo命令,设定需要同步的源码内容:

    代码:

repo init -u git://github.com/cyanogen/android.git -b eclair



    网址即为cyanogenmod的地址,-b表示我们选择需要同步的分支,cyanogenmod有不少分支,比如dount,eclair,以后还会有froyo,我们目前需要编译的是2.1,即eclair,则通过-b eclair来选择2.1的分支。

    iii. 在配置过程中,会让你选择名字和邮箱,这个会显示在你最后编译出来的rom的基础信息里,可以选择你喜欢的来写

    iv. 配置完成后,就可以开始同步源码了:

    代码:
    repo sync

    同步的过程会比较长,建议在晚上睡觉前开始同步,一般早上起来就能好了。

编译环境的设置编译环境的建立

    a) 同步玩源码后,首先需要建立编译环境,CM的源码把这些命令都写成了脚本,我们只需运行相应的脚本即可,首先,先cd到源码的根目录,然后执行如下命令:

代码: 

    ./build/envsetup.sh 


    执行后,屏幕上会显示: 


    代码: 

    including vendor/cyanogen/vendorsetup.sh


    此时,编译环境设置成功

专属文件的提取

    a) 虽然Android系统是开源的,但有部分Dream的专属文件是不开源的,所以并不包含在源码树中。但如果希望rom能在Dream真机上运行,又需要这些文件,所以需要将这些文件提取出来,在CM中,这个操作比较简单,Steve已经给我们做好脚本了。

    b) 首先你要确保安装成功了上述所有软件,然后,将Dream通过usb连接到电脑上。

    c) cd到源码的/vendor/htc/dream_sapphire目录,然后执行脚本:

    代码:
    ./extract-files.sh

    d) 这个操作会调用adb命令,从你的手机里pull所需要的专属文件到vendor目录。

编译文件的修改

    a) 默认的编译过程包含了所有的语言和程序,但其实我们并不需要这些,可以通过编译文件的修改来定义需要输出的语言和软件

    b) 打开/vendor/cyanogen/products 目录下的cyanogen.mk文件,里面定义了要输出的软件和语言,对于不需要的软件,可以直接删除。但不建议在这里修改,可以从最后的输出目录里删除不需要的,直接在这里改容易出错

    c) 在文件的最后,有一行”PRODUCT_LOCALES”,这里就包含了rom支持的语言类型,默认有几十种,编译出来后,软件会比较大,一般我们只需要保留其中的常用语言即可,笔者选择保留了en_US,zh_CN和zh_TW这三种语言,编译出来的软件就小了很多。

Kernel编译

    1. kernel是android的核心,也是最重要的部分,虽然CM源码中自带了编译完成的kernel,但既然是自主编译,那你肯定想改改kernel的信息吧,比如kernel的名字,比如打上BFS补丁、超频补丁等等,那你就需要自己来编译kernel了。

    2. 编译kernel也非常简单,首先你需要一个kernel的配置文件,CM提供了现成的,直接去/kernel-msm/arch/arm/configs 目录里找,有个配置文件叫cyanogen_msm_defconfig,这个就是我们需要的配额之文件了(如果是给Nexus编译kernel的话,需要选择cyanogen_mahimahi_defconfig)。将它复制到/kernel-msm 的根目录,然后重命名为 .config

    3. 用文本编辑器打开.config,其中有一条参数为CONFIG_LOCALVERSION=”-cyanogenmod”,这里即为kernel编译完成后显示的名字,可以把cyanogenmod改成任意你喜欢的名字。

    4. 设置完成后,就可以开始编译了。先cd到/kernel-msm目录,然后执行如下命令

  

代码: 

    export ARCH=arm 


    export CROSS_COMPILE=arm-eabi- 


    export PATH=$PATH:~/cyanogenmod/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin



    这些命令定义了编译kernel时所需要用到的环境和设置。注意第三条命令在输入的时候,路径要和自己实际安放源码的路径一致,另外,每次编译kernel前,都需要重新输入这三个命令。

    5. 命令输入完后,就可以开始make了:

    代码:
    make -j3

    make就是开始编译的命令,后面的参数-j3表示用于编译的cpu核心数量,一般是cpu核心数量+1,比如双核cpu,就用-j3这个参数。

    6. 编译过程根据配置不同而有所不同,笔者笔记本用的T6400是双核2G的,一般编译kernel的时间在10分钟内。编译后的kernel生成在/kernel-msm/arch/arm/boot/目录下,名字叫zImage

CyanogenMod编译

    1. 编译完kernel后,就可以开始编译主菜CM了。编译前需要先生成一个buildspec.mk文件,来定义需要编译的rom的基本信息。先cd到源码的根目录,新建一个空文件,名字叫buildspec.mk,并用记事本打开,输入如下信息:

   

代码: 

    TARGET_PRODUCT:=cyanogen_dream_sapphire 


    TARGET_BUILD_VARIANT:=eng 


    TARGET_BUILD_TYPE:=release 


    TARGET_PREBUILT_KERNEL:=kernel/arch/arm/boot/zImage


    a) 第一条命令表示需要编译的rom的选择,我们现在编译的是G1的rom,故选择cyanogen_dream_sapphire;

    b) 第二条命令表示编译的rom的种类,有eng和userdebug两个类型可选,我们当然选在eng;

    c) 第三个命令表示编译的rom的类型,我们选择release

    d) 第四个命令表示基于哪个kernel来编译rom,如果不设这个命令,则会基于自带的kernel来编译,既然我们自己编译了kernel,那当然用我们自己的,故设置了已经编译好的kernel的目录,供make过程调用。

    2. buildspec.mk文件建立好后,就可以开始编译rom了,cd到源码根目录,然后使用命令:

    代码:
    make -j3

    开始编译源码,源码的编译过程会比较长,试配置不同,需要的时间也不一样,笔者的T6400编译完整的CM差不多需要2个小时。

    3. 编译完成后,我们的成品就在/out/target/product目录中,里面包含了system.img,recovery.img,boot.img和system文件夹等,到这里,有点制作rom经验的朋友就不需要我再多说了吧。可以在fastboot里直接刷system.img,和boot.img;也可以将system文件夹和boot.img打包成zip包,添加更新脚本并签名,通过recovery刷到机器里,至此,我们自己编译的CyanogenMod for HTC Dream就大功告成了。