zoukankan      html  css  js  c++  java
  • 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分!

  • 相关阅读:
    数据库操作
    jquery 第一章
    算法很美 第一章
    python 学习第四天
    python学习第三天
    python学习第二天
    学习python的第一天
    C#-线程
    C#-流、存储
    C#-集合
  • 原文地址:https://www.cnblogs.com/uncle2000/p/4302268.html
Copyright © 2011-2022 走看看