`

使用ant优化android项目编译速度,提高工作效率

阅读更多


在通常的Android大中型项目开发中,使用Eclipse进行android项目的开发有如下不便之处:

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

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

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

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

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

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

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

 

对于一个android项目而言,其编译流程大致如下

 

 

 
                                                   
 

 

针对现在生成项目速度慢的状况,发现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>
  原创,转载请注明原始地址 :)
  • 大小: 8.9 KB
  • 大小: 16.6 KB
  • 大小: 24.9 KB
0
8
分享到:
评论
2 楼 luopenger 2014-12-04  
taskdef com.android.ant.SetupTask cannot be found???
1 楼 yaoyun229 2013-01-14  
很不错,编译时确实很费时间,多谢了

相关推荐

    mac下ant打包android

    在Android应用开发中,构建和打包过程是必不可少的环节,特别是在多渠道发布时,需要针对不同的市场或平台生成定制的APK。...通过理解和配置Ant脚本,你可以有效地管理和自动化整个打包过程,提高开发效率。

    ant脚本编译jar

    本文将深入探讨如何使用`Ant`脚本来编译并创建一个`JAR`文件,以此来理解`Ant`脚本的工作原理和实际应用。 `Ant`是Apache软件基金会开发的一款开源构建工具,它使用XML格式定义构建过程,具有高度可配置性和可扩展...

    ANDROID_ANT自动编译打包签名教程

    通过以上步骤,我们可以实现Android项目的自动编译、打包以及签名功能,极大地提高了开发效率。同时,利用BAT脚本实现了批量处理的需求,进一步简化了发布流程。需要注意的是,实际操作中还需根据具体项目需求调整...

    Ant编译打包android工程流程

    ### Ant编译打包Android工程流程详解 #### 一、Ant编译打包步骤 ...综上所述,通过Ant工具,我们可以自动化完成Android项目的编译、打包、签名以及多渠道分发等一系列复杂的工作,极大地提高了开发效率。

    Android Ant编译环境配置(Win)

    ### Android Ant编译环境配置(Win) #### 一、引言 ...对于初学者来说,熟练掌握这些操作是非常有帮助的,它不仅能提高工作效率,还能加深对 Android 构建过程的理解。希望本文能为大家提供有益的帮助。

    Android Ant 开发入门教程

    ### Android Ant 开发入门教程 #### 一、概述 ...虽然现代 Android 开发通常依赖于更先进的 IDE(如 Android Studio),但了解如何使用 Ant 仍然对于深入理解构建过程和提高开发效率具有重要意义。

    App自动化之使用Ant编译项目多渠道打包

    通过掌握Ant工具和理解打包流程,开发者可以有效地提高工作效率,减少手动操作的错误,确保软件发布的稳定性和一致性。对于多渠道打包,理解如何在Ant脚本中处理渠道标识的替换是至关重要的。随着技术的发展,不断...

    ant android build config

    标题“ant android build config”指的是使用Ant构建工具来配置和管理Android项目的构建过程。Ant是Apache软件基金会的一个项目,它是一个基于Java的构建工具,能够处理各种构建任务,包括编译、打包、测试等。在...

    android 使用ant自动打包apk

    首先,你需要在Android项目中设置Ant环境。确保你已经安装了Java Development Kit (JDK) 和Apache Ant。Ant的配置文件通常位于项目的根目录下,名为`build.xml`。这个文件包含了构建过程的所有规则和任务。 1. **...

    unity3d android 使用ant打包批处理.

    标题"unity3d android 使用ant打包批处理"指的是使用Ant工具进行Unity3D Android项目的批量打包流程。这个流程旨在提高效率,尤其是在持续集成或频繁发布更新时,可以避免手动操作的繁琐和错误。 首先,你需要确保...

    Android 源码编译的jar包

    编译Android源码并生成`classes.jar`是一项复杂但极其有价值的工作,它能帮助开发者深入理解Android系统的运行机制,对优化应用性能、解决系统级问题或开发定制化ROM都有重大意义。通过学习这些知识,开发者可以更好...

    Android自动打包、签名、优化、上传ANT脚本

    其中,利用ANT脚本来实现Android项目的自动打包、签名、优化以及上传等流程是一种常见且高效的手段。本文将基于提供的文件信息,详细介绍如何使用ANT脚本完成这一系列操作。 #### 二、关键概念解析 **1. ANT ...

    官网下载完整的Ant,包括Ant-contrib

    使用Ant构建Android项目时,你需要在`build.xml`文件中配置Ant脚本,定义如何编译源代码、生成APK以及执行测试。Ant可以处理资源编译、R类生成、 Dex文件合并、签名和优化APK等步骤。 在Android Studio等现代IDE中...

    厂家自定义Ant编译流程源码分析

    ### 厂家自定义Ant编译流程源码分析 #### 一、Ant简介与安装配置 ...对于Android开发者而言,掌握Ant的使用方法不仅可以提高开发效率,还能帮助解决一些复杂的构建问题。希望本文能对读者有所帮助。

    Android-Android通过Ant多渠道打包

    通过使用Ant进行多渠道打包,开发者可以大大提高工作效率,避免了手动操作带来的错误和时间浪费。同时,这样的自动化流程也方便了版本管理和持续集成。对于大型项目或者需要频繁更新的应用来说,这是一个非常实用的...

    ant安装配置及教程、android打包工具

    在IT行业中,构建工具起着至关重要的作用,它们能够自动化应用程序的构建过程,极大地提高了开发效率。Apache Ant是其中的一款...通过学习和熟练掌握Ant,开发者能提高工作效率,专注于更重要的代码编写和功能实现。

    Android-这个项目是对android-tv-launcher开源项目用gradle编译的升级改造

    【Android TV Launcher 开源项目与 Gradle 编译升级详解】 Android TV Launcher 是一个专为 Android TV 设备设计的应用启动器,它提供了用户界面和交互方式,使得电视用户能够便捷地浏览和启动各种应用程序。该项目...

    Androidstudio中使用到的编译工具,最新版本gradle-4.8.1-bin.zip

    Android Studio是Google官方推出的Android应用程序开发集成开发环境(IDE),它极大地提高了Android应用开发的效率。Gradle则是一个强大的、灵活的构建系统,被广泛应用于Android开发,替代了早期的Ant和Maven,为...

    纯ant命令打包含工具

    在IT行业中,Ant是一个...通过编写和定制build.xml文件,开发者可以自动化重复的工作,提高效率,同时确保每个版本的一致性和质量。了解和掌握Ant命令,对于任何从事Android开发的人员来说,都是必不可少的技能之一。

Global site tag (gtag.js) - Google Analytics