1.2 Android的开发环境

1.2.1 开发环境

Android的Linux开发环境一般使用Ubuntu主机。在基于Ubuntu的主机环境中,开发Android主机环境包括以下需求:git工具、repo工具、Java的JDK、主机编译工具等几个方面。编译过程中的主要目标机的编译工具则在Android的源代码包中自带。

Java 6开发包(SUN标准的JDK 6)的安装方式如下所示:

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

Java 5开发包(SUN标准的JDK 5)的安装方式如下所示:

    $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main
multiverse"
    $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu
hardy-updates main multiverse"
    $ sudo apt-get update
    $ sudo apt-get install sun-java5-jdk

在Android 1.6至Android 2.2发布版本中,Android系统要求使用Java 5来编译系统;Android 2.3.x之后要求使用Java 6进行编译。

配置Java运行环境和javac编译器的方法如下所示:

$  update-alternatives --config java
$  update-alternatives --config javac

提示:不同版本的JDK可以共存,可以通过update-alternatives进行配置选择。

Android系统在编译的过程中需要编译主机的工具,因此需要使用主机的GCC工具链。而对于编译目标机文件,Android在prebuilt目录中集成了GCC交叉编译工具链。

新版本Android源代码编译应当使用64位的主机环境,配置方式如下所示:

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
  libxml2-utils

而32位的主机开发环境,配置方式如下所示:

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \
  libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \
  libxml2-utils

repo是调用git封装的工具,安装repo的准备工作如下所示:

$ mkdir ~/bin
$ PATH=~/bin:$PATH

repo工具同样可以在Android的网站上获得,方法如下所示:

$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

repo是一个由Google提供的工具,本质上是一个脚本,它可能随时更新,因此应当从Google的相应地址获得最新的repo,复制到本地之后更改权限来使用。

1.2.2 源代码获取

获取Android完全的源代码方法包括初始化代码仓库和获取代码两个步骤,每个步骤可以增加不同的参数。

对于Android的代码仓库,初始化代码仓库的一般方法如下所示:

$ repo init -u https://android.googlesource.com/platform/manifest

此时得到的是代码仓库中Master分支(主分支)的最新版本。

提示:Google更新了源代码仓库的uri,不再使用从前的android.git.kernel.org。

在经过repo init之后,可以使用repo获取Android的全部代码,方法如下所示:

$ repo sync

在repo init时,使用-b选项可指定初始化版本的方法如下所示:

$  repo  init  -u  https://android.googlesource.com/platform/manifest  -b
android-2.2_r1
$  repo  init  -u  https://android.googlesource.com/platform/manifest  -b
android-4.0.1_r1

使用repo sync时,也可以同步一个单个工程的内容,需要使用工程的名称作为repo sync的参数,工程的名称可以从manifest.xml获得。使用方法如下。

$ repo sync {project_name}

1.2.3 编译Android源代码

编译Android系统的方法比较简单:在Android源代码的根目录中有一个Makefile,直接执行make即可,此时表示进行默认产品的全系统构建。可以增加-j N等参数指定并行编译的线程,加快编译的速度。

Android系统编译过程的片断如下所示:

$ make
# ……编译过程
Combining NOTICE files: out/target/product/generic/obj/NOTICE.html
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
Installed file list: out/target/product/generic/installed-files.txt

在一般情况下,根据编译过程的输出信息,system.img和installed-files.txt生成后,表示整个系统已经成功编译完成。

1.2.4 仿真器运行

使用Android Emulator可以模拟Android整个系统的运行,在运行过程中,可以指定内核、主文件系统、用户文件系统等。

Android是基于Linux的系统,具有自己的Linux内核映像文件。默认情况下,使用的源代码包中提供的二进制内核路径如下所示:prebuilt/android-arm/kernel/。

kernel-qemu文件为ARMv5体系结构的Linux内核。预编译的内核还有kernel-qemu-armv7文件,它是ARMv7的体系结构。

模拟器运行之前需要配置ANDROID_PRODUCT_OUT环境变量:

$declare -x ANDROID_PRODUCT_OUT
              ="{Android根目录}/out/target/product/generic"

