ant 打不同渠道包

由于公司内置的需要,我们的程序要针对不同的厂商打不同的apk,而且不同厂商之间还有一些差别,所以我在原来打包的基础上进行了扩展,支持不同厂商。

  为了便于扩展和维护,我把特殊厂商的代码与原来正常打包的代码进行分离,同时让打包者可以自动选择当前要打包的厂商。



改动的几个地方:

  1. 把不同厂商要改动的地方写在宏(就相当于java里的方法)里面,而这些所有的宏,都放在一个当独的special_company.xml文件里:
Xml代码  收藏代码

    <?xml version="1.0" encoding="gbk"?> 
     
    <project> 
        <!-- 宏:打A厂商的包 --> 
        <macrodef name="aPack"> 
           <sequential> 
                <!-- 改manifest文件里的包名(直接改) --> 
                <echo>改manifest文件里的包名(直接改)</echo> 
                <replaceregexp file="${project.58Client}/AndroidManifest.xml" 
                    encoding="utf-8" 
                    match="package=&quot;(.*?)&quot;" 
                    replace=" package=&quot;xxxx&quot; " 
                    byline="true"/> 
                     
                <!-- 隐式意思的action字符串(要用搜索来改) --> 
                <echo>隐式意思的action字符串(要用搜索来改)</echo> 
                <replaceregexp encoding="utf-8" flags="g" 
                    match="xxxx.intent.action.DOWNAPK" 
                    replace="xxxx.intent.action.DOWNAPK"> 
                    <fileset dir="${project.58Client}"> 
                        <include name="**/*.java"/> 
                        <include name="**/*.xml"/> 
                    </fileset> 
                </replaceregexp> 
                 
                <!-- 改xml文件里使用自定义属性的命名空间(搜索http://schemas.android.com/apk/res/xxxx来改) --> 
                <echo>改xml文件里使用自定义属性的命名空间(搜索http://schemas.android.com/apk/res/xxxx来改)</echo> 
                <replaceregexp encoding="utf-8" flags="g" 
                    match="http://schemas.android.com/apk/res/xxxx" 
                    replace="http://schemas.android.com/apk/res/xxxx"> 
                    <fileset dir="${project.58Client}"> 
                        <include name="**/*.xml"/> 
                    </fileset> 
                </replaceregexp> 
                 
                <!-- 改java文件里的import xxxx.R的引用(搜索import xxxx.R来改,不要搜索import xxxx.R;来改,还有import xxxx.R.color等等)--> 
                <echo>改java文件里的import xxxx.R的引用(搜索import xxxx.R来改,不要搜索import xxxx.R;来改,还有import xxxx.R.color等等)</echo> 
                <replaceregexp encoding="utf-8" flags="g" 
                    match="import xxxx.R" 
                    replace="import xxxx.R"> 
                    <fileset dir="${project.58Client}"> 
                        <include name="**/*.java"/> 
                    </fileset> 
                </replaceregexp> 
                 
                <!-- 给在xxxx包下的java文件添加import xxxx.R;--> 
                <echo>给在xxxx包下的java文件添加import xxxx.R;</echo> 
                <replaceregexp file="${project.58Client}/src/xxxx/AppHttpApiV1.java" 
                    encoding="utf-8" 
                    match="package xxxx;" 
                    replace="package xxxx;import xxxx.R;" 
                    byline="true"/> 
           </sequential> 
        </macrodef> 
         
        <!-- 宏:打B厂商的包 --> 
        <macrodef name="bPack"> 
           <sequential> 
                <!-- 换图标 --> 
                <copyfile src="resource/b/icon.png" dest="${project.58Client}/res/drawable/icon.png" forceoverwrite="true"/> 
           </sequential> 
        </macrodef> 
    </project> 

在这个文件里,有几个要注意的地方:

  *. 在这个独立的文件里,一定不要忘了加<project>标签,这个是必需的

  *. 在使用ant替换命令replaceregexp时,在我们的查找范围里有很多要进行替换时,默认情况下,只会给我们替换其中的一部分,不会是我们想的那样,把所有查找到的都进行替换,解决办法是:加上属性flags="g",这个属性的意思就是把查找到的,都时行替换。

  *. 替换后的文件的编码,默认情况下,是与运行ant命令的系统有关,如果为windows系统,则为gbk编码,如果为linux系统,则为utf-8编码。所以如果你的代码的编码原来就是utf-8,如果还想在windows里运行ant命令,在替换的命令里要加上encoding="utf-8"

  2. 把宏写好后,就要把代码链接到原来的build.xml文件上,这个厂商的改动,是在代码从svn上下载下来后,就要执行的。

    *. 在build.xml文件里使用这些宏之前,要先引入这个文件:
Xml代码  收藏代码

    <!--引用特殊包的宏--> 
        <import file="special_company.xml" /> 

    *. 其次就根据当前的厂商,来选择执行不同的宏,这段代码是在svn标签后
Xml代码  收藏代码

    <!-- 打特殊包 --> 
            <switch value="${which_company}"> 
                <case value="a"> 
                    <echo message="a特殊渠道" /> 
                    <aPack /> 
                </case> 
                <case value="b"> 
                    <echo message="b特殊渠道" /> 
                    <bPack /> 
                </case> 
    </switch> 

    *. 最后就是在build.properties文件里进行选择
Xml代码  收藏代码

    #是哪个特殊厂商 a, b 
    which_company=a 

    *. 同时为把打好后的包,便于区分,我就把生成的文件夹的后面加上了which_company后缀。



其他的打包流程和以前的一样,没有变化。

猜你喜欢

转载自lxfgrace.iteye.com/blog/1632810
ANT