购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 编译源码

知识点讲解:光盘:视频\知识点\第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 编译过程的界面截图

整个编译过程也非常漫长,需要读者耐心等待。

2.3.1 搭建编译环境

在编译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

2.3.2 开始编译

当所依赖的包安装完成之后,就可以开始编译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

2.3.3 在模拟器中运行

在模拟器中运行的步骤就比较简单了,只需在终端中执行下面的命令即可。

emulator

运行成功后的效果如图2-15所示。

图2-15 提示在邮件中得到下载地址

2.3.4 常见的错误分析

虽然编译方法非常简单,但是作为初学者来说很容易出错,在下面列出了其中常见的编译错误类型。

(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源码后,在终端会输出如下提示。 GWqlaT0xbj4HSRwxdaqwa14o05qrN3JjUgUcsumc+fh1CmB6dPu6fytLF98NjuZx

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#
点击中间区域
呼出菜单
上一章
目录
下一章
×