



知识点讲解:光盘:视频\知识点\第2章\编译源码.avi
编译Android源码的方法非常简单,只需使用Android源码根目录下的Makefile,执行make命令即可轻松实现。当然在编译Android源码之前,首先要确定已经完成同步工作。进入Android源码目录使用make命令进行编译,使用此命令的格式如下:
$: cd ~/Android 5.0(这里的“Android 5.0”就是我们下载源码的保存目录) $: make
编译Android源码可以得到“~/project/android/cupcake/out”目录,笔者的截图界面如图2-14所示。
图2-14 编译过程的界面截图
整个编译过程也非常漫长,需要读者耐心等待。
在编译Android源码之前,需要先进行环境搭建工作。在接下来的内容中,以Ubuntu系统为例讲解搭建编译环境以及编译Android源码的方法。具体流程如下。
(1)安装JDK,编译Android 5.0的源码需要JDK插件,可以下载jdk-6u22-linux-i586.bin后进行安装,对应命令如下:
$ cd /usr $ mkdir java $ cd java $ sudo cp jdk-6u22-linux-i586.bin所在目录 ./ $ sudo chmod 755 jdk-6u22-linux-i586.bin $ sudo sh jdk-6u22-linux-i586.bin
(2)设置JDK环境变量,将如下环境变量添加到主文件夹目录下的.bashrc文件中,然后用source命令使其生效,加入的环境变量代码如下:
export JAVA_HOME=/usr/java/jdk1.6.0_23 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/bin/tools.jar:$JRE_HOME/bin export ANDROID_JAVA_HOME=$JAVA_HOME
(3)安装需要的包,读者可以根据编译过程中的提示进行选择,可能需要的包的安装命令如下:
$ sudo apt-get install git-core bison zlib1g-dev flex libx12-dev gperf sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
当所依赖的包安装完成之后,就可以开始编译Android源码了,具体步骤如下。
(1)首先进行编译初始化工作,在终端中执行下面的命令:
source build/envsetup.sh
或:
. build/envsetup.sh
执行后将会输出:
source build/envsetup.sh including device/asus/grouper/vendorsetup.sh including device/asus/tilapia/vendorsetup.sh including device/generic/armv7-a-neon/vendorsetup.sh including device/generic/armv7-a/vendorsetup.sh including device/generic/mips/vendorsetup.sh including device/generic/x86/vendorsetup.sh including device/samsung/maguro/vendorsetup.sh including device/samsung/manta/vendorsetup.sh including device/samsung/toroplus/vendorsetup.sh including device/samsung/toro/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash
(2)然后选择编译目标,命令如下:
lunch full-eng
执行后会输出如下的提示信息。
============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=5.0 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-2.6.32-45-generic-x86_64-with-Ubuntu-10.04-lucid HOST_BUILD_TYPE=release BUILD_ID=JOP40C OUT_DIR=out ============================================
(3)接下来开始编译代码,在终端中执行下面的命令:
make -j4
其中-j4表示用4个线程进行编译。整个编译进度根据不同机器的配置而需要不同的时间。例如笔者电脑为intel i5-2300四核2.8,4G内存,经过近4小时才编译完成。当出现下面的信息时表示编译完成。
target Java: ContactsTests (out/target/common/obj/APPS/ContactsTests_intermediates/classes) target Dex: Contacts Done! Install: out/target/product/generic/system/app/Browser.odex Install: out/target/product/generic/system/app/Browser.apk Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Copying: out/target/common/obj/APPS/Contacts_intermediates/noproguard.classes.dex target Package: Contacts (out/target/product/generic/obj/APPS/Contacts_intermediates/package.apk) 'out/target/common/obj/APPS/Contacts_intermediates/classes.dex' as 'classes.dex'... Processing target/product/generic/obj/APPS/Contacts_intermediates/package.apk Done! Install: out/target/product/generic/system/app/Contacts.odex Install: out/target/product/generic/system/app/Contacts.apk build/tools/generate-notice-files.py out/target/product/generic/obj/NOTICE.txt out/target/product/generic/obj/ NOTICE.html "Notices for files contained in the filesystem images in this directory:" out/target/product/generic/ obj/NOTICE_ FILES/src Combining NOTICE files into HTML Combining NOTICE files into text Installed file list: out/target/product/generic/installed-files.txt Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img Running: mkyaffs2image -f out/target/product/generic/system out/target/product/generic/obj/PACKAGING/syste- mimage_intermediates/system.img Install system fs image: out/target/product/generic/system.img DroidDoc took 5331 sec. to write docs to out/target/common/docs/doc-comment-check
在模拟器中运行的步骤就比较简单了,只需在终端中执行下面的命令即可。
emulator
运行成功后的效果如图2-15所示。
图2-15 提示在邮件中得到下载地址
虽然编译方法非常简单,但是作为初学者来说很容易出错,在下面列出了其中常见的编译错误类型。
(1)缺少必要的软件
进入Android目录下,使用make命令编译,可能会发现出现如下错误提示。
host C: libneo_cgi <= external/clearsilver/cgi/cgi.c external/clearsilver/cgi/cgi.c:22:18: error: zlib.h: No such file or directory
上述错误是因为缺少zlib1g-dev,需要使用apt-get命令从软件仓库中安装zlib1g-dev,具体命令如下:
sudo apt-get install zlib1g-dev
同理需要安装下面的软件,否则也会出现上述类似的错误。
sudo apt-get install flex sudo apt-get install bison sudo apt-get install gperf sudo apt-get install libsdl-dev sudo apt-get install libesd0-dev sudo apt-get install libncurses5-dev sudo apt-get install libx12-dev
(2)没有安装Java环境JDK
当安装所有上述软件后,运行make命令再次编译Android源码。如果在之前忘记安装Java环境JDK,则此时会出现很多Java文件无法编译的错误,如果打开Android的源码,可以看到在如下目录中下发现有很多Java源文件。
android/dalvik/libcore/dom/src/test/java/org/w3c/domts
这充分说明在编译Android之前必须先安装Java环境JDK,安装流程如下。
在Ubuntu 8.04中,“/etc/profile”文件是全局的环境变量配置文件,它适用于所有的shell。在登录Linux系统时应该先启动“/etc/profile”文件,然后再启动用户目录下的“~/.bash_profile”、“~/.bash_login”或“~/.profile”文件中的一个,执行的顺序和上面的排序一样。如果“~/.bash_profile”文件存在话,则还会执行“~/.bashrc”文件。在此只需要把JDK的目录放到“/etc/profile”目录下即可。
JAVA_HOME=/usr/local/src/jdk1.6.0_16 PATH=$PATH:$JAVA_HOME/bin:/usr/local/src/android-sdk-linux_x86-1.1_r1/tools:~/bin
ava version "1.6.0_16" Java(TM) SE Runtime Environment (build 1.6.0_16-b01) Java HotSpot(TM) Client VM (build 13.2-b01, mixed mode, sharing)
当成功编译Android源码后,在终端会输出如下提示。
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img Install system fs image: out/target/product/generic/system.img Target ram disk: out/target/product/generic/ramdisk.img Target userdata fs image: out/target/product/generic/userdata.img Installed file list: out/target/product/generic/installed-files.txt root@dfsun2009-desktop:/bin/android#