使用Ant打包Android应用具体解释——Ant使用解析

采得百花成蜜后,为谁辛苦为谁甜。这篇文章主要讲述使用Ant打包Android应用具体解释——Ant使用解析相关的知识,希望能为你提供帮助。
  上篇《使用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)首先在project下的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【使用Ant打包Android应用具体解释——Ant使用解析】

< 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应用的流程,依据自己的须要进行定制化操作































    推荐阅读