由于公司内置的需要,我们的程序要针对不同的厂商打不同的apk,而且不同厂商之间还有一些差别,所以我在原来打包的基础上进行了扩展,支持不同厂商。
为了便于扩展和维护,我把特殊厂商的代码与原来正常打包的代码进行分离,同时让打包者可以自动选择当前要打包的厂商。
改动的几个地方:
1. 把不同厂商要改动的地方写在宏(就相当于java里的方法)里面,而这些所有的宏,都放在一个当独的special_company.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="(.*?)""
replace=" package="xxxx" "
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文件里使用这些宏之前,要先引入这个文件:
<!--引用特殊包的宏-->
<import file="special_company.xml" />
*. 其次就根据当前的厂商,来选择执行不同的宏,这段代码是在svn标签后
<!-- 打特殊包 -->
<switch value="${which_company}">
<case value="a">
<echo message="a特殊渠道" />
<aPack />
</case>
<case value="b">
<echo message="b特殊渠道" />
<bPack />
</case>
</switch>
*. 最后就是在build.properties文件里进行选择
#是哪个特殊厂商 a, b
which_company=a
*. 同时为把打好后的包,便于区分,我就把生成的文件夹的后面加上了which_company后缀。
其他的打包流程和以前的一样,没有变化。
分享到:
相关推荐
Ant自动打包用的.
ant自动打包流程: 1.生成keystore, 签名时要用到. 可参考http://www.cnblogs.com/feisky/archive/2010/01/17/1650076.html 2.更改localproperties中的sdk.dir, 为你机器上环境的安装路径 3.更改ant下的路径, 可参考...
Ant自动打包,支持打包多个工程,合并xml,适合SDK开发者,一键出包,大家可根据自身项目需要做必要改动。
ant打包rcp必备环境 eclipse-3.8.2-delta-pack eclipse-SDK-3.8.2-win32 org.eclipse.rcp-3.8.2
使用Ant编译打包
ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三...
mac下是用ant对android App的多渠道打包工具。
ant 多渠道自动打包 ,出现appt 没找到 ,去sdk里拷贝到指定目录
安卓自动打包ant
ant 打包
java项目ant打包脚本,包括环境变量设置,打包脚本等信息,共有三个文件 ant.bat、build.xml、setEnv.cmd
使用ant打包android,使用ant打包android
一个普通java程序用ant打包的列子,完整的,里面采用的是eclipse自带的编译插件进行的打包,需要结合eclipse中的插件一起使用
Ant批量打包Android 应用教程地址http://blog.csdn.net/zhaokaiqiang1992/article/details/38086747
build是在build_with_bat的基础上实现的,主要是在compile和dex部分增加了第三jar的打包。 build_mulity_channel是多渠道打包脚本。该脚本需要ant-contrib-1.0b3.jar的支持。包中已包含,需要将其放到ant的lib...
使用Ant技术对java项目进行打包,打成war包用来部署到web服务器
ant打包详细教程
Ant打包和Hibernate文件生成实例,Ant打包和Hibernate文件生成实例
SSH2集成+ant打包,一个让人一目了然的实例!
ant for java 打包工具详细介绍