1、Android项目编译周期长,编译项目命令取消困难

2、在进行Android项目的编译的同时,Eclipse锁定工作区不能进行修改操作

3、在只进行资源文件的修改时,Eclipse对资源文件的修改会导致整个项目的编译,在无法打开自动编译模式下,极为不便

对项目进行分包处理后,android编译速度极慢。

对于我们现在的项目,在未进行分包时编译一次大约需要4、5分钟而有时候你只是简单的修改了一下java文件。。。

进行分包后,编译整个项目时长达到10分以上,有时甚至造成eclipse假死

严重的损耗了工作时间和降低工作效率。

针对现在生成项目速度慢的状况,发现android 项目编译时对资源文件的操作占大量时间。

Eclipse默认编译流程会有两次aapt调用。每次时间约四分钟。

针对我们进行android项目开发时的经验,有以下几种情况:

1、频繁更改资源文件,在类中需要引用资源但不用生成apk

2、频繁修改java类文件,资源文件不变,需要生成apk

3、次数很少的同时修改资源文件和java类文件,同时生成apk

使用ant build 脚本实现将二次资源文件的操作分开,可以良好改善编译速度,提高工作效率(至少一半)。在ant脚本编译模式下,对于以上三种情况:

1、在只有资源文件更改的情况 :使用命令 ant generateR 只更新R文件 耗时 约4mins

2、在没有更新资源文件后,只修改JAVA类,使用 ant simpledebug 忽略资源文件R引用的更新,并打包 耗时 约5mins

3、更新了资源文件,又修改了JAVA文件想立即打包则使用ant debug 此为Eclipse默认模式,时长 大约10minus  -_-|

以下为ant build优化,大家可以参考一下

