第2章Android开发环境和流程
本章重点介绍如何搭建Android应用程序开发环境,与读者一起开发和调试一个简单的Android应用程序。“工欲善其事,必先利其器”,刚刚接触Android的开发者务必仔细阅读本章节,尤其是调试部分的内容;有经验的开发者,可以跳过本章直接阅读下一章。
2.1 安装Android SDK和Eclipse
本节主要介绍如何安装、配置Android SDK和Eclipse。首先,读者需要准备一台满足以下操作系统要求的计算机:
Windows XP或Windows Vista或Windows 7。
Linux(最好是Linux Ubuntu 8.04或更新版本)。
Mac OS X 10.5.8或更新版本。
↘ 2.1.1 安装Java SDK
在安装Eclipse之前,确保电脑上已经安装了Java 2 SDK,这里推荐安装Java SDK 6.0或者更高版本,读者可以从http://java.sun.com中获取软件。双击安装文件,按照提示安装即可,笔者的Java 2 SDK安装在Windows系统的C:\Program Files\Java\jdk1.6.0_18目录下。安装完成后在系统环境变量中添加JAVA_HOME环境变量指向Java SDK的安装根目录,然后将JAVA_HOME\bin目录添加到PATH环境变量中。设置环境变量的方法是用鼠标右键单击“我的电脑”,之后选择“属性”→“高级”→“环境变量”,如图2-1所示。
图2-1 设置Java环境变量
打开命令行工具,输入“java –version”,如果看到类似下面的输出,则说明已经成功地安装了Java 2 SDK。
C:\Documents and Settings\cmcc>java -version java version "1.6.0_18" Java(TM) SE Runtime Environment (build 1.6.0_18-b07) Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
↘ 2.1.2 安装Eclipse
Eclipse是目前最为流行的集成开发环境,通过安装不同的插件,可以使用Eclipse开发Java、C/C++等应用程序。可以从http://www.eclipse.org获取Eclipse安装文件及所需的插件,推荐使用Eclipse 3.7 classic或者更新版。除了Eclipse IDE之外,还需要以下插件:
Eclipse JDT插件(大部分的Eclipse IDE包已经包含JDT插件)。
EMF 2.5.0。
GEF 3.5.2。
WTP 3.1.2。
笔者将这些压缩包解压到E:\eclipse目录下,工作目录设置为E:\eclipse\workspace,如图2-2所示。
图2-2 Eclipse工作目录设置
↘ 2.1.3 安装Android SDK
首先需要登录http://developer.android.com下载所需的Android SDK。安装步骤如下。
(1)下载与您的电脑系统相对应的Android SDK版本。
可以从http://developer.android.com/sdk/index.html下载您所需的Android SDK版本。
Windows版本下载地址:
http://dl.google.com/android/android-sdk_r08-windows.zip
Mac OS X (intel)版本下载地址:
http://dl.google.com/android/android-sdk_r08-mac_86.zip
Linux (i386)版本下载地址:
http://dl.google.com/android/android-sdk_r08-linux_86.tgz
(2)解压对应压缩包到指定目录下。
这里需要指定一个合适的目录作为Android SDK的根目录,默认为android-sdk-<machine-platform>。笔者将压缩包解压到E:\android-sdk-windows目录下。
(3)添加SDK的子目录<your_sdk_dir>/ platform-tools和<your_sdk_dir>/tools到系统的环境变量PATH中。
在Linux下
编辑文件~/.bash_profile或~/.bashrc,在该文件的末尾添加如下内容:
export PATH=${PATH}: <your_sdk_dir>/platform-tools: <your_sdk_dir>/tools
在Windows下
用鼠标右键单击“我的电脑”,之后选择“属性”→“高级”→“环境变量”,在弹出的窗口中双击PATH,在变量值的输入窗口中添加如下内容:
; <your_sdk_dir>/platform-tools;<your_sdk_dir>/tools
在Mac OS X下
与Linux环境下的配置相同,找到home目录下的.bash_profile文件,并添加配置。如果没有找到该文件,则可以自行创建。
将platform-tools和tools目录加入PATH环境变量后,SDK提供的工具可以在文件系统的任何位置被调用运行,而不必每次指定SDK安装的完整路径名。
↘ 2.1.4 添加必要的Android SDK组件
Android SDK使用模块结构将SDK分割为Android平台、add-ons、工具、案例和文档等部分。一般我们下载的是Android SDK开始包(Starter Package),需要继续下载至少一个Android平台和相关工具才可以开始开发工作。
(1)通过“Android SDK和AVD管理器”下载必要的Android SDK开发组件。
在命令行下运行“android”,启动“Android SDK和AVD管理器”。在Windows下,也可以直接运行Android SDK根目录下的“SDK Manager.exe”。
选择“Available Packages”,显示可供下载更新的组件,如图2-3所示。请至少选中如下几项(具体选择的组件,请读者根据需要选定):
图2-3 选择Android组件
Android SDK Platform-tools, revision X。
Documentation for Android SDK, API x, revision 1。
SDK Platform Android 2.3, API 9, revision 2。
Samples for SDK, API 9, revision 1。
(2)单击“Install Selected”按钮,安装选中的组件。
↘ 2.1.5 安装ADT插件
ADT是专门针对Eclipse开发的插件,用于开发Android应用程序。ADT扩展了Eclipse的功能,允许开发者创建新的Android项目,使用Android的框架开发应用程序,调试Android应用程序,以及导出已经签名的APK文件等。
1.ADT安装步骤如下。
(1)运行Eclipse,然后选择菜单“Help”→“Install New Software”。
(2)在弹出的窗口中单击【Add】按钮,在弹出的对话框中添加ADT的URL如下,名称属性可以填写ADT。
https://dl-ssl.google.com/android/eclipse/
(3)Eclipse会读取ADT的信息,在返回的窗口中,将列出待添加的插件。选中复选框项目“Developer Tools”,然后单击“Next”按钮,如图2-4所示。
图2-4 安装ADT
(4)在后续的安装窗口中,选中“I accept the terms of the license agreements”,单击“Finish”按钮完成安装,如图2-5所示。
图2-5 接受许可协议完成ADT安装
(5)最后,重启Eclipse。
2.当Eclipse重新启动后,配置SDK的目录。
(1)在Eclipse菜单中选择“Window”→“Preferences”,打开配置窗口。
(2)从左侧控制面板中选择“Android”配置项。
(3)在配置项的内容面板中,单击【Browse】按钮,指定Android SDK的安装路径。
(4)单击“Apply”按钮,再单击“OK”按钮,系统会将SDK包含的目标平台列举出来,如图2-6所示。在Android的子选项中,还包含Build、LogCat和DDMS等配置,读者可以自行熟悉一下,这里将不再详述。
图2-6 ADT配置SDK路径
至此,已经成功安装了Android SDK、Eclipse和ADT插件。下面将介绍如何使用Eclipse和ADT开发第一个Android应用程序。
2.2 第一个Android应用程序
无论是学习何种编程语言,第一个想做的程序永远都是Hello World。为什么?因为开发者需要先了解应用程序的开发流程,只要模拟器上显示出“Hello World”之类的字样,您的心情一定都会很激动,起码是充满了满足感。
下面要做的就是一起开发第一个Android应用程序。重点不是介绍Android平台的方方面面,而是介绍使用Eclipse和ADT开发Android应用程序的流程。关于Android开发的详尽知识,将在后面的章节一一介绍。
↘ 2.2.1 新建Android项目
启动Eclipse,选择菜单“File”→“New”→“Android Project”,新建Android项目,在新建项目向导中需要选择目标平台的版本,这里选择Android 2.3.3,随后输入项目名称、属性等内容,如图2-7所示。
图2-7 新建Android项目
按照图2-7中填写的内容,ADT会在工作空间创建chapter2_1 项目,并自动创建了HelloActivity.java和R.java两个源文件。其中HelloActivity的源代码如下所示:
public class HelloActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
在包浏览器视图中,可以看到Android项目包含src和gen两个源文件目录,以及assets和res两个普通文件目录。在项目的根目录下包含AndroidManifest.xml文件和default.properties文件。其中res是项目的资源文件目录,所有资源文件包括图片、文本等都放置在此。根据用户的改动,系统会自动更新gen目录的R.java文件,因此不要手动修改gen目录下的文件,它是由系统维护的,不应该被人工修改。项目结构如图2-8 所示,关于项目结构和最终发布的apk文件,将在3.1.2节中详细介绍。
图2-8 Android项目结构
↘ 2.2.2 运行Android项目
1.创建AVD
在运行Android项目之前,必须首先创建一个AVD(Android Virtual Device)。简单地说,AVD就是一个平台的配置总和,可以在AVD中指定目标平台的版本,比如Android 2.3.3,还可以设置模拟器的SD卡的位置以及模拟器的皮肤等。
在命令行环境下,使用下面的命令可以列出所有的目标平台:
android list targets
从输出内容可以知道目前可用的目标平台,平台以id作为主键,在接下来创建AVD时会用到。
android list targets Available Android targets: id: 12 or "android-9" Name: Android 2.3.1 Type: Platform API level: 9 Revision: 2 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854 ABIs : armeabi ---------- id: 13 or "android-10" Name: Android 2.3.3 Type: Platform API level: 10 Revision: 2 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854 ABIs : armeabi ---------- id: 14 or "Google Inc.:Google APIs:10" Name: Google APIs Type: Add-On Vendor: Google Inc. Revision: 2 Description: Android + Google APIs Based on Android 2.3.3 (API level 10) Libraries: * com.android.future.usb.accessory (usb.jar) API for USB Accessories * com.google.android.maps (maps.jar) API for Google Maps Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA ABIs : armeabi
下面可以使用列出的平台id和AVD的名称来创建一个AVD。在命令行下输入:
android create avd -n android233-t 13
创建了android233 AVD之后,就可以启动模拟器了。输入如下命令,可以看到Android SDK的模拟器主界面,如图2-9所示。其中,scale是缩放比例参数,大家可以根据电脑的尺寸适当调整。
图2-9 Android SDK模拟器主界面
emulator -avd android233-scale 0.7
2.运行项目
刚才创建的chapter2_1项目已经包含了一个简单的HelloActivity,选择“Run”→“Open Run Dialog”,选中左边的Android Application,按照图2-10和图2-11所示填写运行配置信息。选择刚刚创建的chapter2_1项目,在Target选项中,选择刚刚创建的android233 AVD。除此之外,可以设置模拟器的屏幕尺寸、网络连接速度等选项。如果希望启动模拟器时挂载SD卡,则可以使用-sdcard设置启动参数,这里使用默认设置。
图2-10 配置运行
图2-11 选择AVD
配置完成后,单击“Run”按钮运行chapter2_1项目。这是一个非常简单的Android项目,只是在模拟器屏幕上显示“Hello World,HelloActivity!”字样,如图2-12所示。下面修改一下项目中的资源文件和源文件。
图2-12 Hello World
↘ 2.2.3 修改Android项目
在实际项目开发过程中,更新资源文件是非常频繁的。Android设计得非常人性化,资源文件管理非常方便,为开发者节省了不必要的麻烦。在这部分,我们更改一下资源文件和Java源文件,然后作为新项目chapter2_2,比较一下运行结果。
1.修改资源文件
项目的文本文件存放在res/values/strings.xml中,定义了所有在软件中出现的字符串。这样做有利于对文本内容的集中管理,一旦需要更改内容,可以直接编辑文本文件,无须重新编译源代码。
修改后的strings.xml内容如下所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">欢迎来到Android开发世界</string> <string name="app_name">Chapter2_2</string> </resources>
2.增加图片资源文件
Android项目中的图片资源统一放置在res/drawable-hdpi、res/drawable-mdpi和res/drawable-ldpi目录下,将Android的Logo放置到这些目录下,刷新一下整个项目,R.java就会自动更新。刚才添加的android_logo.jpg图片对应的资源ID已经添加到R.drawable类中,后面将用到刚添加的图片文件。
package com.doodev.chapter2_2; public final class R { public static final class attr { } public static final class drawable { public static final int android_logo=0x7f020000; public static final int ic_launcher=0x7f020001; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }
3.修改Layout文件
Android提供了两种用户界面的生成方式:一种是传统的编程方式,即根据系统的API在Java文件中通过代码来编写;另外一种是通过定义Layout资源文件,根据各个界面类的属性定义,通过编写XML文件来定义界面。Layout资源文件存储在res/layout目录下,chapter2_2中定义了main.xml文件,我们在此基础上增加一个ImageView和Button,目的是把新添加的Android Logo显示在HelloActivity上,单击“Button”按钮的时候弹出一个对话框。双击main.xml会进入到Layout文件可视化编辑界面,如图2-13所示。
图2-13 Android可视化界面编辑器
我们从Images & Media分类中选择ImageView组件拖动到右侧的手机屏幕中,选择android_logo作为图片源,从Form Widgets分类中选择Button组件拖动到手机屏幕中,位于ImageView的下面,然后保存,修改后的main.xml内容如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_logo" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout>
至此,已经修改了文本文件、Layout文件,新增了图片资源文件。
4.修改Java源文件
如果想在程序中控制ImageView的图片显示,而不是在main.xml中固定ImageView对应的文件,该怎么办呢?很简单,只需要给ImageView组件定义一个id,然后在程序中通过id来定位此组件,一旦获得了组件的引用之后,就可以通过调用相关的API修改ImageView的显示了。修改后的ImageView定义如下:
<ImageView android:id="@+id/android_logo" android:layout_width=" wrap_content" android:layout_height="wrap_content" />
通过android:id属性,给Android Logo定义了一个id,接下来可以在程序中通过id来获得此组件,并设置它的图片资源。需要在onCreate()函数中添加的代码如下所示:
//根据id获得ImageView对象 ImageView logo = (ImageView)findViewById(R.id.android_logo); //设置logo对象的图片资源 logo.setImageResource(R.drawable.android_logo);
现在我们需要给刚添加的按钮添加一个事件,当用户单击“Button”按钮的时候,弹出一个对话框。为此,需要定义一个私有变量button01,并为其设置一下onClickListener(),修改后的HelloActivity.java内容如下所示:
public class HelloActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 根据id获得ImageView对象 ImageView logo = (ImageView) findViewById(R.id.imageView1); // 设置logo对象的图片资源 logo.setImageResource(R.drawable.android_logo); button01 = (Button) findViewById(R.id.button1); button01.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 弹出对话框 new AlertDialog.Builder(HelloActivity.this).setTitle("ADT") .setMessage("欢迎来到Android开发世界") .setPositiveButton("确定", null).show(); } }); } private Button button01; }
运行chapter2_2,可以看到模拟器的显示效果与图2-13界面编辑器的显示一样,这就是ADT所见即所得的界面编辑特性。单击“Button”按钮,就可以弹出“欢迎来到Android开发世界”的对话框,如图2-14所示。
图2-14 修改后的chapter2_2
2.3 调试Android应用程序
调试Android程序并不复杂,跟调试普通的Java程序类似。下面以chapter2_2为例介绍如何在Eclipse下调试Android应用程序。下面模拟一个错误,由于程序员疏忽,HelloActivity的onCreate()方法可能写成下面的样子,程序员写错了ImageView的id,错将R.id.android_logo写成了R.drawable.android_logo。但是由于这两个参数都是int类型,因此编译器是无法发现错误的。重新运行chapter2_2,通过控制台输出的log,发现系统抛出了NullPointerException,模拟器出现“Force close”的错误,如图2-15所示,下面通过调试来发现问题所在。
图2-15 chapter2_2出现Force close错误
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //根据id获得ImageView对象 ImageView logo =(ImageView)findViewById(R.drawable.android_logo); //设置logo对象的图片资源 logo.setImageResource(R.drawable.android_logo); ... }
↘ 2.3.1 设置断点
首先,需要通过自己的经验和判断力在某个源文件的某一行设置一下断点,断点的选择非常重要,应该尽量选在最可能出错的地方,以节省调试时间。我们在HelloActivity.java的setContentView()一行设置断点,方法是:在左侧双击,就会出现一个蓝色的圆点,如图2-16所示。
图2-16 设置断点
↘ 2.3.2 启动调试
设置好断点之后,就可以开始调试程序了。从菜单栏中选择“Run”→“Debug Configurations”,设置调试参数,如图2-17 所示,然后单击“Debug”按钮。这样Eclipse会以调试的模式启动chapter2_2项目,并运行到断点位置停下来。
图2-17 设置调试参数
↘ 2.3.3 单步跟踪
当运行到断点位置时,Eclipse会停止执行后面的代码,此时,可以按F6键一行一行地执行代码,也可以按F5键跟进到方法的内部。最重要的是,每执行一行代码,都可以通过检查变量的值,看是否与预期的值一致。一般来说,调试可以帮助我们找到大多数问题所在,相比使用Log来跟踪变量值的方式,调试无疑更加高效和准确。在本例中,当执行到onCreate()方法最后一行时,查看变量视图,可以发现logo对象依然是null,如图2-18所示。这就是为什么调用ImageView.setImageResource()会抛出NullPointerException的原因。将findViewById()的参数由R.drawable.android_logo修改为R.id.android_logo,问题即迎刃而解。
图2-18 在调试中查看变量值
↘ 2.3.4 真机调试
Android不仅支持模拟器调试,还支持真机调试,真机调试更加准确,更能够真实地反映程序的运行环境。真机调试与模拟器调试的方法类似,但需要做好如下准备工作。
(1)安装OEM USB Driver。
使用真机调试之前,首先需要安装OEM厂商的USB Driver,Google提供了部分OEM USB驱动的下载链接,可以访问http://developer.android.com/sdk/oem-usb.html获得。需要说明的一点是,如果开发者使用的是Android Developer Phone,例如Nexus One、Nexus S等,那么需要安装Google提供的USB Driver。
(2)连接Android手机,开启USB调试模式。
使用USB线将Android手机连接至电脑,笔者的Android手机是HTC G11,在设置中开启USB调试模式,如图2-19所示。
图2-19 开启USB调试模式
(3)在AndroidManifest.xml中的<application>标签中添加如下属性设置:
android:debuggable="true"
当准备工作做好以后,从菜单栏中选择“Run”→“Debug Configurations”,在“Target”选项卡中把“Deployment Target Selection Mode”设为“Manual”,最后,单击“Debug”按钮启动调试。与模拟器调试不同的是,开发环境会弹出“Android Device Chooser”对话框,让开发者选择调试设备。如图2-20 所示,对话框的上半部分可以选择真机,单击“OK”按钮即可进行真机调试。下半部分可以选择AVD,单击“OK”按钮即可进行模拟器调试。
图2-20 选择调试设备
2.4 常用Android SDK工具
Android SDK提供了一系列的工具帮助开发者开发应用程序。这些工具可以分成两大类:一类是SDK工具,这些工具是与平台的版本不相关的;另一类是平台工具,顾名思义,这些工具与平台相关。
↘ 2.4.1 Android模拟器
模拟器是嵌入式软件开发者最常接触的工具,Android的模拟器是基于QEMU的应用程序,包含了底层的内核、系统栈、框架层和一些预装的应用程序。Android的模拟器还允许开发者自己定义按键映射、更换皮肤、模拟SD卡,这大大方便了程序开发和调试工作。
1.指定模拟器皮肤
在市场上流通的终端各式各样,有些是全键盘的,有些是触摸屏的。Android模拟器可以在运行时通过skin参数来指定模拟器的类型,常用的皮肤包括:
WVGA800——屏幕分辨率为480×800(像素),默认的Android模拟器样式。
WVGA854——屏幕分辨率为480×854(像素)。
HVGA——屏幕分辨率为320×480(像素)。
QVGA——屏幕分辨率为240×320(像素)。
WQVGA400——屏幕分辨率为240×400(像素)。
WQVGA432——屏幕分辨率为240×432(像素)。
一般来说,模拟器支持的皮肤存放在平台下的skins目录下。下面的命令可以使用Android默认的皮肤启动模拟器:
emulator -avd android233 -skin WVGA800
2.电话与短信功能
在手机上运行的应用程序,通常需要处理电话呼入、短信接收等外部事件。Android模拟器提供了电话模拟功能,在使用此功能之前需要先启动模拟器的控制台程序,使用telnet登录到控制台程序的指定端口。端口号一般显示在模拟器的上方,例如5554:
telnet localhost 5554
连接到控制台端口之后,可以使用如下命令来模拟电话相关的功能:
gsm <call|accept|busy|cancel|data|hold|list|voice|status>
例如,在程序运行过程中,需要测试电话呼入处理情况,可以输入:
gsm call 13810000086
电话呼入如图2-21所示。
图2-21 模拟电话呼入功能
如果需要模拟短信接收功能,可以参考短信命令格式“sms send <senderPhoneNumber><textmessage>”,其中senderPhoneNumber是发送者的电话号码,textMessage是消息的内容。例如:
sms send 13810000086 hello Android
↘ 2.4.2 模拟SD卡
SD卡是开发者最常使用的外设,Android模拟器提供了对SD卡的支持。首先,需要在电脑的文件系统上创建一个文件用来存放SD卡的数据。命令的格式是“mksdcard [-l label]<size>[K|M] <file>”,size的单位可以是M或者K。例如:
mksdcard 128M e:\sdcard.img
启动模拟器时,只需要在启动参数中通过sdcard指定SD卡的位置就可以了。
emulator -avd android233 -s c a l e 0.7 -sdcard e:\sdcard.img
↘ 2.4.3 ADB
一般来说,每个模拟器都有一个后台进程,通过和此进程通信,可以查询日志,在模拟器文件系统和桌面电脑之间传输文件,将apk文件安装到模拟器上。这些统统都是由客户端的adb命令来完成的。
1.复制文件
一旦创建了SD卡,就可以使用adb push命令向SD卡上传输文件,也可以使用adb pull命令从SD卡上将文件传输到桌面电脑中。命令格式如下:
adb push <local> <remote> adb pull <remote> <local>
2.查看日志
在调试程序过程中,经常需要使用日志来了解程序运行的状态、查看变量的值。这时可以使用logcat命令来查看日志,logcat命令格式如下所示:
[adb] logcat [<option>] ... [<filter-spec>] ...
在Android的日志定义中,优先级从低到高包含下面几种类型:
V——Verbose。
D——Debug。
I——Info。
W——Warning。
E——Error。
F——Fatal。
S——Silent。
在查看日志时,可能不需要查看所有输出,这时候需要使用过滤器来过滤日志,只输出自己关心的日志内容。过滤器的形式是“tag:priority”,tag代表我们希望查看的标记名称,比如ActivityManager,也可能是自己定义的HelloActivity等;priority代表最小的优先级级别,比这个级别高的都会被输出。例如,如果想查看ActivityManager的Info以上、HelloActivity的Debug以上级别的日志,其他日志不输出,则可以使用如下的命令,其中*:S代表除ActivityManager之外的其他TAG日志都不输出。日志输出如图2-22所示。
图2-22 控制台日志输出
adb logcat ActivityManager:I HelloActivity:D *:S
↘ 2.4.4 DDMS
在命令行中运行ddms,启动DDMS的界面如图2-23所示。DDMS与Dalvik虚拟机集成在一起,为开发者提供一系列调试相关的服务,包括结束进程、调试指定的进程、查看堆空间和线程信息、捕捉模拟器界面快照等。前面介绍的发起电话呼叫、发送短消息和查看日志等功能也可以在DDMS的模拟器控制中完成。
↘ 2.4.5 Android
Android命令是开发Android应用程序常用的工具之一,主要完成AVD管理、项目管理和SDK更新的功能。表2-1列举了常用的AVD管理命令,关于项目管理的命令请参考Android开发文档。
表2-1 AVD管理命令
上述内容列举了常用的SDK工具,更多的命令行工具,请开发者参考Android的开发文档。
2.5 Android NDK开发介绍
↘ 2.5.1 什么是Android NDK
Android Native Development Kit简称Android NDK,是一系列开发工具的集合,允许开发人员在Android的应用程序中嵌入使用C/C++语言编写的组件。我们知道Android应用程序使用Java语言编写,而NDK则可允许你的程序使用C/C++语言实现程序的部分功能,这样的好处是可以提高代码的执行速度。
最新的Android NDK可以从developer.android.com获得,支持ARMv5TE、ARMv7-A和X86指令集。ARMv5TE可以运行在所有基于ARM的Android设备上,但是ARMv7-A则只能运行在Google Nexus One等设备上,因为它需要一个与之兼容的CPU。相比ARMv5TE,ARMv7-A支持硬件FPU、Thumb-2和NEON指令。
↘ 2.5.2 使用NDK的优缺点
并非所有应用程序都适合使用NDK开发,因为NDK的缺点显而易见,那就是引入C/C++之后,会使得你的程序变得很复杂,难于维护。而使用NDK也有如下几个好处,因此到底是否使用NDK,就需要你来做平衡了。
由于Java层的代码很容易被反编译,而反编C/C++库的难度则较大,因此使用NDK可以达到代码保护的作用。
由于大部分的开源库都是使用C/C++代码编写的,因此使用NDK可以更容易地复用第三方的代码库。
便于移植,用C/C++编写的库可以较容易地运行在其他嵌入式平台上,比如使用OpenGL ES可以同时在Android和iOS设备上运行。
执行速度快,不管你是否承认,使用C/C++编写的代码更容易获得比Java高的执行速度。
↘ 2.5.3 使用NDK的两种方式
目前Android框架支持两种调用本地代码的方式:
第一种是使用Android框架编写应用程序,并使用JNI来访问使用NDK开发的本地API,这种方式使你可以很方便地使用Android框架,也可以自由地决定什么时候使用本地API,什么时候不使用本地API。只需要把C/C++的代码编译成能在ARM上运行的.so文件即可。这种方式从Android 1.5就开始支持了。
第二种是使用Android SDK提供的NativeActivity类,这样系统在Android应用程序声明周期内,会直接调用你使用本地API实现的onCreate()、onPause()和onResume()等生命周期方法。使用此方式,设备至少要支持Android 2.3(API Level 9)才可以。
遗憾的是,目前还不支持使用本地方法实现Service和Content Provider等特性。
关于使用NDK开发并不在本书的介绍范围内,读者可以阅读Android NDK开发文档获得更多内容。