Android程序员指南(19)

6. 使用命令行工具和Android虚拟机

 

到目前为止,本书已涵盖了相当广泛的内容使您在Android平台上迈出第一步。现在,您应该可以相当轻松的使用Eclipse创建和运行小的Android程序。您已经创建过一个新的工程,编辑了main.xml和<activity>.java文件,并且重新编译了R.java file。这些都是您的创建Android应用程序的基础技能。

在本章中,您将通过学习实践命令行方式的程序开发来扩展和完善这些技能。Android应用程序并不局限于使用Eclipse集成开发环境来开发。Android SDK提供了许多命令行工具,可以帮助您在不使用图形化的集成开发环境情况下开发完整的应用程序。您将使用这些工具来创建、编译和运行一个Hello World程序,首先在Windows平台,然后在Linux下来开发。

 

6.1 使用Windows CLI(命令行接口)创建一个Activity的框架

Android SDK提供了许多工具帮助我们创建和编译Android应用程序。 这些工具可以帮助那些不想使用图形化IDE、或者是系统支持这些IDE的用户。当然,即使您完全使用Eclipse进行Android开发,您仍应知道这些Android SDK命令行工具和它们的功能。

当您运行Android相关的功能时,如创建一个Android项目或在Android Emulator中运行程序时,您实际上是在调用了Android命令行工具。这些 Android命令行工具,无论是在一个命令行界面还是在图形化IDE中运行,都是Android SDK的功能的核心部分。

在下面的章节中,我将描述其中一个Android工具ActivityCreator.bat的功能。它是一个强大的工具可以用来为您的程序建立一个Activity的框架。

6.1.1 运行ActivityCreator.bat

ActivityCreator.bat文件应在存在在Android SDK的../tools/目录里。绝大多数的Forward-facing命令行工具都在这个目录。所谓Forward-facing工具指那些用来调用深藏在../tools/ 子目录中的其他工具的工具。 ActivityCreator.bat就是这样一个例子,它在运行时了实际上调用了其他的工具。使用vi, 记事本或者其他的文本编辑器,打开ActivityCreator.bat,它应包含如下的代码:

注:ActivityCreator.bat是Android SDK的Microsoft Windows版本中特有的工具,在本章的后面部分,您也会学习到ActivityCreator.py,这是 ActivityCreator的Linux版本。

@echo off
rem Copyright (C) 2007 Google Inc.
rem
rem Licensed under the Apache License, Version 2.0 (the "License");
rem you may not use this file except in compliance with the License.
rem You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.
rem don't modify the caller's environment
setlocal
"%~dp0\lib\activityCreator\activityCreator.exe" %*

越过所有的rem语句(批处理文件的注释语句),您会在文件的底部看到一行起实际作用的代码。ActivityCreator.bat被用来调用../tools/lib/activityCreator/目录下名为ActivityCreator.exe的工具。ActivityCreator.bat是SDK中仅用作前端程序的一个例子。

那么,ActivityCreator.bat(或者说是ActivityCreator.exe)做了什么呢?ActivityCreator 用来建立您的开发环境,它建立了最初的一些文件,而这些文件是您开发应用程序所需要的。这些文件和它们的目录结构正如同第五章中我们所讨论过的一样,ActivityCreator.bat创建了R.java、AndroidManifest.xml和所有必须的支持文件。

现在让我们进入命令行环境来探索一些ActivityCreator。

在Windows的开始菜单中,点击“运行”,在对话框中键入CMD或者COMMAND,并点击“确定”,可以看见出现了命令行窗口,它与老版本的DOS操作环境是相同的。

在>提示符后键入ActivityCreator,运行后产生如下的输出:

Activity Creator Script
Usage:
activityCreator [--out outdir] [--ide intellij] yourpackagename.ActivityName
Creates the structure of a minimal Android application.
The following will be created:
- AndroidManifest.xml: The application manifest file.
- build.xml: An Ant script to build/package the application.
- res : The resource directory.
- src : The source directory.

译者注:在1.5以上版本的SDK中,已使用Android工具代替ActivityCreator。请参考Android 文档中Other Tools一页。

android create project \

   --target <target_ID> \

  --name <your_project_name> \

  --path path/to/your/project \

  --activity <your_activity_name> \

  --package <your_package_namespace>

其中target_ID可以用andoird list target查看。

下面的章节将讨论ActivityCreator创建的文件,它们与使用Eclipse创建的文件略有不同。

 

6.1.2 项目结构

ActivityCreator创建了一些目录和文件以便后续的开发。打开c:\AndroidHelloWorld\目录看一下它们的结构,如下图所示。



 

 

因为在Eclipse环境外工作,您看到的是一个稍有不同的环境。当您在如Eclipse的IDE中工作时,这些功能都在后台被自动执行了。假设您没有IDE的帮助,ActivityCreator将创建了一个文件用来描述编译器创建什么。当您手动运行ActivityCreator时,它就会创建名为build.xml的文件。使用Eclipse时是不会创建这个文件的。build.xml包含了一个指令集,用来解释如何将您的.java文件变为Android项目。

build.xml文件告诉编译器需要为您的应用程序创建什么。这里提到的编译器是Apache ANT,一个基于的工具,可以用来建立脚本之类的文件来编译项目。您需要下载ANT以编译您的命令行项目,下载地址http://ant.apache.org/bindownload.cgi

一旦您下载和安装了ANT,您必须将它加入环境变量PATH中。在Windows中右击“我的电脑”选择属性来改变PATH。

如前面的图所示,build.xml在您的项目的根目录里。 使用文本编辑器打开build.xml。

