您的位置:首页 > 移动开发 > Android开发

使用Ant打包Android应用详解——Ant使用解析

2015-08-25 13:07 495 查看
上篇《使用Ant打包Android应用详解》描述了使用Ant打包的流程,但很多步骤并没有说明如此做的原因,本篇将从Ant方面来理解,下一篇从APK生成的流程来说明。

APK包的生成是一系列操作的结果,而Ant则是将这一系列操作流程化,提供出定制化的接口,以及可配置的参数供修改,而这些都是通过指定的构建文件来实现。我们就从Ant的打包流程来理解Ant的一些基本用法。当在命令行中执行ant,默认会去解析当前目录的build.xml作为构建文件。下面是个删除部分注视的版本:

<project name="工程名" default="help">

 <!-- The local.properties file is created and updated by the 'android' tool.
 It contains the path to the SDK. It should *NOT* be checked into
 Version Control Systems. -->
 <property file="local.properties" />

 <property file="ant.properties" />

 <!--
 Import per project custom build rules if present at the root of the project.
 This is the place to put custom intermediary targets such as:
 -pre-build
 -pre-compile
 -post-compile (This is typically used for code obfuscation.
 Compiled code location: ${out.classes.absolute.dir}
 If this is not done in place, override ${out.dex.input.absolute.dir})
 -post-package
 -post-build
 -pre-clean
 -->
 <import file="custom_rules.xml" optional="true" />

 <!-- Import the actual build file.
 <import file="${sdk.dir}/tools/ant/build.xml" />
再跟进到你的SDK目录的tools/ant/build.xml,查看Ant打包的完整过程。

1.首先理解几个概念,project、target、task。简单来说,你的一个构建工程(project),划分了很多阶段或者子目标(target),而每个阶段目标的实现,你要提供具体的操作,比如文件复制,源码编译,这些封装好的操作就是task(可以理解为为你提供的库函数)。具体看,每个构建文件都有顶层为project的标签,作为标识,而target就是你所要执行的操作序列,target里面可以有很多的task。那么怎么确定操作序列执行的顺序呢?其中project的default指的是默认执行的target,也就是当你在命令行只输入ant不带任何参数时,执行的target。而当你指定了target后,如在命令行中输入ant
help,会从你的构建文件中找到target help执行。当我们输入ant release时,对应的target如下:

<target name="release" depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build" description="Builds the application in release mode.">
 </target>
target的name和description顾名思义,而depends则是该target执行前,需要执行或者说依赖的target,而且是依据从左到右的顺序依次执行。继续跟进-package它的定义:<target name="-package" depends="-dex, -package-resources">,分别是dex文件的生成和资源打包,里面又定义了很多具体的target。整个过程中就有或者说预留了一些空的target,比如-pre-build -pre-compile
-post-package -post-build,是每个打包编译步骤之前后结束,通过在custom_rules.xml中重写这些target,达到定制化的要求

  2.解决了执行序列的问题,那么如何进行参数配置呢?

(1)首先在工程下的build.xml中property,可以理解为定义了部分变量或者引入了property 文件,看其部分属性:

name:property的名称,在target或者其它地方可以通过${name}的形式引用

value:具体的值或路径

file:需要加载的property文件,文件中的内容以key=value中出现,如local.properties中定义的sdk.dir=android的sdk路径

refid:引用已经定义的path信息

自己工程的build.xml中property定义的local.properties引入了android sdk/ndk,ant.properties引入了签名时需要的信息;这里有个关键的特性是,一旦定义了property,其值是不能改变的,而且会保留最先定义的值;也就是这个特性,方便了在编译过程中的一些定制化操作。如上篇中调用隐藏api,将自己的framework.jar加入到project.target.class.path中

(2)import标签,属性file:要引入的构建文件,optional:值为true时,即使import的文件不存在,也不停止编译。那么custom_rules.xml是可有可无,而${sdk.dir}/tools/ant/build.xml是定义了真正的编译步骤的文件必须存在

3.一些用到的其它标签

(1)定义文件目录path,从ant手册中的例子看:

<path id="base.path">
      <pathelement path="${classpath}"/>
      <fileset dir="lib">
        <include name="**/*.jar"/>
      </fileset>
      <pathelement location="classes"/>
 </path>
一个可以在其它地方通过refid引用的path,里面包括了具体path路径pathelement和通过include或exclude来筛选文件的fileset

(2)copy task

<copy todir="${source.absolute.dir}">

     <fileset dir="其它源码目录">
        <include name="**/*.java" />
        <include name="**/*.aidl" />
    </fileset>
 </copy>
odir:目标目录,源目录在fileset上定义,规则是包括所有.java文件和所有aidl文件;简单的如拷贝单个文件

<copy file="myfile.txt" tofile="mycopy.txt"/>

拷贝一个文件到某个目录

<copy file="myfile.txt" todir="../some/other/dir"/>

这些信息都可以通过查询ant参考手册https://ant.apache.org/manual/来了解,不一一叙述

通过上述描述应该可以理解并跟进整个ant打包android应用的流程,根据自己的需要进行定制化操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: