zoukankan      html  css  js  c++  java
  • cocos2d-x使用ant批量打包

    当项目需要在多渠道上线时,要打很多的渠道包,少则几十个,多种几百个。它们的区别一般只是渠道id或部分配置信息不同,这些信息均可写在配置文件中。

     

    例如常见的渠道id不同,一般定义在AndroidManifest.xml文件中<meta-data android:value="555555" android:name="CHANNEL" /> 

    获取方式:

    public static String getChanel(Context ctx){  
           String CHANNELID="000000";  
           try {  
                  ApplicationInfo  ai = ctx.getPackageManager().getApplicationInfo(  
                          ctx.getPackageName(), PackageManager.GET_META_DATA);  
                  Object value = ai.metaData.get("CHANNEL");  
                  if (value != null) {  
                      CHANNELID= value.toString();  
                  }  
              } catch (Exception e) {  
                  //  
              }  
             
           return CHANNELID;  
       } 

    如果一个个的去更改渠道号生成不同渠道包,效率低不说,还有可能不小心弄错了分发渠道,而使用ant可以批量生成渠道包,非常便捷。

     

    1. 准备工作,antcocos2d-x的环境搭建(详见:http://www.cnblogs.com/songcf/p/4040302.html

     

    2. 下载ant-contrib-1.0b3.jar

    因为ant本身不支持循环打包,所以需要下载一个jar来支持。下载后放在ant/lib目录下即可。

     

    3. 修改build.xml文件

    1)在<import file="${sdk.dir}/tools/ant/build.xml" />之前,引入ant-contrib-1.0b3.jar库。

        <!-- 使用第三方的ant包,使ant支持for循环-->
        <taskdef resource="net/sf/antcontrib/antcontrib.properties">
            <classpath>
                <pathelement location="D:/dev_envir/apache-ant-1.9.3/lib/ant-contrib-1.0b3.jar"/>  
            </classpath>
        </taskdef>
        <!-- version-tag: 1 -->
        <import file="${sdk.dir}/tools/ant/build.xml" />

    2)循环打包,使用正则匹配替换渠道号。

        <!--循环打包 -->
        <target name="deploy">  
            <foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">  
            </foreach>  
        </target>  
        
        <target name="modify_manifest">  
            <!-- 正则匹配替换渠道号 -->
            <replaceregexp flags="g" byline="false">  
                <regexp pattern='android:value="(.*)" android:name="CHANNEL"' />  
                <substitution expression='android:value="${channel}" android:name="CHANNEL"' />  
                <fileset dir="" includes="AndroidManifest.xml" />  
            </replaceregexp>  
            
            <!--<property  name="out.release.file" value="${out.absolute.dir}/${channel}.apk"/>-->        
            <antcall target="release"/>
            <copy tofile="${gos.path}/MultAnt_${channel}.apk">
                <fileset dir="${out.absolute.dir}/" includes="MultAnt-release.apk" />
            </copy>
            <delete includeEmptyDirs="true">  
                <fileset dir="${out.absolute.dir}" includes="**/*"/>           
            </delete>
            
            <echo message="==========================="/>
            <echo message="============OK============="/>
            <echo message="==========================="/>
        </target> 
    
    

    其中market_channels(渠道列表),gos.path(生成apk存放的目录),out.absolute.dir(临时文件目录)定义在ant.properties文件中。

      out.absolute.dir=d:/Proj_vs/MultAnt/proj.android/_temp

      gos.path=d:/Proj_vs/MultAnt/proj.android/_apk

      market_channels=111111,222222,333333,444444,555555

      app_version=1.0

    4. 最后进入proj.android目录运行命令ant deploy等待批量打包完成。

    完整build.xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="MultAnt" 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" />
    
        <!-- The ant.properties file can be created by you. It is only edited by the
             'android' tool to add properties to it.
             This is the place to change some Ant specific build properties.
             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'.
    
             For other overridable properties, look at the beginning of the rules
             files in the SDK, at tools/ant/build.xml
    
             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="ant.properties" />
    
        <!-- if sdk.dir was not set from one of the property file, then
             get it from the ANDROID_HOME env var.
             This must be done before we load project.properties since
             the proguard config can use sdk.dir -->
        <property environment="env" />
        <condition property="sdk.dir" value="${env.ANDROID_HOME}">
            <isset property="env.ANDROID_HOME" />
        </condition>
    
        <!-- The project.properties file is created and updated by the 'android'
             tool, as well as ADT.
    
             This contains project specific properties such as project target, and library
             dependencies. Lower level build properties are stored in ant.properties
             (or in .classpath for Eclipse projects).
    
             This file is an integral part of the build system for your
             application and should be checked into Version Control Systems. -->
        <loadproperties srcFile="project.properties" />
    
        <!-- quick check on sdk.dir -->
        <fail
                message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
                unless="sdk.dir"
        />
    
        <!--
            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.
    
             To customize existing targets, there are two options:
             - Customize only one target:
                 - copy/paste the target into this file, *before* the
                   <import> task.
                 - customize it to your needs.
             - Customize the whole content of build.xml
                 - copy/paste the content of the rules files (minus the top node)
                   into this file, replacing the <import> task.
                 - customize to your needs.
    
             ***********************
             ****** IMPORTANT ******
             ***********************
             In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
             in order to avoid having your file be overridden by tools such as "android update project"
        -->
        <!-- 使用第三方的ant包,使ant支持for循环-->
        <taskdef resource="net/sf/antcontrib/antcontrib.properties">
            <classpath>
                <pathelement location="D:/dev_envir/apache-ant-1.9.3/lib/ant-contrib-1.0b3.jar"/>  
            </classpath>
        </taskdef>
        <!-- version-tag: 1 -->
        <import file="${sdk.dir}/tools/ant/build.xml" />
    
        
        <!--循环打包 -->
        <target name="deploy">  
            <foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">  
            </foreach>  
        </target>  
        
        <target name="modify_manifest">  
            <!-- 正则匹配替换渠道号 -->
            <replaceregexp flags="g" byline="false">  
                <regexp pattern='android:value="(.*)" android:name="CHANNEL"' />  
                <substitution expression='android:value="${channel}" android:name="CHANNEL"' />  
                <fileset dir="" includes="AndroidManifest.xml" />  
            </replaceregexp>  
            
            <!--<property  name="out.release.file" value="${out.absolute.dir}/${channel}.apk"/>-->        
            <antcall target="release"/>
            <copy tofile="${gos.path}/MultAnt_${channel}.apk">
                <fileset dir="${out.absolute.dir}/" includes="MultAnt-release.apk" />
            </copy>
            <delete includeEmptyDirs="true">  
                <fileset dir="${out.absolute.dir}" includes="**/*"/>           
            </delete>
            
            <echo message="==========================="/>
            <echo message="============OK============="/>
            <echo message="==========================="/>
        </target> 
        
        
    </project>

    对应的ant.properties

    out.absolute.dir=d:/Proj_vs/MultAnt/proj.android/_temp
    gos.path=d:/Proj_vs/MultAnt/proj.android/_apk
    
    key.store=D:/Proj_vs/camellia.keystore
    key.store.password=xxx
    key.alias=camellia
    key.alias.password=xxx
    
    market_channels=111111,222222,333333,444444,555555
    app_version=1.0
  • 相关阅读:
    [转]swift 学习资源 大集合
    [转]Swift 编程语言入门教程
    luogu 3375 KMP模板题
    我终于明白了的马拉车算法———感谢我们学校的大佬
    A*B problem(FFT)
    又是毕业季1&&又是毕业季2
    邻接表——最简单易懂的写法——向非我非非我大佬低头
    马拉车——Manacher一篇看上去很靠谱的理解(代码显然易懂)
    邻接表存储
    一直想写的关于tarjan算法的理解——向struct edge大佬低头
  • 原文地址:https://www.cnblogs.com/songcf/p/4040412.html
Copyright © 2011-2022 走看看