Android 自动编译、打包生成apk文件 4 - 多渠道批量打包


 相关文章列表:

 

 

 


    当前描述多渠道批量打包是基于第3篇文章基础之上的打包方式。



批量按渠道打包要做几件事情:
1. 存储渠道号
2. 取出渠道号
3. 遍历渠道号执行4,5操作
4. 根据取出的渠道号修改AndroidManifest.xml文件并打包










1. 存储渠道号
我选择存在新建的build.properties中,这样可以和打包的分离,当然也可以放到ant.properties, project.properties, local.properties 等文件中。


2. 取出渠道号
从properties中读取信息,xml代码如下

<?xml version="1.0" encoding="UTF-8"?>

<project name="custom_rules" >





    <property file="build.properties"/>





     <echo>${market_channels}</echo>





</project>



执行ant,结果如下:

D:\ProjectDemo>ant

Buildfile: D:\ProjectDemo\build.xml

     [echo] 666666,88888888





BUILD SUCCESSFUL

Total time: 0 seconds






3. 遍历渠道号执行4,5操作
ant核心库本身不支持遍历功能,所以需要引入新库ant-contrib-1.0b3.jar,需要放到ant\lib目录下,我直接放到当前项目目录下。
ant-contrib 下载地址: http://sourceforge.net/projects/ant-contrib/


如果出现如下错误,说明没有放置jar文件
Buildfile: D:\ProjectDemo\build.xml
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontri
b.properties. It could not be found.


遍历foreach的小例子,结合之前1,2遍历打印出渠道号

<?xml version="1.0" encoding="UTF-8"?>

<project name="custom_rules" >





    <property file="build.properties"/>

   

    <!-- 支持循环执行 -->

    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >

        <classpath>

            <!-- <pathelement location="lib/ant-contrib-1.0b3.jar" /> -->

               <pathelement location="./ant-contrib-1.0b3.jar" />

        </classpath>

    </taskdef>





     <echo>Run ant-contrib OK</echo>





     <target name="deploy"> 

        <foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=","> 

        </foreach> 

     </target> 





     <target name="edit_and_build"> 

          <echo>Run '${channel}' apk</echo>

     </target> 





</project>






结果:

D:\ProjectDemo>ant deploy

Buildfile: D:\ProjectDemo\build.xml

     [echo] Run ant-contrib OK





deploy:

     [echo] Run ant-contrib OK





edit_and_build:

     [echo] Run '666666' apk

     [echo] Run ant-contrib OK





edit_and_build:

     [echo] Run '88888888' apk





BUILD SUCCESSFUL

Total time: 0 seconds





4. 根据取出的渠道号修改AndroidManifest.xml文件并打包
* 正则替换 replaceregexp 标签
http://ant.apache.org/manual/Tasks/replaceregexp.html




** 先来看一个替换的例子,把当前文件夹下的AndroidManifest.xml指定的版本号修改为9

<?xml version="1.0" encoding="UTF-8"?>

<project name="custom_rules" >

     <!--  flags="g" 指定全局替换,替换所有符合规则的字段

     byline="false" 确认被替换的时候是一次替换一行还是多行

     pattern 属性用来指明正则表达式 -->

     <replaceregexp flags="g" byline="false"> 

         <regexp pattern="uses-sdk android:minSdkVersion="(.*)"" /> 

         <!-- substitution expression 中是替换的值,替换的值都定义在相对应的配置文件中 -->

         <substitution expression="uses-sdk android:minSdkVersion="9"" />

         <!-- fileset 属性中的 dir 用来指定被替换文件所在的目录

          includes 用来指定要替换哪个文件。 --> 

         <fileset dir="" includes="AndroidManifest.xml" /> 

    </replaceregexp> 





</project>





结果:
自己查看AndroidManifest.xml指定的版本号修是否改为9





以上已经实现了批量打包的功能,现在只需要打开build.xml加载最上面:

 

 

   <property file="build.properties"/>

   

    <!-- 支持循环执行 -->

    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >

        <classpath>

            <!-- <pathelement location="lib/ant-contrib-1.0b3.jar" /> -->

               <pathelement location="./ant-contrib-1.0b3.jar" />

        </classpath>

    </taskdef>





     <echo>Run ant-contrib OK</echo>





     <target name="deploy"> 

        <foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=","> 

        </foreach> 

     </target> 





     <target name="edit_and_build"> 

          <echo>Run '${channel}' apk</echo>

          <!--  flags="g" 指定全局替换,替换所有符合规则的字段

          byline="false" 确认被替换的时候是一次替换一行还是多行

          pattern 属性用来指明正则表达式 -->

          <replaceregexp flags="g" byline="false"> 

              <regexp pattern="android:value="(.*)" android:name="CHANNEL""/> 

              <!-- substitution expression 中是替换的值,替换的值都定义在相对应的配置文件中 -->

              <substitution expression="android:value="${channel}" android:name="CHANNEL"" />

              <!-- fileset 属性中的 dir 用来指定被替换文件所在的目录

               includes 用来指定要替换哪个文件。 --> 

              <fileset dir="" includes="AndroidManifest.xml" /> 

         </replaceregexp> 

         <!-- <property name="out.release.file" 

                       location="./${channel}.apk" /> 

         <antcall target="release" /> -->

         <!-- <property

            name="out.final.file"

            location="D:\ProjectDemo\${channel}.apk" /> -->

          <property name="out.final.file"

              location="D:\ProjectDemo\${channel}.apk" />

        <antcall target="clean" />

        <antcall target="release" />

     </target>  




例子下载地址http://download.csdn.net/detail/love_world_/6257753



出处:http://blog.csdn.net/androiddevelop/article/details/11619635




 

 

你可能感兴趣的:(android)