编译, 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就大功告成了。