上一节我们讲解了如何下载、编译Android系统及Linux内核,接下来,讲解如何搭建Android SDK开发环境,包括Eclipse下载安装、ADT插件安装、Framework源码级调试、定制Android系统等相关知识。
首先、从Eclipse官方网站上下载EclipseIDE Classic,注意选择合适平台(在32位Ubuntu中,选择Linux 32 Bit版本):
http://www.eclipse.org/downloads
下载完成后,解压缩,运行Eclipse:
$ tar–xvf eclipse-linux-gtk.tar.gz
$ cd eclipse
$ ./eclipse &
启动后,选择工程目录,显示Eclipse界面。
图 xx-xx eclipse启动画面
ATD(Android Development Tool)插件是专门用于在Eclipse开发环境中开发Android应用程序的插件。
打开Help -> InstallNewSoftware… ,在弹出窗口中点击Add按钮添加新插件,在新弹出窗口中的Name中随意输入一个名字,在Location输入:https://dl-ssl.google.com/android/eclipse,点击OK。
图 xx-xx安装ADT
图 xx-xx安装ADT
图 xx-xx安装ADT
在下面的列表中选择Android DDMS和Android Developer Tools,选择Details中的Contact allupdate sites during install to find required software保持更新,点击Next。
图 xx-xx安装ADT
进入用户协议窗口,如图x-x所示,同意所有协议,开始安装:
图 xx-xx接受用户许可协议
图 xx-xx安装ADT
安装过程中会出现一些警告提示,点击OK继续,然后重新启动Eclipse。
现在我们的eclipse开发环境已经准备完毕,虽然具备了开发Android的能力,但是还没有开发Android应用程序时要用到的工具和模拟器等,这些都在Android SDK中,进入官方网站:http://developer.android.com/sdk/index.html,选择适合的平台,下载并解压SDK:
图 xx-xx下载Android SDK
解压到/home/linux/android/目录下:
$ tar -xvfandroid-sdk_r21.1-linux.tgz -C /home/linux/android/
其中android-sdk_r21.1-linux.tgz是从官网下载的SDK包(该包更新频繁,版本可能不一样),-C参数表示将包解压到参数后面的目录中。
SDK包解压完之后,要设置Eclipse让其知道SDK的目录,当编译Android应用程序时能找到SDK中的资源,打开Window -> Preferences菜单,左侧选择Android项,右侧SDK Location选择解压的SDK目录,点击OK。
图 xx-xx指定Android SDK 目录
图 xx-xx指定Android SDK 目录
在Android SDK工具包中只包含了开发环境中用到的一些工具,Android系统版本更新比较频繁,我们要在SDK下载器里下载要开发的Android系统版本类库、映像文件等。
打开Window -> Android SDK Manager,选择要开发的目标系统平台(我们前面下载的是2.3的源码,所以下载Android2.3.3的目标系统):
点击Install Selected按钮,同意所有的协议,进行下载安装:
图 xx-xx下载Android平台
在没有真实手机设备时,我们可以通过SDK工具来创建模拟器。
打开Window -> Android Virtual Device Manager ->New,在弹出窗口中新建模拟器:
点击OK,选择新创建的设备,点击Start启动它:
图 xx-xx创建Android模拟器
图 xx-xx启动Android模拟器
Android平台由上层应用层、中间framework层、本地运行时库层及Linux内核层构成,应用程序调用Framework的代码库,在开发Android应用程序时,程序员希望深入Android提供的API中去查看具体实现,也就是说更希望在调试应用程序时能浏览到Framework代码,从而能更深刻的理解Android的工作机制,下面我们讲解如何进行应用程序的Framework源码级别调试。
Framework的源码级别调试,说白了就是当我们单步调试时能直接进入到Framework源码中去,这也就意味着,我们要将Framework的源码添加到Eclipse中,添加步骤如下:
打开Eclipse的安装目录下的eclipse.ini文件,修改下面的三个变量的值:
--launcher.XXMaxPermSize
256m
-Xms128m
-Xmx512m
$ cd ~/android/android_source/
$ cp development/ide/eclipse/.classpath ./
打开 window -> preferences -> Java ->CodeStyle -> Formatter,点击Import,选择android-formatting.xml文件,点击Apply,应用设置。
打开 window -> preferences -> Java ->Code Style -> Organize Imports,点击Import,选择android-importorder.xml,点击Apply,应用设置。
选择:File -> New -> Java Project,如图论x-x所示,创建新Java工程,在弹出的窗口中输入工程名:android_source,指定Location为Android源码的顶级目录:/home/linux/android/android_source(上一步.classpath被拷贝到这儿),点击Finish按钮。
Eclipse加载源码时间比较长,如果加载完出现找不到javalib.jar库的错误,打开.classpath文件,将下列内容删除掉:
重启eclipse,如果出现源码错误,说明项目配置文件.classpath里面的目录与源码中的目录不一致,将.classpath里的目录与源码目录匹配即可。
图 xx-xx输入Android源码
在开始调试之前,要保证上一步中Android源码工程编译完没有错误。
新建一个HelloWorld应用程序工程,在该工程上右键选择菜单Debug As->Debug Configurations ->Remote Java Application,右键点击New,在右侧窗口中Project选择刚才添加到工程中的Android源码工程:android_source,点击Apply应用设置。
打开HelloWorld源码文件,将断点设置在super.onCreate()方法上,点击调试按钮,开始调试。
图 xx-xx配置调试信息
图 xx-xx配置调试信息
图 xx-xx配置调试信息
当点击F5(Step Into)进入框架层代码时,会显示“Sourcenot found。”,选择“EditSource LookupPath…”,在新窗口中单击Add按钮,选择Java Project,选择android_source工程,这样就可以看到框架层代码了,如图xx-xx所示。
图 xx-xx设置源码目录
图 xx-xx调试HelloWorld源码
首先在模拟器里打开要调试的应用程序,比如计算器Calculator,打开Window ->Open Perspective -> DDMS ,弹出DDMS调试窗口。在Devices窗口中选择Calculator的进程com.android.calculator2。
图 xx-xx 选择要调试的进程
打开Run ->Debug Configurations -> RemoteJava Application,右键点击New,配置Name为:Calculator,在右侧窗口中Project选择刚才添加到工程中的Android源码工程:android_source,调试Port端口设置为:8700(默认AVD调试端口)点击Apply应用设置。
图 xx-xx 调试源码
再点击Debug,可以看到DDMS窗口中,com.android.calculator2进程前面出现了Debug标志,如图xx-xx所示。
图 xx-xx 调试Calculator源码
切换到Java视图,打开android_source工程中Calculator.java,在onCreate方法上设置断点,在模拟器里关闭刚才打开的Calculator,再次启动它,在Eclipse中就可以对Calculator进程进行调试了。
图 xx-xx 调试Calculator源码
在2.4.5章节介绍了在Android VirtualDevice Manager里创建目标平台的模拟器,这个模拟器使用的SDK中的Linux内核和文件系统,我们完全可以对这个模拟器进行定制,使用自己编译的内核与文件系统。
进入SDK目录下,查看当前已下载的目标平台:
$ cd/home/linux/android/android-sdk-linux/tools
$ ./android list targets
Available Android targets:
----------
id: 1 or "android-10"
Name:Android2.3.3
Type:Platform
API level:10
Revision: 2
Skins:WXGA800, WQVGA400, WXGA720, HVGA,WVGA854, WQVGA432, WVGA800 (default), QVGA,WSVGA
ABIs :armeabi.
通过下面的命令列出当前已经创建的模拟器:
$ ./android list avd
Available Android VirtualDevices:
Name: MyPhone
Path: /home/linux/.android/avd/MyPhone.avd
Target: Android 2.3.3 (API level 10)
ABI: armeabi
Skin: 320x480
Sdcard: 64M
如果不存在可用的模拟器,可以通过命令创建一个模拟器它:
$ ./android create avd -n MyPhone-t1
注:-n表示模拟器名字,-t表示模拟器使用的系统ID号,这儿指定为1 ,即Android2.3
启动模拟器:
$ ./emulator -avd MyPhone&
上述命令启动的是目标平台的默认系统映像(默认在SDK_DIR/platforms/android-xx/images),我们可以通过emulator的参数来指定特定的映像。
$ lsSDK_DIR/platforms/android-10/images
NOTICE.txt kernel-qemu ramdisk.img system.img userdata.img
NOTICE.txt:当前系统映像的文件列表
Kernel-qemu:针对Goldfisk虚拟CPU的Linux内核,我们可以通过xx章节编译出自己的内核来替换它。
ramdisk.img、system.img、userdata.img这三个映像文件在xx章节已经介绍过,是构成Android文件系统的主要组成部分。
我们在Android源码的顶层目录下编写如下脚本run_emulator.sh,用来快速启动自己源码编译出来的文件系统和自己编译出来的Linux内核:
#!/bin/bash
SDK_PATH=/home/linux/android/android-sdk-linux
PWD_PATH=`pwd`
IMG_PATH=$PWD_PATH/out/target/product/generic
exportPATH=$SDK_PATH/tools:$PATH
emulator -kernel$PWD_PATH/kernel/goldfish/arch/arm/boot/zImage\
-image $IMG_PATH/system.img \
-data $IMG_PATH/userdata.img\
-ramdisk $IMG_PATH/ramdisk.img
-kernel:指定内核映像
-system:指定system.img
-data:指定userdata.img
-ramdisk:指定ramdisk.img