相关文章列表:

《Android 自动编译、打包生成apk文件 1 - 命令行方式》Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式《Android 自动编译、打包生成apk文件 3 - 使用SDK Ant方式》


当前描述多渠道批量打包是基于第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>antBuildfile: D:\ProjectDemo\build.xml     [echo] 666666,88888888BUILD SUCCESSFULTotal 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 deployBuildfile: D:\ProjectDemo\build.xml     [echo] Run ant-contrib OKdeploy:     [echo] Run ant-contrib OKedit_and_build:     [echo] Run '666666' apk     [echo] Run ant-contrib OKedit_and_build:     [echo] Run '88888888' apkBUILD SUCCESSFULTotal 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




更多相关文章

  1. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜
  2. android 布局文件属性说明
  3. Android 属性文件build.prop,获取属性以及设置属性
  4. Android获取打开各种文件Intent汇总
  5. Android 使用PdfDocument生成PDF文件及遇到的问题
  6. android MTP 过滤指定的文件格式
  7. Android 我的 Android Studio 配置文件

随机推荐

  1. Android源码50例汇总,欢迎各位下载
  2. 万字长文带你彻底理解synchronized关键字
  3. 面试官问我,使用Dubbo有没有遇到一些坑?我
  4. 你了解java中的几种编码方式?解决乱码问题
  5. Android的MediaPlayer
  6. 让各位久等了,你要的大杀器快要来了
  7. java日志框架体系梳理,简单直白
  8. Spring IOC知识点一网打尽!
  9. 为什么推荐使用try-with-resources代替tr
  10. Zipper_Haskell笔记13