<?xml version="1.0" encoding="UTF-8"?>
<project name="Reader" > <!-- 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" /> <!-- The build.properties file can be created by you and is never touched
by the 'android' tool. This is the place to change some of the
default property values used by the Ant rules.
Here are some properties you may want to change/update: source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'. Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action. This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<property file="build.properties" /> <!-- The default.properties file is created and updated by the 'android'
tool, as well as ADT.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<property file="default.properties" /> <!-- Custom Android task to deal with the project target, and import the
proper rules.
This requires ant 1.6.0 or above. -->
<path id="android.antlibs">
<pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
<pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
<pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
</path> <taskdef name="setup"
classname="com.android.ant.SetupTask"
classpathref="android.antlibs" /> <!-- extension targets. Uncomment the ones where you want to do custom work
in between standard targets -->
<!--
<target name="-pre-build">
</target>
<target name="-pre-compile">
</target> [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}]
<target name="-post-compile">
</target>
--> <!-- Execute the Android Setup task that will setup some properties
specific to the target, and import the build rules files. The rules file is imported from
<SDK>/platforms/<target_platform>/ant/ant_rules_r#.xml To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<setup> task.
- customize it to your needs.
- Customize the whole script.
- copy/paste the content of the rules files (minus the top node)
into this file, *after* the <setup> task
- disable the import of the rules by changing the setup task
below to <setup import="false" />.
- customize to your needs.
-->
<setup import="false"/>
<!--
This rules file is meant to be imported by the custom Ant task:
com.android.ant.SetupTask The following properties are put in place by the importing task:
android.jar, android.aidl, aapt, aidl, and dx Additionnaly, the task sets up the following classpath reference:
android.target.classpath
This is used by the compiler task as the boot classpath.
--> <!-- Custom tasks -->
<taskdef name="aapt"
classname="com.android.ant.AaptExecLoopTask"
classpathref="android.antlibs" /> <taskdef name="aidl"
classname="com.android.ant.AidlExecTask"
classpathref="android.antlibs" /> <taskdef name="apkbuilder"
classname="com.android.ant.ApkBuilderTask"
classpathref="android.antlibs" /> <taskdef name="xpath"
classname="com.android.ant.XPathTask"
classpathref="android.antlibs" /> <taskdef name="if"
classname="com.android.ant.IfElseTask"
classpathref="android.antlibs" /> <taskdef name="nowtime" classname="AntNowTime" classpath="."/>
<!-- Properties --> <!-- Tells adb which device to target. You can change this from the command line
by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for
the emulator. -->
<property name="adb.device.arg" value="" /> <property name="android.tools.dir" location="${sdk.dir}/tools" />
<!-- Name of the application package extracted from manifest file -->
<xpath input="AndroidManifest.xml" expression="/manifest/@package"
output="manifest.package" />
<!-- Value of the debuggable attribute (Application node) extracted from manifest file -->
<xpath input="AndroidManifest.xml" expression="/manifest/application/@android:debuggable"
output="manifest.debuggable" default="false"/>
<!-- Value of the debuggable attribute (Application node) extracted from manifest file -->
<xpath input="AndroidManifest.xml" expression="/manifest/application/@android:hasCode"
output="manifest.hasCode" default="true"/> <!-- Input directories -->
<property name="source.dir" value="src" />
<property name="source.absolute.dir" location="${source.dir}" />
<property name="gen.dir" value="gen" />
<property name="gen.absolute.dir" location="${gen.dir}" />
<property name="resource.dir" value="res" />
<property name="resource.absolute.dir" location="${resource.dir}" />
<property name="asset.dir" value="assets" />
<property name="asset.absolute.dir" location="${asset.dir}" /> <!-- Directory for the third party java libraries -->
<property name="external.libs.dir" value="${reader_libs}" />
<property name="external.libs.absolute.dir" location="${external.libs.dir}" /> <!-- Directory for the native libraries -->
<property name="native.libs.dir" value="libs" />
<property name="native.libs.absolute.dir" location="${native.libs.dir}" /> <!-- Output directories -->
<property name="out.dir" value="bin" />
<property name="out.absolute.dir" location="${out.dir}" />
<property name="out.classes.dir" value="${out.absolute.dir}" />
<property name="out.classes.absolute.dir" location="${out.classes.dir}" />
<property name="out.dex.input.absolute.dir" value="${out.classes.absolute.dir}" /> <!-- Intermediate files -->
<property name="dex.file.name" value="classes.dex" />
<property name="intermediate.dex.file"
location="${out.absolute.dir}/${dex.file.name}" />
<property name="resource.package.file.name"
value="${ant.project.name}.ap_" /> <!-- The final package file to generate
These can be overridden by setting them earlier to
different values -->
<property name="out.debug.unaligned.file"
location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
<property name="out.debug.file"
location="${out.absolute.dir}/${ant.project.name}-debug.apk" /> <property name="out.unsigned.file.name"
value="${ant.project.name}-unsigned.apk" />
<property name="out.unsigned.file"
location="${out.absolute.dir}/${out.unsigned.file.name}" /> <property name="out.unaligned.file.name"
value="${ant.project.name}-unaligned.apk" />
<property name="out.unaligned.file"
location="${out.absolute.dir}/${out.unaligned.file.name}" /> <property name="out.release.file.name"
value="${ant.project.name}-release.apk" />
<property name="out.release.file"
location="${out.absolute.dir}/${out.release.file.name}" /> <!-- set some properties used for filtering/override. If those weren't defined
before, then this will create them with empty values, which are then ignored
by the custom tasks receiving them. -->
<property name="version.code" value="" />
<property name="aapt.resource.filter" value="" />
<property name="filter.abi" value="" /> <!-- Verbosity -->
<property name="verbose" value="false" />
<!-- This is needed by emma as it uses multilevel verbosity instead of simple 'true' or 'false'
The property 'verbosity' is not user configurable and depends exclusively on 'verbose'
value.-->
<condition property="verbosity" value="verbose" else="quiet">
<istrue value="${verbose}" />
</condition>
<!-- This is needed to switch verbosity of zipalign. Depends exclusively on 'verbose'
-->
<condition property="v.option" value="-v" else="">
<istrue value="${verbose}" />
</condition>
<!-- This is needed to switch verbosity of dx. Depends exclusively on 'verbose' -->
<condition property="verbose.option" value="--verbose" else="">
<istrue value="${verbose}" />
</condition> <!-- properties for signing in release mode -->
<condition property="has.keystore">
<and>
<isset property="key.store" />
<length string="${key.store}" when="greater" length="0" />
<isset property="key.alias" />
</and>
</condition>
<condition property="has.password">
<and>
<isset property="has.keystore" />
<isset property="key.store.password" />
<isset property="key.alias.password" />
</and>
</condition> <!-- Tools -->
<condition property="exe" value=".exe" else=""><os family="windows" /></condition>
<property name="adb" location="${android.tools.dir}/adb${exe}" />
<property name="zipalign" location="${android.tools.dir}/zipalign${exe}" /> <!-- Emma configuration -->
<property name="emma.dir" value="${sdk.dir}/tools/lib" />
<path id="emma.lib">
<pathelement location="${emma.dir}/emma.jar" />
<pathelement location="${emma.dir}/emma_ant.jar" />
</path>
<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
<!-- End of emma configuration --> <!-- Macros --> <!-- Configurable macro, which allows to pass as parameters output directory,
output dex filename and external libraries to dex (optional) -->
<macrodef name="dex-helper">
<element name="external-libs" optional="yes" />
<element name="extra-parameters" optional="yes" />
<sequential>
<echo>Converting compiled files and external libraries into ${intermediate.dex.file}...</echo>
<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="--dex" />
<arg value="--output=${intermediate.dex.file}" />
<extra-parameters />
<arg line="${verbose.option}" />
<arg path="${out.dex.input.absolute.dir}" />
<fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
<path refid="android.libraries.jars" />
<external-libs />
</apply>
</sequential>
</macrodef> <!-- This is macro that enable passing variable list of external jar files to ApkBuilder
Example of use:
<package-helper sign.package="true" output.filepath="/path/to/foo.apk">
<extra-jars>
<jarfolder path="my_jars" />
<jarfile path="foo/bar.jar" />
<jarfolder path="your_jars" />
</extra-jars>
</package-helper> -->
<macrodef name="package-helper">
<attribute name="sign.package" />
<attribute name="output.filepath" />
<element name="extra-jars" optional="yes" />
<sequential>
<apkbuilder
outfolder="${out.absolute.dir}"
resourcefile="${resource.package.file.name}"
apkfilepath="@{output.filepath}"
signed="@{sign.package}"
debug="${manifest.debuggable}"
abifilter="${filter.abi}"
verbose="${verbose}"
hascode="${manifest.hasCode}">
<dex path="${intermediate.dex.file}"/>
<sourcefolder path="${source.absolute.dir}"/>
<sourcefolder refid="android.libraries.src"/>
<jarfolder path="${external.libs.absolute.dir}" />
<jarfolder refid="android.libraries.libs" />
<nativefolder path="${native.libs.absolute.dir}" />
<nativefolder refid="android.libraries.libs" />
<extra-jars/>
</apkbuilder>
</sequential>
</macrodef> <!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets
debug, -debug-with-emma and release.-->
<macrodef name="zipalign-helper">
<attribute name="in.package" />
<attribute name="out.package" />
<sequential>
<echo>Running zip align on final apk...</echo>
<exec executable="${zipalign}" failonerror="true">
<arg line="${v.option}" />
<arg value="-f" />
<arg value="4" />
<arg path="@{in.package}" />
<arg path="@{out.package}" />
</exec>
</sequential>
</macrodef> <!-- This is macro used only for sharing code among two targets, -install and
-install-with-emma which do exactly the same but differ in dependencies -->
<macrodef name="install-helper">
<sequential>
<echo>Installing ${out.debug.file} onto default emulator or device...</echo>
<exec executable="${adb}" failonerror="true">
<arg line="${adb.device.arg}" />
<arg value="install" />
<arg value="-r" />
<arg path="${out.debug.file}" />
</exec>
</sequential>
</macrodef> <!-- Rules --> <target name="use" description="Use the Task" >
<nowtime/>
</target>
<!-- Creates the output directories if they don't exist yet. -->
<target name="-dirs">
<echo>Creating output directories if needed...</echo>
<mkdir dir="${resource.absolute.dir}" />
<mkdir dir="${external.libs.absolute.dir}" />
<mkdir dir="${out.absolute.dir}" />
<if condition="${manifest.hasCode}">
<then>
<mkdir dir="${gen.absolute.dir}" />
<mkdir dir="${out.classes.absolute.dir}" />
</then>
</if>
</target> <!-- empty default pre-build target. Create a similar target in
your build.xml and it'll be called instead of this one. -->
<target name="-pre-build"/> <!-- Generates the R.java file for this project's resources. -->
<target name="generateR" depends="cleanR,-dirs, -pre-build">
<if condition="${manifest.hasCode}">
<then>
<echo>Generating R.java / Manifest.java from the resources...</echo>
<nowtime/>
<aapt executable="${aapt}"
command="package"
verbose="${verbose}"
manifest="AndroidManifest.xml"
androidjar="${android.jar}"
rfolder="${gen.absolute.dir}">
<res path="${resource.absolute.dir}" />
</aapt>
<nowtime/>
</then>
<else>
<echo>hasCode = false. Skipping...</echo>
</else>
</if>
</target> <!-- Generates java classes from .aidl files. -->
<target name="-aidl" depends="-dirs">
<if condition="${manifest.hasCode}">
<then>
<echo>Compiling aidl files into Java classes...</echo>
<aidl executable="${aidl}" framework="${android.aidl}"
genFolder="${gen.absolute.dir}">
<source path="${source.absolute.dir}"/>
<source refid="android.libraries.src"/>
</aidl>
</then>
<else>
<echo>hasCode = false. Skipping...</echo>
</else>
</if>
</target> <!-- empty default pre-compile target. Create a similar target in
your build.xml and it'll be called instead of this one. -->
<target name="-pre-compile"/> <!-- Compiles this project's .java files into .class files. -->
<target name="compile" depends="generateR, -aidl, -pre-compile"
description="Compiles project's .java files into .class files">
<if condition="${manifest.hasCode}">
<then>
<!-- If android rules are used for a test project, its classpath should include
tested project's location -->
<condition property="extensible.classpath"
value="${tested.project.absolute.dir}/bin/classes"
else=".">
<isset property="tested.project.absolute.dir" />
</condition>
<condition property="extensible.libs.classpath"
value="${tested.project.absolute.dir}/libs"
else="./libs">
<isset property="tested.project.absolute.dir" />
</condition>
<javac encoding="GBK" target="1.5" debug="true" extdirs=""
destdir="${out.classes.absolute.dir}"
bootclasspathref="android.target.classpath"
verbose="${verbose}"
classpath="${extensible.classpath}"
classpathref="android.libraries.jars">
<src path="${reader_service_project}/src" />
<src path="${reader_data_project}/src" />
<src path="${reader_service_project}/gen" />
<src path="${reader_data_project}/gen" />
<src path="${source.absolute.dir}" />
<src path="${gen.absolute.dir}" />
<src refid="android.libraries.src" />
<classpath>
<fileset dir="${reader_lib_project}/lib" includes="*.jar" />
<fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
<fileset dir="${extensible.libs.classpath}" includes="*.jar" />
</classpath>
</javac>
</then>
<else>
<echo>hasCode = false. Skipping...</echo>
</else>
</if>
</target> <!-- Compiles this project's .java files into .class files. -->
<target name="simplecompile" depends="-pre-compile"
description="Compiles project's .java files into .class files">
<echo>simplecompile start at time</echo><nowtime/>
<if condition="${manifest.hasCode}">
<then>
<!-- If android rules are used for a test project, its classpath should include
tested project's location -->
<condition property="extensible.classpath"
value="${tested.project.absolute.dir}/bin/classes"
else=".">
<isset property="tested.project.absolute.dir" />
</condition>
<condition property="extensible.libs.classpath"
value="${tested.project.absolute.dir}/libs"
else="./libs">
<isset property="tested.project.absolute.dir" />
</condition>
<javac encoding="GBK" target="1.5" debug="true" extdirs=""
destdir="${out.classes.absolute.dir}"
bootclasspathref="android.target.classpath"
verbose="${verbose}"
classpath="${extensible.classpath}"
classpathref="android.libraries.jars">
<src path="${reader_service_project}/src" />
<src path="${reader_data_project}/src" />
<src path="${reader_service_project}/gen" />
<src path="${reader_data_project}/gen" />
<src path="${source.absolute.dir}" />
<src path="${gen.absolute.dir}" />
<src refid="android.libraries.src" />
<classpath>
<fileset dir="${reader_lib_project}/lib" includes="*.jar" />
<fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
<fileset dir="${extensible.libs.classpath}" includes="*.jar" />
</classpath>
</javac>
</then>
<else>
<echo>hasCode = false. Skipping...</echo>
</else>
</if>
<echo>simplecompile end at time</echo><nowtime/>
</target> <!-- empty default post-compile target. Create a similar target in
your build.xml and it'll be called instead of this one. -->
<target name="-post-compile"/> <!-- Converts this project's .class files into .dex files -->
<target name="-dex" depends="simplecompile, -post-compile"
unless="do.not.compile">
<if condition="${manifest.hasCode}">
<then>
<dex-helper />
</then>
<else>
<echo>hasCode = false. Skipping...</echo>
</else>
</if>
</target> <!-- Converts this project's .class files into .dex files -->
<target name="-simpledex" depends="simplecompile, -post-compile"
unless="do.not.compile">
<echo>-simpledex start at time</echo><nowtime/>
<if condition="${manifest.hasCode}">
<then>
<dex-helper />
</then>
<else>
<echo>hasCode = false. Skipping...</echo>
</else>
</if>
<echo>-simpledex end at time</echo><nowtime/>
</target> <!-- Puts the project's resources into the output package file
This actually can create multiple resource package in case
Some custom apk with specific configuration have been
declared in default.properties.
-->
<target name="-package-resources">
<echo>Packaging resources start at time</echo>
<echo>Packaging resources start at time</echo><nowtime/>
<aapt executable="${aapt}"
command="package"
versioncode="${version.code}"
manifest="AndroidManifest.xml"
assets="${asset.absolute.dir}"
androidjar="${android.jar}"
apkfolder="${out.absolute.dir}"
resourcefilename="${resource.package.file.name}"
resourcefilter="${aapt.resource.filter}">
<res path="${resource.absolute.dir}" />
<!-- <nocompress /> forces no compression on any files in assets or res/raw -->
<!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
</aapt>
<echo>Packaging resources end at time</echo><nowtime/>
</target> <!-- Packages the application and sign it with a debug key. -->
<target name="-package-debug-sign" depends="-dex, -package-resources">
<package-helper
sign.package="true"
output.filepath="${out.debug.unaligned.file}" />
</target> <!-- Packages the application and sign it with a debug key. -->
<target name="-simplepackage-debug-sign" depends="-simpledex, -package-resources">
<package-helper
sign.package="true"
output.filepath="${out.debug.unaligned.file}" />
</target> <!-- Packages the application without signing it. -->
<target name="-package-release" depends="-dex, -package-resources">
<package-helper
sign.package="false"
output.filepath="${out.unsigned.file}"/>
</target> <target name="-compile-tested-if-test" if="tested.project.dir" unless="do.not.compile.again">
<subant target="compile">
<fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
</subant>
</target> <target name="-simplecompile-tested-if-test" if="tested.project.dir" unless="do.not.compile.again">
<subant target="simplecompile">
<fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
</subant>
</target> <!-- Builds debug output package, provided all the necessary files are already dexed -->
<target name="debug" depends="-compile-tested-if-test, -package-debug-sign"
description="Builds the application and signs it with a debug key.">
<zipalign-helper in.package="${out.debug.unaligned.file}"
out.package="${out.debug.file}" />
<echo>Debug Package: ${out.debug.file}</echo>
</target> <!-- Builds debug output package, provided all the necessary files are already dexed -->
<target name="simpledebug" depends="-simplecompile-tested-if-test, -simplepackage-debug-sign"
description="Builds the application and signs it with a debug key.">
<echo>Debug Package: ${out.debug.unaligned.file}</echo>
<!--
<zipalign-helper in.package="${out.debug.unaligned.file}"
out.package="${out.debug.file}" />
<echo>Debug Package: ${out.debug.file}</echo>
-->
</target> <!-- called through target 'release'. Only executed if the keystore and
key alias are known but not their password. -->
<target name="-release-prompt-for-password" if="has.keystore" unless="has.password">
<!-- Gets passwords -->
<input
message="Please enter keystore password (store:${key.store}):"
addproperty="key.store.password" />
<input
message="Please enter password for alias '${key.alias}':"
addproperty="key.alias.password" />
</target> <!-- called through target 'release'. Only executed if there's no
keystore/key alias set -->
<target name="-release-nosign" unless="has.keystore">
<echo>No key.store and key.alias properties found in build.properties.</echo>
<echo>Please sign ${out.unsigned.file} manually</echo>
<echo>and run zipalign from the Android SDK tools.</echo>
</target> <target name="-set-release-mode">
<property name="build.mode.release" value="true"/>
</target> <!-- This runs -package-release and -release-nosign first and then runs
only if release-sign is true (set in -release-check,
called by -release-no-sign)-->
<target name="release"
depends="-set-release-mode, -package-release, -release-prompt-for-password, -release-nosign"
if="has.keystore"
description="Builds the application. The generated apk file must be signed before
it is published.">
<!-- Signs the APK -->
<echo>Signing final apk...</echo>
<signjar
jar="${out.unsigned.file}"
signedjar="${out.unaligned.file}"
keystore="${key.store}"
storepass="${key.store.password}"
alias="${key.alias}"
keypass="${key.alias.password}"
verbose="${verbose}" /> <!-- Zip aligns the APK -->
<zipalign-helper in.package="${out.unaligned.file}"
out.package="${out.release.file}" />
<echo>Release Package: ${out.release.file}</echo>
</target> <target name="install" depends="debug"
description="Installs/reinstalls the debug package onto a running
emulator or device. If the application was previously installed,
the signatures must match." >
<install-helper />
</target> <target name="-uninstall-check">
<condition property="uninstall.run">
<isset property="manifest.package" />
</condition>
</target> <target name="-uninstall-error" depends="-uninstall-check" unless="uninstall.run">
<echo>Unable to run 'ant uninstall', manifest.package property is not defined.
</echo>
</target> <!-- Uninstalls the package from the default emulator/device -->
<target name="uninstall" depends="-uninstall-error" if="uninstall.run"
description="Uninstalls the application from a running emulator or device.">
<echo>Uninstalling ${manifest.package} from the default emulator or device...</echo>
<exec executable="${adb}" failonerror="true">
<arg line="${adb.device.arg}" />
<arg value="uninstall" />
<arg value="${manifest.package}" />
</exec>
</target> <target name="clean" description="Removes output files created by other targets.">
<delete dir="${out.absolute.dir}" verbose="${verbose}" />
<delete dir="${gen.absolute.dir}" verbose="${verbose}" />
</target>
<target name="cleanR" description="Removes R.java file created by other targets.">
<delete dir="${gen.absolute.dir}" verbose="${verbose}" />
</target>
<!-- Targets for code-coverage measurement purposes, invoked from external file --> <!-- Emma-instruments tested project classes (compiles the tested project if necessary)
and writes instrumented classes to ${instrumentation.absolute.dir}/classes -->
<target name="-emma-instrument" depends="compile">
<echo>Instrumenting classes from ${out.absolute.dir}/classes...</echo>
<!-- It only instruments class files, not any external libs -->
<emma enabled="true">
<instr verbosity="${verbosity}"
mode="overwrite"
instrpath="${out.absolute.dir}/classes"
outdir="${out.absolute.dir}/classes">
</instr>
<!-- TODO: exclusion filters on R*.class and allowing custom exclusion from
user defined file -->
</emma>
</target> <target name="-dex-instrumented" depends="-emma-instrument">
<dex-helper>
<extra-parameters>
<arg value="--no-locals" />
</extra-parameters>
<external-libs>
<fileset file="${emma.dir}/emma_device.jar" />
</external-libs>
</dex-helper>
</target> <!-- Invoked from external files for code coverage purposes -->
<target name="-package-with-emma" depends="-dex-instrumented, -package-resources">
<package-helper
sign.package="true"
output.filepath="${out.debug.unaligned.file}">
<extra-jars>
<!-- Injected from external file -->
<jarfile path="${emma.dir}/emma_device.jar" />
</extra-jars>
</package-helper>
</target> <target name="-debug-with-emma" depends="-package-with-emma">
<zipalign-helper in.package="${out.debug.unaligned.file}"
out.package="${out.debug.file}" />
</target> <target name="-install-with-emma" depends="-debug-with-emma">
<install-helper />
</target> <!-- End of targets for code-coverage measurement purposes --> <target name="help"> <echo>Modified Android Ant Build. Available targets:</echo>
<echo> generateR: Generates the R.java file for this project's resources.</echo>
<echo> simplecompile: Compiles project's .java files into .class files.</echo>
<echo> simpledebug: Builds the application and signs it with a debug key.</echo> <!-- displays starts at col 13
|13 80| -->
<echo>Android Ant Build. Available targets:</echo>
<echo> help: Displays this help.</echo>
<echo> clean: Removes output files created by other targets.</echo>
<echo> compile: Compiles project's .java files into .class files.</echo>
<echo> debug: Builds the application and signs it with a debug key.</echo>
<echo> release: Builds the application. The generated apk file must be</echo>
<echo> signed before it is published.</echo>
<echo> install: Installs/reinstalls the debug package onto a running</echo>
<echo> emulator or device.</echo>
<echo> If the application was previously installed, the</echo>
<echo> signatures must match.</echo>
<echo> uninstall: Uninstalls the application from a running emulator or</echo>
<echo> device.</echo>
</target> </project>

