http://reymont.iteye.com/blog/1750843
Maven开发Android指南 1 简介
学习Maven的使用已经3年了,从开始对 Maven有些盲目的崇拜,到现在真正去使用、去理解。《Maven开发Android指南》将记录学习中的心得体会,分享给大家。
文章翻译自《Maven: The Complete Reference》第14章
Maven开发Android指南 1 简介
Maven开发Android指南 2 配置android-maven-plugin
Maven开发Android指南 3 使用Android Maven Archetypes 创建新项目
Maven开发Android指南 4 与Eclipse整合(m2e-android )
Maven开发Android指南 5 调试
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于便携设备,如智能手机和平板电脑。2005年由Google收购注资,并组建开放手机联盟开发改良随后,逐渐扩展到平板电脑及其他领域上。Android的中间层基本上用Java 实现,采用Dalvik JAVA虚拟机。在运行时,将Java字节码转换为Dalvik 虚拟机可以识别的.dex文件。JAVA是默认的开发语言,API是基于JAVA。
大多数情况下,开发Android应用使用基于Eclipse的Android Development Toolkit ADT。也可以使用Apache Ant来代替IDE的编译工作。Android Maven Plugin则可以利用Apache Maven提供的功能,使开发团队完成编译,部署和发布Android应用,还可以使用Maven强大的特性,如依赖管理,报表,代码分析等等。
名词解释:
开放手机联盟:开放手机联盟(Open Handset Alliance)是美国Google公司与2007年11月5日宣布组建的一个全球性的联盟组织。这一联盟将会支持Google可能发布的手机操作系统或者应用软件,共同开发名为Android的开放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。
Java字节码(Java bytecode):Java bytecode is the form of instructions that the Java virtual machine executes. Each bytecode opcode is one byte in length, although some require parameters, resulting in some multi-byte instructions. Not all of the possible 256 opcodes are used. 51 are reserved for future use. Beyond that, Sun Microsystems, the original developer of the Java platform, has set aside three values to be permanently unimplemented
opcode:In computer science, an opcode (operation code) is the portion of a machine language instruction that specifies the operation to be performed. Their specification and format are laid out in the instruction set architecture of the processor in question (which may be a general CPU or a more specialized processing unit). Apart from the opcode itself, an instruction normally also has one or more specifiers for operands (i.e. data) on which the operation should act, although some operations may have implicit operands, or none at all. There are instruction sets with nearly uniform fields for opcode and operand specifiers, as well as others (the x86 architecture for instance) with a more complicated, varied length structure
Android NDK:The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can be helpful so you can reuse existing code libraries written in these languages, but most apps do not need the Android NDK.
参考:
Android: http://baike.baidu.com/view/1241829.htm
JAVA: http://baike.baidu.com/view/374952.htm
http://en.wikipedia.org/wiki/Java_bytecode
http://en.wikipedia.org/wiki/Opcode
http://developer.android.com/tools/sdk/ndk/index.html
在尝试开发或编译Android应用之前,你需要安装和配置JDK,Android SDK,Maven。
必备条件:
JDK 1.6+。
Android SDK (r17 or later) 支持所有版本的开发。http://developer.android.com/sdk/index.html
Maven 3.0.3+。http://maven.apache.org/download.html
配置步骤:
JDK:
JDK的安装配置不在本文介绍,可参考http://docs.oracle.com/javase/7/docs/webnotes/install/windows/jdk-installation-windows.html
在CMD中键入java -version。测试是否安装成功:
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Maven For Windows:
假定下载Maven后,解压到目录c:\Program Files\apache-maven-3.0.3。
使用Windows控制面板配置环境变量(可参照JDK配置):
配置M2_HOME:M2_HOME=c:\Program Files\apache-maven-3.0.3+
配置PATH:PATH=%PATH%;%M2_HOME%\bin+ …
在CMD中键入mvn -v。测试是否安装成功:
Apache Maven 3.0.4 (r1232337; 2012-01-17 16:44:56+0800)
Maven home: C:\Program Files\apache-maven-3.0.3\bin\..
Java version: 1.6.0_22, vendor: Sun Microsystems Inc.
Java home: C:\Program Files\Java\jdk1.6.0_22\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows xp", version: "5.1", arch: "x86", family: "windows"
Android SDK For Windows:
在Android官网(Android Developer web site)下载SDK。
假定下载Android后,解压到目录D:\android\android-sdk-windows
使用Windows控制面板配置环境变量(可参照JDK配置):
配置ANDROID_HOME
:ANDROID_HOME
=D:\android\android-sdk-windows
配置PATH:PATH=%PATH%;%ANDROID_HOME
%\tools
;%ANDROID_HOME
%\platform-tools
;
参考:
http://code.google.com/p/maven-android-plugin/wiki/GettingStarted
http://docs.oracle.com/javase/7/docs/webnotes/install/windows/jdk-installation-windows.html
http://www.sonatype.com/books/mvnref-book/reference/installation-sect-test-install.html
http://www.sonatype.com/books/mvnref-book/reference/android-dev-sect-config-build.html
在看完Maven开发Android指南 2 配置android-maven-plugin后,有人会疑惑怎么没有讲android-maven-plugin。这是Maven的特性之一,不需要手工下载plugin,配置pom.xml文件,只要是Maven Central 中有的,maven会自动下载对应的插件。
创建项目分两种:手工创建和使用Maven Archetypes
手工创建:
使用android提供的工具创建项目:
http://developer.android.com/tools/projects/projects-cmdline.html
android create project \
--target <target_ID> \
--name <your_project_name> \
--path path/to/your/project \
--activity <your_activity_name> \
--package <your_package_namespace>
Maven Archetypes:
开始一个新的项目可以使用Maven Archetype Plugin来创建项目的基本构架。有很多Android Maven Archetypes。如 android-with-test-archetype:创建包含测试代码的Android工程;android-release-archetype创建包含发布功能的Android工程。
本例中将使用android-quickstart这个Maven Archetype Plugin。在Maven Central中搜索android-quickstart查询Latest Version,目前最新的是1.0.8,在-DarchetypeVersion=1.0.8
archetypeArtifactId:Maven Archetype Plugin的ID
archetypeGroupId:Maven Archetype Plugin的类别
archetypeVersion:Maven Archetype Plugin的版本号
groupId:工程的类别(可以理解为JAVA包名)
artifactId:工程的ID(可以理解为工程的名称)
mvn archetype:generate -DarchetypeArtifactId=android-quickstart -DarchetypeGroupId=de.akquinet.android.archetypes -DarchetypeVersion=1.0.8 -DgroupId=com.study.android -DartifactId=HelloMavenAndroid
Generating project in Interactive mode
一路回车就可以创建HelloMavenAndroid工程
在HelloMavenAndroid文件内,打开pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study.android</groupId>
<artifactId>HelloMavenAndroid</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>apk</packaging>
<name>HelloMavenAndroid</name>
<properties>
<platform.version> 2.3.3
</platform.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>${platform.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
<assetsDirectory>${project.basedir}/assets</assetsDirectory>
<resourceDirectory>${project.basedir}/res</resourceDirectory>
<nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
<sdk>
<platform>10</platform>
</sdk>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
<extensions>true</extensions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
在这个pom.xml文件中高亮部分,分别是:
打包的类型:apk
使用Android平台:2.3.3(指向properties.platform.version)
配置Android Maven Plugin:3.1.1
一般的JAVA工程打包的类型是jar或者是war,而android工程打包的类型是apk。在执行中,告诉Android Maven Plugin生成的文件类型是apk。Android Maven Plugin会负责调用Android SDK将JAVA字节码转换成Dalvik 虚拟机识别的内容。在配置plugin中,Android Maven Plugin必须声明这是扩展的插件(<extensions>true</extensions>)。平台的版本和平台号码需要对应,<version>2.3.3</version>和<platform>10</platform>,可以在API Level找到对应的关系。
依赖的Android平台可以在Maven Central查询到。在依赖中声明<scope>provided</scope>是很有必要的。意思是告诉Maven在打包是不用将Android SDK提供的jar打包到应用中。
创建AVD:
参考:详解如何创建和使用AVD
请注意在Target栏位选择:Android 2.3.3 – API Level 10
运行:
使用AVD Manager.exe创建好AVD,并Start后,
进入HelloMavenAndroid,输入maven命令,最后在模拟器中看到Hello HelloMavenAndroid
cd HelloMavenAndroid
mvn android:emulator-start
mvn clean package android:deploy android:run
名词解释:
Maven Archetype Plugin:The Archetype Plugin allows the user to create a Maven project from an existing template called an archetype.
参考:
http://www.sonatype.com/books/mvnref-book/reference/android-dev-sect-helloandroidexample.html
http://www.sonatype.com/books/mvnref-book/reference/android-dev-sect-archetype.html
http://code.google.com/p/maven-android-plugin/wiki/GettingStarted
http://developer.android.com/tools/projects/projects-cmdline.html
http://maven.apache.org/archetype/maven-archetype-plugin/
Android官方开发团队致力于为Ecilpse插件提供可靠的支持,而android-maven-plugin致力于将Maven,Android和Eclipse串联在一起。
m2e-android是一个 Maven Integration for Eclipse (m2e) plug-in,为Android Developer Tools (ADT)和 Maven Android Plugin添加Maven支持,为ADT提供Maven依赖管理的特性。
安装m2e-android需要Eclipse Indigo or Juno (低版本的Eclispe未提供Eclipse Marketplace)
Help -> Eclipse Marketplace... 输入 "android m2e".点击Install(包含了Android Development Toolkit 和Maven for Eclipse m2e plug-in)。
创建项目:
如果是已经使用《Maven开发Android指南 3 使用Android Maven Archetypes 创建新项目》的方法创建项目,直接使用Eclipse Import:File->Maven->Existing Maven Projects
也可以使用m2e-android利用Maven Android archetypes创建新的项目:
直接Next
选择All Catalogs,Filter输入de.akquinet.android.archetypes
在Group Id、Artifact Id和Package输入名称
创建完后,可能有错。
右键Properties查看,提示为缺少src/test/java文件夹。
在工程目录下新建对应文件夹。
参照《Maven开发Android指南 3 使用Android Maven Archetypes 创建新项目》章节创建AVD后,可以使用Eclipse直接运行Android了。
当然也可以采用命令行:
mvn android:emulator-start
mvn clean package android:deploy
android:run
参考:
http://rgladwell.github.com/m2e-android/
http://code.google.com/p/maven-android-plugin/wiki/EclipseIntegration
对于一个使用Maven的Android应用,调试看起来是个大问题,没有"Debug as Android application"怎么办?总不能一直用logcat(Log.v(TAG,…)吧。
如果阅读了《Maven开发Android指南 4 与Eclipse整合(m2e-android )》,那么这就不是问题了。
m2e-android很智能的将 Android Developer Tools (ADT)和 Maven Android Plugin结合在一起,细心的读者可以看到,左上角项目图标上面有一个M和A,分别代表着Maven和Android。
正如上篇提到到的,可以"Run as Android application",那么当然可以"Debug as Android application"
但是还是有些读者不满足,就是不喜欢"Debug as Android application",那么DDMS将是你的选择。(需要安装m2e-android)
通过命令部署Android应用
cd HelloM2EAndroid
mvn android:emulator-start
mvn clean package android:deploy
打开Eclipse中的DDMS,选择对应的应用,点击绿色的小甲壳虫,它将会帮你抓住所有断点。
名词解释:
logcat是Android中一个命令行工具,可以用于得到程序的log信息。
The Android logging system provides a mechanism for collecting and viewing system debug output. Logs from various applications and portions of the system are collected in a series of circular buffers, which then can be viewed and filtered by the logcat command. You can use logcat from an ADB shell to view the log messages
DDMS的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
Android ships with a debugging tool called the Dalvik Debug Monitor Server (DDMS), which provides port-forwarding services, screen capture on the device, thread and heap information on the device, logcat, process, and radio state information, incoming call and SMS spoofing, location data spoofing, and more
参考:
http://code.google.com/p/maven-android-plugin/wiki/Debug
http://baike.baidu.com/view/4504801.htm
http://baike.baidu.com/view/2688850.htm