抽空学习了下ant打包
参考文章:http://blog.sina.com.cn/s/blog_74c22b21010173f8.html
一,基本步骤
1, 下载ant
2,运行ant,验证部署成功
3,环境变量
增加ANT_HOME
增加PATH中的某项
4,生成签名
http://www.cppblog.com/fwxjj/archive/2010/05/24/116208.html
此步骤生成的keystore,总会报错,错误如下:
Keystore was tampered with, or password wasincorrect: Password verification failed
最终通过eclipse生成的签名没有问题。
5,建立build.xml
6,配置local.properties
7. 配置ant.properties
8,修改AndroidManifest.xml文件:
到达项目路径,执行:ant deploy
批量打包中常用的两个场景(参看后面的代码):
1,只改变manifest中的某个值
2,只改变manifest中的某个值
以下是调试过程中遇到的一些错误:
1,元素类型"regexp" 必须后跟属性规范 ">" 或 "/
拷贝build文件时,xml出错
2,ailed tocreate task or type antlib
ant-contrib-1.0b3.jar包并未在ant包中,需要下载后放在对应的路径
3, Keystore was tampered with, or passwordwas incorrect: Password verification failed
执行
4,ant cannot recoverkey
请检查ant.properties中key.alias.password的值后面是否有多余的空格!有的话请把空格删除掉!
二,ant 代码基本语法
根据打包的需求,其实只需要两句代码:
1,固定值替换manifest中的某一个metadata,比如替换UMENG_SUB_CHANNEL
代码如下:
<replaceregexp flags="g" byline="false"> <regexp pattern="android:name="UMENG_SUB_CHANNEL" android:value="(.*)"" /> <substitution expression="android:name="UMENG_SUB_CHANNEL" android:value="${sub_channel}"" /> <fileset dir="" includes="AndroidManifest.xml" /> </replaceregexp>
2,list循环替换manifest中的某一个metadata,比如替换UMENG_CHANNEL
代码如下:
<foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=","> </foreach>
<target name="modify_manifest"> <!-- for channel --> <!--<replaceregexp file="AndroidManifest.xml" encoding="utf-8" match="android:value="(.*)"" replace=""/>--> <replaceregexp flags="g" byline="false"> <regexp pattern="android:name="UMENG_CHANNEL" android:value="(.*)"" /> <substitution expression="android:name="UMENG_CHANNEL" android:value="${channel}"" /> <fileset dir="" includes="AndroidManifest.xml" /> </replaceregexp> <!--<property name="out.release.file" value="${out.absolute.dir}/${channel}.apk"/>--> <antcall target="release"/> <copy tofile="${gos.path}/AntDemo_${channel}_${sub_channel}.apk"> <fileset dir="${out.absolute.dir}/" includes="AntDemo-release.apk" /> </copy> <delete includeEmptyDirs="true"> <fileset dir="${out.absolute.dir}" includes="**/*"/> </delete> <echo message="==========================="/> </target>
三,特殊需求(思路的转变)
case,每一个包,有对应的channel(1,2...),ch("1111aa","2222bb"...),subch("ee","uu"...)并且这几个参数都会影响客户端向服务端请求的url。
之前的思路是在ant.perperties中,准备三组list,在manifest中准备三个metadata,然后通过ant代码循环,但是似乎很难实现,要对应平行的输入三组list,且同时更改。
更改了思路,因为channel--ch---subch是一一对应的。所以只需要更改channel的值就可以了。然后根据channel的值,在客户端中保持的ch list的常量和subch list的常量中获取即可。
相应的原来的代码需要微调。
四,续
三中说明的是通过外部的manifest文件中的channel值,程序内部维护几个数组。通过channel值拿到对应数组的值。
现在客户的需求变为,打包名也需要包含ch_subch,从代码上似乎无法做到同时循环两组数组,且让其保持平行对应关系。另外一个思路产生。因为是一一对应关系,是否可以通过正则表达式将channel_ch_subch拆解出来。
既然这三个参数可以拆解出来,那么在程序内部就没必要维护几个数组。直接通过拆解的参数更改manifest即可。
下面的代码可以参考:
<propertyregex property="channel_num" input="${channel}" regexp="(.*):" select="\1"/> <propertyregex property="channel_strs" input="${channel}" regexp=":(.*)" select="\1"/>