zoukankan      html  css  js  c++  java
  • 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:ProjectDemouild.xml
         [echo] 666666,88888888
    
    
    BUILD SUCCESSFUL
    Total time: 0 seconds
    






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


    如果出现如下错误,说明没有放置jar文件
    Buildfile: D:ProjectDemouild.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:ProjectDemouild.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




  • 相关阅读:
    洛谷P2751 工序安排Job Processing
    UVA 1613 K度图染色
    线段树+扫描线
    分组背包
    洛谷P5506 封锁
    洛谷P2574 XOR的艺术
    List.Sort
    Dict.Count
    Convert.ToString(null) => null
    Convert 输入字符串的格式不正确
  • 原文地址:https://www.cnblogs.com/pangblog/p/3320094.html
Copyright © 2011-2022 走看看