使用ant优化android项目编译速度,提高工作效率的更多相关文章

  1. Android Studio in OSX 提高工作效率的快捷键

    前言 本篇文章参考了<倍数提高工作效率的Android Studio>一文,快捷键基于OS X系统. OS X Yosemite 10.10.5 Android Studio 1.3.1 ...

  2. 倍数提高工作效率的 Android Studio 奇技

    来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<An ...

  3. [转]倍数提高工作效率的 Android Studio 奇技

    转自:http://android.jobbole.com/81687/ 倍数提高工作效率的 Android Studio 奇技 2015/10/08 · 技术分享 · 4 评论· Android S ...

  4. 怎样使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率

    在寻常的开发中常常会有非常多列表页面.每做一个列表页就须要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件. 假设版本号更新迭代比較频繁,如此以往,就会使项目pr ...

  5. 15款提高工作效率的 Web 项目管理工具

    在今天的快节奏的商业世界里,能够通过计划.组织.和管理资源池以及评估开发资源的模式来管理一个项目,是一个很艰巨的任务. 有很多现成的项目管理软件来帮助减轻项目管理的负担,并且他们几乎覆盖了所有类型的业 ...

  6. Vin码识别(车架号识别)技术,摆脱手动录入提高工作效率

    本文主题:Vin码识别(车架号识别)技术,摆脱手动录入提高工作效率 本文关键词:Vin码识别,汽车Vin码识别,车架号识别,汽车车架号识别,车代码识别,车代号识别 本文主旨:一.Vin码(车架号)在什 ...

  7. Windows 下有什么软件能够极大地提高工作效率

    Windows 下有什么软件能够极大地提高工作效率?修改 可以推荐一些好的应用或者有趣的程序,能提升工作效率或者能让人眼前一亮的.修改 举报1 条评论 分享 • 邀请回答   按票数排序按时间排序 2 ...

  8. 程序员提高工作效率的15个技巧【Facebook】

    程序员提高工作效率的15个技巧[Facebook] 作者: habadog 日期: 2015 年 02 月 13 日发表评论 (0)查看评论 程序员提高工作效率的15个技巧[Facebook] 1,D ...

  9. 使用并行ssh提高工作效率

    我们经常需要ssh到多个主机上执行相同的命令,为了提高效率,我们通常会自己写个脚本,循环遍历执行我们的命令,比如: for host in `cat hosts.txt`;do ssh usernam ...

