第2章 搭建Android开发环境
本章主要介绍如何搭建Android底层开发的环境,主要包括Android应用程序开发环境、Android NDK开发环境和交叉编译环境的搭建。虽然本书主要介绍Android移植及Linux驱动开发,但仍然需要编写Android应用程序及Android NDK程序来测试Linux驱动、HAL程序库等底层的程序,所以Android底层开发不仅需要交叉编译环境,还需要开发Android应用程序的环境。当然,如果读者不想重新配置一遍开发环境,也可以直接使用随书光盘中的VMWare Ubuntu Linux映像文件来测试本书的例子。
2.1 Android底层开发需要哪些工具
虽然本书主要讲解如何开发Linux驱动程序,但仍然需要Android应用程序以及Android NDK程序来测试Linux驱动。因此,不仅需要配置Linux驱动的开发环境,还需要配置开发Android应用程序以及Android NDK程序的开发环境。除此之外,还需要一些辅助工具测试Linux驱动及调试开发板。由于Android基于Linux内核,所以强烈建议使用Linux(建议使用Ubuntu Linux 10.04或以上版本,本书将以Ubuntu Linux 11.10作为平台来讲解Linux驱动的开发)作为开发Linux驱动的平台,因为这样更容易测试和调试Linux驱动。下面看看开发、测试和调试Linux驱动、HAL程序库需要哪些工具:
□ JDK6或以上版本;
□ Eclipse 3.4或以上版本;
□ ADT(用于开发Android应用程序);
□ CDT(用于开发Android NDK程序);
□ Android SDK;
□ Android NDK;
□ 交叉编译环境;
□ Linux内核源代码;
□ Android源代码;
□ 用于调试开发板的串口工具:minicom。
其中Linux内核源代码和Android源代码会在第4章介绍。串口调试工具minicom会在第5章介绍S3C6410开发板时一并介绍。
2.2 安装JDK
在Ubuntu Linux中安装JDK的方法很多,可以从如下的官方网站直接下载JDK,并进行配置。
JDK的下载地址
http://www.oracle.com/technetwork/java/javase/downloads/index.html
直接下载JDK的压缩包(tar.gz),并将其解压缩(可以解压到任何目录,如/developer/jdk6),然后在Linux终端输入如下的命令打开profile文件来设置PATH环境变量。
# gedit /etc/profile
打开profile文件后,在文件的最后输入如下的内容。
export PATH=.:/developer/jdk6/bin:$PATH
注意
PATH和等号(=)之前及等号(=)和点(.)之间不能有空格、tab等字符
保存profile文件后,在Linux终端中输入如下两条命令中的任何一条重新装载profile文件即可。
source命令
# source /etc/profile
点(.)命令
# . /etc/profile
读者可以用下面的命令来查看PATH环境变量的值。
echo $PATH
Ubuntu Linux提供了更简单的方式安装JDK,在Linux终端执行下面的命令可自动安装JDK6 (执行命令的过程中需要连接Internet)。
# add-apt-repository "deb http://archive.canonical.com/ lucid partner" # apt-get update # apt-get install sun-java6-jdk
执行上面的命令后,并不需要再配置PATH环境变量。
2.3 搭建Android应用程序开发环境
由于本书的例子都是在Linux下编写和测试的,因此,本节只介绍如何配置Ubuntu Linux下的Android应用程序开发环境。Windows和Mac OS X(Snow Leopard、Lion等)的安装过程类似。如果读者需要在Windows或Mac OS X下开发Android应用程序,可以仿照在Linux下的配置过程来搭建这两个平台的开发环境。
2.3.1 安装Android SDK
配置Android应用程序开发环境的第1步就是下载并安装Android SDK。在如下的页面可以下载Windows、Mac OS X和Linux平台的Android SDK。
http://developer.android.com/sdk/index.html
进入Android SDK下载页面后,会看到如图2-1所示的下载项,黑框中的就是Linux版本的Android SDK,下载该Android SDK,会得到一个android-sdk_r16-linux.tar文件(由于Android SDK版本不断升级,Android SDK安装包的文件名会略有差异,但都是tar文件)。
▲图2-1 Android SDK下载项
将android-sdk_r16-linux.tar文件复制到Linux文件系统中的某个目录(可以由读者任意指定),然后在 Linux 终端进入 android-sdk_r16-linux.tar 文件所在的目录,并执行如下的命令解压android-sdk_r16-linux.tar文件。
# tar –xvf android-sdk_r16-linux.tar
解压后,会看到当前目录中多了一个android-sdk-linux目录,进入android-sdk-linux/tools目录,会发现有一个文件名为android的脚本文件,如图2-2黑框中所示。
▲图2-2 android脚本文件的位置
执行这个脚本文件(双击该脚本文件或直接在 Linux 终端执行该脚本文件),会显示如图 2-3所示的Android SDK安装界面。
▲图2-3 Android SDK的安装界面
由于Android SDK采用在线安装的方式(也就是说只下载了一个安装器和必要的工具,更多的文件需要在线更新),所以前面下载的Android SDK并不完整,仍然需要通过Internet安装很多东西。启动安装界面后,可以选择自己想要的 Android 版本(选中前面的复选框即可),最后单击如图2-3所示的安装界面右下角的“Install 17 package”按钮来安装被选中的包。在安装的过程中要有稳定而快速的Internet连接,否则安装时间会很长。
安装完Android SDK后,进入<Android SDK安装目录>,会看到如图2-4所示的目录结构。其中,platforms目录存储与各个版本相关的Android SDK资源,每一个Android SDK版本用一个单独的目录存储,如图2-5所示。
▲图2-4 Android SDK安装目录的结构
▲图2-5 当前Android SDK已安装的Android SDK版本
由于<Android SDK安装目录>/platform-tools和<Android SDK安装目录>/tools目录中包含了很多常用的工具,因此建议读者将这两个目录加入PATH环境变量。步骤如下(假设Android SDK的安装目录是/sdk/android/android-sdk-linux)。
在Linux终端执行下面的命令。
# gedit /etc/profile
在profile文件的最后添加如下的代码。
# export ANDROID_SDK_PATH=/sdk/android/android-sdk-linux # export PATH=.:$ANDROID_SDK_PATH/platform-tools:$PATH
保存并关闭profile文件,在Linux终端输入如下的命令执行profile文件中的命令。
sourse /etc/profile
2.3.2 安装Eclipse
在Linux下安装Eclipse比较简单,只需要到如下的页面下载合适的Eclipse for Linux的最新版本即可(注意自己的机器是32位的Linux还是64位的Linux机器)。
http://www.eclipse.org/downloads/?osType=linux
在写作本书时,Eclipse的最新版本是Eclipse 3.7.1,在读者阅读本书时可能Eclipse会有更高的版本。读者可根据需要下载合适的Eclipse。
Eclipse for Linux 的安装包是一个 zip 或 tar.gz 压缩包,如下载的文件是 zip 压缩包(如eclipse-SDK-3.7.1-win32-x86_64.zip),在Linux终端执行如下的命令就可以将zip 压缩包解压到当前的目录中。
unzip eclipse-SDK-3.7.1-win32-x86_64.zip
如果下载的压缩包是 tar.gz(如 eclipse-jee-indigo-SR1-linux-gtk-x86_64.tar.gz),可以使用下面的命令解压。
tar zxvf eclipse-jee-indigo-SR1-linux-gtk-x86_64.tar.gz
解压后会得到一个Eclipse目录,进入该目录后,会看到一个Eclipse可执行文件,如图2-6黑框中所示。执行该文件即可启动Eclipse。
▲图2-6 Eclipse目录结构
2.3.3 安装ADT
ADT是用于开发Android应用程序的Eclipse插件。可以通过在线方式安装该插件,也可以下载离线安装文件来安装ADT。
1.在线安装ADT
启动Eclipse,单击“Help”>“Install New Software”菜单项,会显示如图2-7所示的“Install”对话框。
▲图2-7 “Install”对话框
单击右上角的“Add”按钮,会弹出如图2-8所示的“Add Repository”对话框。
▲图2-8 “Add Repository”对话框
在 Name 文本框中输入“adt”(也可以是其他字符串,但不要与已经存在的Repository重复),在Location文本框中输入https://dl-ssl.google.com/android/eclipse。最后单击“OK”按钮即可。
在如图2-7所示的“Install”对话框中选择“adt”,如果当前机器已经连接Internet,会显示如图2-9所示的安装项,一般应全部选中,然后一路单击“Next”按钮进行安装,最后单击“Finish”按钮后才正式开始安装。
▲图2-9 ADT安装项
2.离线安装ADT
从如下的页面可以下载ADT的离线安装包。
http://developer.android.com/sdk/eclipse-adt.html#installing
ADT离线安装包的下载项如图2-10所示。
▲图2-10 ADT离线安装包
下载完ADT的离线安装包后,在如图2-8所示的“Add Repository”对话框中单击“Archive”按钮选择ADT离线安装包,然后在Name文本框中输入“adt”,单击“OK”按钮。剩下的安装步骤和在线安装ADT相同。
成功安装ADT后,会在Eclipse的工具栏中多了两个如图2-11所示的按钮。
▲图2-11 ADT工具栏按钮
单击第1个按钮会显示如图2-3所示的“Android SDK Manager”对话框。单击第2个按钮会显示“Android Virtual Device Manager”对话框(将在2.3.5节介绍)。
在Eclipse中单击“File”>“New”>“Other”菜单项,会在“New”对话框中找到“Android”节点,如图2-12黑框中所示。在“Android”节点中显示了使用当前ADT版本可以建立的Android项目。
▲图2-12 “New”对话框
2.3.4 配置ADT
只安装ADT还不能用来开发,还需要配置ADT,以便让ADT能找到Android SDK。在Eclipse中单击“Window”>“Preferences”菜单项,会显示“Preferences”对话框,如图2-13所示。单击左侧的“Android”节点,在右侧的“SDK Location”文本框中输入Android SDK的安装目录,然后单击“Apple”按钮,会将当前Android SDK支持的Android版本都列出来,最后单击“OK”按钮关闭“Preferences”对话框。
▲图2-13 “Preferences”对话框
2.3.5 建立AVD
由于Android版本众多,所以在Android SDK中每一个Android版本都对应一个AVD(Android Virtual Device),在运行Android应用程序之前,必须要创建一个AVD。单击如图2-11所示的第2个按钮,会显示如图2-14所示的“Android Virtual Device Manager”对话框。该对话框会列出已经创建的AVD。
▲图2-14 “Android Virtual Device Manager”对话框
如果想新创建一个AVD,可以单击“Android Virtual Device Manager”对话框右上角的“New”按钮显示“Create New Android Virtual Device”对话框,然后按图2-15所示的内容进行填写或选择(读者也可以根据自己的需要选择其他的配置)。
▲图2-15 “Create New Android Virtual Device”对话框
单击“Create AVD”按钮完成AVD的创建。最后,单击“Android Virtual Device Manager”对话框中的“Start”按钮启动相应的AVD,也就是指定Android版本的模拟器。到现在为止,Android应用程序的开发环境已经配置完成了,读者可以建立一个新的Android应用程序,看一看效果。由于本书的主要内容不是介绍Android应用程序开发,因此,如果读者对如何开发Android应用程序不熟悉,请参阅笔者所著的另外一本书:《Android开发权威指南》。
2.4 安装Android NDK开发环境
由于Android NDK不能单独作为Android应用程序来运行,因此,使用Android NDK开发程序之前必须要先安装Android SDK。Android NDK的安装步骤比Android SDK稍微简单一些。本节将介绍如何下载、安装Android NDK,以及如何搭建Android NDK的集成开发环境,并通过一个示例来测试Android NDK开发环境。
2.4.1 下载Android NDK
读者可以到如下的页面下载最新的Android NDK开发包。
http://developer.android.com/sdk/ndk/index.html
进入Android NDK的下载页面后,会看到如图2-16所示的下载项,下载Linux版即可。
▲图2-16 Android NDK下载项
下载完Android NDK开发包后(android-ndk-r7-linux-x86.tar.tar)后,将其复制到任意的目录中,在Linux终端进入该目录,并输入如下的命令解压Android NDK开发包。
# tar –xvf android-ndk-r7-linux-x86.tar.tar
将Android NDK开发包解压后,会产生一个android-ndk-r7目录(由于Android NDK版本不同,解压目录会略有差异),该目录中的结构如图2-17所示。
▲图2-17 Android NDK安装目录的结构
在Android NDK安装目录中有一个ndk-build脚本文件。该脚本文件用于编译NDK程序。为了方便,可以将Android NDK安装目录添加到PATH环境变量中。读者可按照2.3.1节介绍的方法修改PATH环境变量的值。
2.4.2 安装CDT
CDT是Eclipse中用于开发C/C++程序的插件。虽然开发Android NDK程序并不一定要使用CDT,但为了在Eclipse中同时可以开发Android应用程序和Android NDK程序,就需要安装CDT。读者可以到如下的页面下载CDT的最新版本。
http://eclipse.org/cdt/downloads.php
CDT和ADT一样,也可以采用离线或在线的方式安装。如果读者想使用离线安装的方式,下载完安装包(zip文件)后,直接安装即可。如果采用在线安装的方式,CDT的下载URL如下。无论是离线安装,还是在线安装,都可使用2.3.3节介绍的安装方法。
http://download.eclipse.org/tools/cdt/releases/indigo
2.4.3 命令行方式编译Android NDK程序
编译 Android NDK 程序实际上很简单。在<Android NDK 安装目录>/samples 目录中有很多Android NDK的例子。读者可在Linux终端进入其中的某个例子目录,如hello-gl2,输入ndk-build命令,就会自动编译当前目录下的Android NDK源代码,编译后的输出信息如图2-18所示。
▲图2-18 编译Android NDK程序的输出信息
所有的Android NDK源代码都放在了jni目录中,如图2-19所示。编译后的目标文件(.so文件)都放在了libs/armeabi目录中,如图2-20所示。
▲图2-19 NDK源代码
▲图2-20 编译NDK程序生成的目标文件
2.4.4 导入Android NDK的例子
直接将<Android NDK安装目录>/samples/hello-gl2导入到Eclipse中,再重新编译,就可以直接在手机中运行了。导入的hello-gl2工程如图2-21所示。
▲图2-21 导入hello-gl2工程
由于samples目录中的例子目录没有.classpath和.project文件,因此,无法使用“File”>“Import”菜单项导入这些工程。需要单击“File”>“Android Project”菜单项,在“New Android Project”对话框中选择“Create project from existing source”选项,并在 Location 文本框中选择 hello-gl2 目录,最后单击“Finish”按钮导入hello-gl2工程。
2.4.5 配置Android NDK的集成开发环境
在上一节虽然将hello-gl2导入了Eclipse,并成功运行该程序。但如果修改jni/gl_code.cpp文件,仍然需要使用2.4.3节的方法手工在Linux终端编译NDK程序,并刷新hello-gl2工程,最后重新编译hello-gl2工程生成apk文件后才能使修改生效。这些步骤未免有些麻烦,为了简化编写Android NDK程序的步骤,本节将介绍如何配置Android NDK的集成开发环境,只要在Eclipse 中修改了 gl_code.cpp 文件的内容,在生成 apk文件之前就可以自动编译gl_code.cpp文件。这样就不需要在Linux终端和Eclipse之间来回切换了。
Eclipse提供了一项功能,可以利用该功能在执行某些动作(如编译Eclipse工程,clean工程等)之前或之后执行一些自定义的动作。只要利用这个功能,在Eclipse编译生成apk文件之前让Eclipse自动调用编译NDK程序的命令即可。
单击Eclipse工程的鼠标右键菜单的“properties”菜单项,显示“Properties”对话框。选择左侧的“Builders”项,单击右侧的“New”按钮,会弹出如图2-22所示的“Choose configuration type”对话框,选择“Program”列表项。
▲图2-22 “Choose configuration type”对话框
单击“OK”按钮,会弹出“Edit Configuration”对话框,并且按照图2-23所示输入相应的内容。
▲图2-23 “Edit Configuration”对话框
其中Location表示要执行的命令(调用bash来执行Script)。Working Directory表示当前工具目录,一般为要执行的命令所在的目录。Arguments表示命令行参数。首先进入了hello-gl2工程目录,然后在当前目录下调用了ndk-build来编译NDK程序(jni目录下的C/C++代码)。
除了“Main”页外,还需要设置“Refresh”页和“Build Options”页。现在切换到“Refresh”页,图2-24所示为设置相应的选项。
▲图2-24 “Refresh”页
现在单击“Refresh”页的“Specify Resources”按钮选择要刷新的目录,并选择libs目录,如图2-25所示。
▲图2-25 选择要刷新的目录
单击“Finish”按钮关闭“Edit Working Set”对话框,然后切换到“Build Options”页。图2-26所示为设置的选项。
▲图2-26 "Build Options”页
单击“Specify Resources”,在弹出的对话框中选择jni目录,如图2-27所示。
▲图2-27 选择与编译相关的资源
现在所有的设置都已完成。关闭所有的对话框。修改gl_code.cpp文件的内容,在编译hello-gl2工程时会重新编译NDK的代码,在Eclipse Console视图会输出如图2-28所示的信息。
▲图2-28 编译NDK程序输出的信息
2.5 安装交叉编译环境
X86架构的CPU采用的是复杂指令集计算机(Complex Instruction Set Computer,CICS),而ARM架构的CPU使用的是精简指令集计算机(Reduced Instruction Set Computer,RISC)。由于这两种架构的CPU使用了不同的指令集,因此在X86架构上开发可运行在ARM架构上的程序就必须要使用交叉编译器。通常交叉编译器和相关工具包含了很多可执行文件以及大量的共享库及头文件等资源。这些资源的集合称为交叉编译环境。
在Internet上可以找到集成好的交叉编译环境,Android NDK和Android源代码中也包含交叉编译环境。当然,如果我们需要一个完全独立的交叉编译环境,可以下载集成好的交叉编译环境,也可以自己制作(比较复杂,建议读者下载集成好的交叉编译环境)。下面介绍一个CodeSourcery交叉编译环境,这个交叉编译环境直接下载安装即可。
读者可通过如下的网站访问CodeSourcery下载页面。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
上面的页面并未直接提供CodeSourcery的下载链接,读者可以单击“Download the GNU/Linux Release”链接,并输入E-mail(建议使用Gmail)、地址等信息,最后单击“Get Lite!”按钮提交信息。如图2-29所示。最后系统会将下载地址发送到刚才输入的E-mail。
▲图2-29 提交CodeSourcery的下载信息
进入下载页面,会看到如图2-30所示的不同版本的下载链接,选择最新的版本即可。
▲图2-30 CodeSourcery的不同版本
进入 CodeSourcery 的下载页面后,会看到如图 2-31 所示的下载链接。目前 CodeSourcery 有Windows和Linux两个版本。本书使用的是第1个(IA32 GNU/Linux Installer)。
▲图2-31 CodeSourcery的下载页面
Linux 版本的安装文件是 bin 格式,读者可执行下面的命令安装 CodeSourcery。其中 package表示CodeSourcery的安装文件名。
# sh package.bin
执行上面的命令后,会显示可视化的安装界面,如图 2-32 所示,读者可按提示安装CodeSourcery。
▲图2-32 安装Code Sourcery
如果读者不想这样麻烦,可以使用随书光盘或虚拟环境中的交叉编译环境。各自的路径如下:
随书光盘:<光盘根目录>/resources/compilers/CodeSourcery.7z
模拟环境:/root/compilers/CodeSourcery
为了使用方便,建议读者将如下路径加到PATH环境变量中。
/root/compilers/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin
下面编写一个简单的C程序来测试腋下这个交叉编译环境。
// first.c #include <stdio.h> int main() { printf("first arm program\n"); return 0; }
输入下面的命令编译first.c文件(需要加-static选项)。
# arm-none-linux-gnueabi-gcc -static -o first first.c
输入下面的命令将first文件上传到任意的Android设备的/data/local目录中(没有root权限也可以)。
# adb push first /data/local
使用adb shell命令进入Android设备的控制台,并进入/data/local目录,执行如下的命令
# ./first
执行上面的命令就会输出“first arm program”信息。first程序在X86架构上运行的Ubuntu Linux中是无法运行的。读者可以试着在Ubuntu Linux中运行first程序,看看会发生什么。
注意
在安装 Code Sourcery 的过程中会在/lib 目录寻找一个 libc.so.6 库文件,但在Ubuntu Linux11.04及以上版本/lib目录已经没有libc.so.6库文件了。这个库文件被放在了其他的目录。在 32 位的 Ubuntu Linux 中该文件的路径是/lib/i386-linux-gnu/libc.so.6,在64位的Ubuntu Linux中该文件的路径是/lib/x86_64-linux-gnu/libc.so.6。在安装Code Sourcery之前可以使用ln命令为libc.so.6文件在/lib目录建立一个链接。
2.6 小结
本章主要介绍了Ubuntu Linux环境下的Android开发环境的配置。Windows和Mac OS X系统下的配置过程与Linux环境下类似,读者可以参考本章所介绍方法配置Windows和Mac OS X系统下的Android开发环境。虽然Android应用程序和Android NDK可以在Linux、Windows和Mac OS X下开发,但本章主要介绍Linux驱动程序,因此,建议读者直接使用Linux作为Android的开发平台,这样开发Linux驱动会更方便些。除了本章介绍的Android开发环境外,还需要配置一些其他的环境。如下载和编译Android源代码的环境,这些内容将在后面的章节详细介绍。