第一部分包含的代码是用户可以编辑的。我将这一部分单独列出来,因为余下的部分是不能改变的。

<?xml version="1.0" ?>
<project name="HelloWorldCommandLine" default="package">
<property name="sdk-folder" value="c:\Android\android-sdk_m5
rc14_windows\android-sdk_m5-rc14_windows" />
<property name="android-tools" value="c:\Android\android-sdk_m5
rc14_windows\android-sdk_m5-rc14_windows\tools" />
<property name="android-framework" value="${android-tools}/lib/framework.aidl"
/>
<!-- The intermediates directory -->
<!-- Eclipse uses "bin" for its own output, so we do the same. -->
<property name="outdir" value="bin" />

这一部分包括了四个属性:

  •  Project name(项目名称)
  • Android SDK location(Android SDK目录)
  • Android tools location(Android 工具目录)
  • Android framework location(Android 框架目录)
  • Output location(输出位置)

如果您需要改变这些属性,您尽可以修改它们。但是,接下来的的代码中,您会看到一个警告信息表示您不能修改其他任何东西。

<!-- No user servicable parts below. -->

紧接着warning信息的是一个参数表,它们对正确创建您的项目是至关重要的。表中包括编译选项,输入目录,工具位置。

注:虽然Android 建议不要改变这些参数,但是如果您已对ANT的工作方式十分熟悉,您也可以改变这些选项以满足您特定的需要。

<!-- Input directories -->
<property name="resource-dir" value="res" />
<property name="asset-dir" value="assets" />
<property name="srcdir" value="src" />
<!-- Output directories -->
<property name="outdir-classes" value="${outdir}/classes" />
<!-- Create R.java in the source directory -->
<property name="outdir-r" value="src" />
<!-- Intermediate files -->
<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${outdir}/${dex-file}" />
<!-- The final package file to generate -->
<property name="out-package" value="${outdir}/${ant.project.name}.apk"/>
<!-- Tools -->
<property name="aapt" value="${android-tools}/aapt" />
<property name="aidl" value="${android-tools}/aidl" />
<property name="dx" value="${android-tools}/dx" />
<property name="adb" value="${android-tools}/adb" />
<property name="android-jar" value="${sdk-folder}/android.jar" />

<property name="zip" value="zip" />
<!-- Rules -->
<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
<mkdir dir="${outdir}" />
<mkdir dir="${outdir-classes}" />
</target>
<!-- Generate the R.java file for this project's resources. -->
<target name="resource-src" depends="dirs">
<echo>Generating R.java...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="compile" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-r}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>
<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="dirs">
<apply executable="${aidl}" failοnerrοr="true">
<arg value="-p${android-framework}" />
<arg value="-I${srcdir}" />
<fileset dir="${srcdir}">
<include name="**/*.aidl"/>
</fileset>
</apply>
</target>
<!-- Compile this project's .java files into .class files. -->
<target name="compile" depends="dirs, resource-src, aidl">
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
srcdir="."
destdir="${outdir-classes}"
bootclasspath="${android-jar}" />
</target>
<!-- Convert this project's .class files into .dex files. -->

<target name="dex" depends="compile">
<exec executable="${dx}" failοnerrοr="true">
<arg value="-JXmx384M" />
<arg value="--dex" />
<arg value="--output=${basedir}/${intermediate-dex}" />
<arg value="--locals=full" />
<arg value="--positions=lines" />
<arg path="${basedir}/${outdir-classes}" />
</exec>
</target>
<!-- Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-c" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${out-package}" />
</exec>
</target>
<!-- Same as package-res-and-assets, but without "-A ${asset-dir}" -->
<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-c" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- No assets directory -->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="${out-package}" />
</exec>
</target>

<!-- Invoke the proper target depending on whether or not
an assets directory is present. -->
<!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument
only when the assets dir exists. -->
<target name="package-res">
<available file="${asset-dir}" type="dir"
property="res-target" value="and-assets" />
<property name="res-target" value="no-assets" />
<antcall target="package-res-${res-target}" />
</target>
<!-- Put the project's .class files into the output package file. -->
<target name="package-java" depends="compile, package-res">
<echo>Packaging java...</echo>
<jar destfile="${out-package}"
basedir="${outdir-classes}"
update="true" />
</target>
<!-- Put the project's .dex files into the output package file.
Use the zip command, available on most unix/Linux/MacOS systems,
to create the new package (Ant 1.7 has an internal zip command,
however Ant 1.6.5 lacks it and is still widely installed.)
-->
<target name="package-dex" depends="dex, package-res">
<echo>Packaging dex...</echo>
<exec executable="${zip}" failοnerrοr="true">
<arg value="-qj" />
<arg value="${out-package}" />
<arg value="${intermediate-dex}" />
</exec>
</target>
<!-- Create the package file for this project from the sources. -->
<target name="package" depends="package-dex" />
<!-- Create the package and install package on the default emulator -->
<target name="install" depends="package">
<echo>Sending package to default emulator...</echo>
<exec executable="${adb}" failοnerrοr="true">
<arg value="install" />
<arg value="${out-package}" />
</exec>
</target>
</project>

既然您已经明白build.xml如何被用来在手动的命令行方式中创建Android项目,您可以开始编辑您的项目文件并创建一个Android Activity。您需要看的第一个文件是main.xml,使用Windows Explorer,在AndroidHelloWorld\res\layout中找到main.xml。.

译者著:1.5以上版本的SDK,使用andoird create project创建的目录结构与这里所述的略有不同,build.xml中已经没有可编辑的四项属性了,而是全部在AndroidManifest.xml中。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值