ANDROID_PRODUCT_OUT宏表示的是产品的目录,模拟器运行时,需要从这个目录中找到几个映像文件。

运行模拟器时,同时得到一个shell终端的方式如下所示:

$ ./out/host/linux-x86/bin/emulator -shell

在仿真器环境中使用SD卡的方式如下所示:

$ ./out/host/linux-x86/bin/emulator –shell –sdcard <image_file>

在仿真器环境中指定不同分辨率的方法如下所示:

$ ./out/host/linux-x86/bin/emulator –shell –skin 800x480

1.2.5 使用工具

在Linux主机环境中,如果对Android的源代码进行了完整的编译,各种Linux的主机中工具生成在{源代码根目录}/out/host/linux-x86/bin/目录中。可以使用这个目录中的各种工具。

adb全称Android Debug Bridge(Android调试桥)。使用adb工具可以直接操作管理Android模拟器或者真实的Android设备。adb工具中几个通用的基本命令如下所示:

$ adb devices               # 查看当前连接的设备(仿真器和真实设备)
$ adb connect <ip>:5555    # 连接到某个网络端口
$ adb start-server          # 启动adb服务器进程
$ adb kill-server           # 终止adb服务器进程

adb得到目标信息的几个命令如下所示:

$ adb get-product           # 得到设备的id
$ adb get-serialno          # 得到设备的序列号
$ adb get-state             # 得到设备的状态

使用adb连接目标系统终端的方式如下所示:

$ adb shell

在shell后面可以直接附加目标机的命令行程序,表示直接执行一个命令。

使用adb抓取目标系统的log的方法如下所示:

$ adb logcat

使用adb安装应用程序的方法如下所示:

$ adb install XXX.apk
$ adb uninstall {应用程序的包名}

如果需要更新已经安装的包,也就是重新安装包,需要增加-r参数。使用-s则表示安装到SD卡,不使用表示安装到内部存储器。

使用adb在主机和目标机之间传送文件的方法如下所示:

$ adb push {host_path} {target_path}
$ adb pull {target_path} {host_path}

push表示从主机向目标机传送文件,pull表示从目标机向主机传送文件,二者的参数都是源对象在前,目的对象在后。

当已经有多个设备连接到主机时,可以使用-s参数进行选择,方法如下所示:

$ adb -s <设备> <命令>

其中,<设备>为adb devices列出的内容,<命令>为任意可执行的命令。除此之外,-d表示只通过USB连接,-e表示只连接仿真器。

fastboot则是一个具有特殊功能的协议,它是一个连接重新烧写系统的工具。fastboot通常需要Android设备方面的BootLoader中具有fastboot协议的支持。

fastboot几个控制命令如下所示:

$ fastboot devices                  # 查看当前连接的设备
$ fastboot reboot                   # 正常重新启动系统
$ fastboot reboot-bootloader       # 重新启动系统到BootLoader阶段

fastboot几个和烧写有关的命令如下所示:

$ fastboot flashall                             # 烧写所有的分区
$ fastboot flash <partition> [ <filename> ]    # 指定烧写一个分区
$ fastboot erase <partition>                    # 擦除一个分区

fastboot也可以通过-s参数指定操作某个连接的设备。

mksdcard命令帮助创建磁盘映像(disk image),可以在模拟器环境下使用磁盘映像来模拟外部存储卡(如SD卡)。例如,创建一个256MB映像文件的方法如下所示:

$ mksdcard 256M mmc_disk

mksdcard创建的是fat32格式的磁盘映像,这个磁盘映像可以作为启动仿真器时的-sdcard后面指定的参数。

aapt为Android资产打包工具(Android Asset Packaging Tool),用于查看和生成zip格式的包;aidl工具则用于自动将Android中特定的aidl接口描述文件生成Java代码;zipalign用于优化Android中应用程序包。它们都是在编译的过程中被编译系统自动调用的。

性能跟踪工具(Traceview),Dalvik调试监视器服务(Dalvik Debug Monitor Service)和层级观察器(Hierarchy Viewer)提供了图形化的界面,是较为复杂的工具。