Ant多渠道批量打包

由于我现在已经用更好的gradle了,所以关于ant我只是简单的讲一讲,如果想学gradle请到我的博客中查看

http://www.cnblogs.com/uncle2000

ant的配置请自行百度

 

下面有几个必要文件的配置

 

local.properties

sdk.dir=D:\\android\\SDK\\sdk

  

project.properties

target=android-19

  

ant.properties

//项目包名
application.package=com.ww.simpleframework
//工程名
ant.project.name=simpleframework
//不解释
classpath.location=D:\\android\\SDK\\sdk\\tools\\lib\\ant-contrib-1.0b3.jar
java.encoding=utf-8
//不解释
out.absolute.dir=c:/temp
gos.path=e:/temp
//不解释
key.store=e:/m.keystore
key.store.password=simple
//不解释
key.alias=android.keystore
key.alias.password=simple
//可有可无
app_version=1.0
//这个是要替换变量的值 待会在build.xml中会讲到
market_channels=100,1006001,1006002,1006003

 

上面基本是标配,只需要把我的所有文件的变量值换成你们自己的就可以了 

下面是build.xml 最核心的代码

 

我先把build.xml分开讲,然后把build.xml打包上传,以后我上传一律要1分,要不然没人给我评论我了个去!

//标配
<?xml version="1.0" encoding="UTF-8"?>
//${ant.project.name}是一个变量 在ant.project文件中
<project name="${ant.project.name}" default="deploy">
//project域
//之前介绍的文件们
    <property file="local.properties" />
    <property file="ant.properties" /> 
    <loadproperties srcFile="project.properties" />
    <fail message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var" unless="sdk.dir" />
    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
        <classpath>
            <pathelement location="${classpath.location}"/> 
        </classpath>
    </taskdef>
    <import file="${sdk.dir}/tools/ant/build.xml" />
//////
/**方法体 下面单独拿出来讲**/
//////
</project>

 

上面代码中有个default="deploy" 这个是默认执行deploy方法 方法在方法体中

<target name="deploy" >
//foreach是循环执行,这句话的意思是
//ant.properties文件中的market_channels变量是个长字符串,当每遍历一个字符时遇到”,“则分出来一节字符串到list中,list的长度+1,且每次执行一次modify_manifest方法 传递一个参数channel
        <foreach delimiter="," list="${market_channels}" param="channel" target="modify_manifest" />
    </target>

 

下面就是modify_manifest方法  切记 "AndroidManifest.xml"文件中的带有CHANNEL_CODE那行只能占一行!!!

 <target name="modify_manifest" >
//replaceregexp是替换
        <replaceregexp byline="false" flags="g" >
//下面两句的意思就是 把"AndroidManifest.xml"文件中只要带有”CHANNEL_CODE“的那行中的”CHANNEL_CODE“替换成传过来的参数”channel“
            <regexp pattern="android:name=&quot;CHANNEL_CODE&quot; android:value=&quot;(.*)&quot;" />
            <substitution expression="android:name=&quot;CHANNEL_CODE&quot; android:value=&quot;${channel}&quot;" />
            <fileset dir="" includes="AndroidManifest.xml" />
        </replaceregexp>
//ant内部方法”release“就是打包
         <antcall target="release" /> 
///////
/*switch case方法 下面讲*/
///////
  </target>

下面是switch case 方法体  切记这个方法要下载一个包放到ant中来支持 否则你的ant打包不能用switch-case  这个包自行百度,但是包的包含是在上面的方法中的

关于 switch-case 我只少举几个例子 毕竟我这有40多个渠道 = = 

 

//记得前面传来的 变量     channel么?就是ant.properties文件中的market_channels
 <switch value="${channel}">
//当channel等于100
            <case value="100" >
//执行setname方法  后面讲这个方法的作用
                <antcall target="setname" >
//传递参数 和变量
                    <param
                        name="chouse"
                        value="xx1渠道" >
//再传递一个参数和变量
                    </param>
                      <param name="filepath" value="${channel}"/>
                </antcall>
            </case>

            <case value="1006001" >

                <antcall target="setname" >

                    <param
                        name="chouse"
                        value="xx2空间" >
                    </param>
                      <param name="filepath" value="${channel}"/>
                </antcall>
            </case>

            <case value="1006002" >

                <antcall target="setname" >

                    <param
                        name="chouse"
                        value="360市场" >
                    </param>
                      <param name="filepath" value="${channel}"/>
                </antcall>
            </case>

<default>

<echo message="Please check the value of the switch.value, it can not match to anything." />
</default>
</switch>

</target>

 

然后就是每个case执行的 setname方法

 <target name="setname" >
//接到传来的两个参数 由于我们项目经理的特殊要求,第一个参数的目的是在"${gos.path}/下生成一个名字为传过来的渠道名的xxx.apk的文件,第二个参数的目的是在${gos.path}/下创建名字为传过来的变量filepath为名的文件夹,下面生成hh.apk的文件
     <property name="chouse" value="default"/>
     <property name="filepath" value="default"/>
      <copy tofile="${gos.path}/${filepath}/hh.apk" >
            <fileset
                dir="${out.absolute.dir}/"
                includes="${ant.project.name}-release.apk" />
        </copy>
        <copy tofile="${gos.path}/${chouse}.apk" >
            <fileset
                dir="${out.absolute.dir}/"
                includes="{ant.project.name}-release.apk" />
        </copy>
//删除中间文件
        <delete includeEmptyDirs="true" >
            <fileset
                dir="${out.absolute.dir}"
                includes="**/*" />
        </delete>
//输出 循环结束
        <echo message="===========================" />
</target>

 

好的我来总结一下上面的代码干了些什么

 

执行默认方法”deploy“---》循环做deploy中的动作(执行modify_manifest方法且传递参数)---》替换渠道号且打包且执行switch-case(负责放制生成文件到指定位置)传递渠道号参数---》根据渠道号参数传递不同的渠道中文名且再次传递渠道号参数---》每循环一次生成2个apk按规律放到不同的文件夹下且删除中间文件---》执行下一次循环或者结束

下载地址:

http://download.csdn.net/detail/w52155242/8459607

以前我都是0分可下,但是没人给我评论,没人评论我如何成长?以后我都要1分!

 

posted @ 2015-02-26 22:02  2000叔叔  阅读(1402)  评论(0编辑  收藏  举报