随机推荐

  1. bash shell中可以使用wait

    https://jingyan.baidu.com/article/b907e6278fbd8946e7891c17.html ==================================== ...

  2. iOS中文API之UITouch详解

    UITouch 对象用于位置. 大小. 运动和一根手指在屏幕上为某一特定事件的力度.触摸的力度是从开始在 iOS 9 支持 3D 的触摸的设备上可用.你可以通过UIEvent对象传递给响应者对象访问. ...

  3. OpenGL ES 3.0之Texturing纹理详解(二)

    Texture Filtering and Mipmapping 纹理过滤与多级纹理 前面我们已经讲了单个2D图像的2D纹理的介绍,这篇文章主要讲解多级纹理.纹理坐标是用于生成一个2D索引,当放大和缩 ...

  4. 【Python】安装geocoder

    C:\Users\horn1\Desktop\python\49-geo>pip install geocoder Collecting geocoder Downloading https:/ ...

  5. fortune 计算公式

    fortune 计算PV值. 举例:一笔 120.00的债权; 12天还完,3.15号借款,3.16开始还款.等额本息还款计算出每天还款: 10.22 根据 现值计算公式 PV = CFn/(1+r) ...

  6. 牛客网-《剑指offer》-变态跳台阶

    C++ class Solution { public: int jumpFloorII(int n) { <<--n; } }; 推导: 关于本题,前提是n个台阶会有一次n阶的跳法.分析 ...

  7. 搭建持续集成单元测试平台(Jenkins+Ant+Java+Junit+SVN)

    一.环境准备 Jenkins: 到官网下载jenkins.war包:http://jenkins-ci.org/ 安装方法有两种: 把下载下来的jenkins.war包放到文件夹下,如C:\jenki ...

  8. 用Gearman分发PHP应用程序的工作负载

    文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/518 虽然一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体如今 ...

  9. web ide

    https://www.jianshu.com/p/339dff3da1fa https://www.eclipse.org/che/ https://github.com/Coding/WebIDE ...

  10. js setTimeout setInterval 第三个参数说明

    1.api setTimeout: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout var timeoutID = ...