抽空学习了下ant打包

参考文章:http://blog.sina.com.cn/s/blog_74c22b21010173f8.html


一,基本步骤

1, 下载ant

地址:http://ant.apache.org/



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出错

2ailed tocreate task or type antlib

ant-contrib-1.0b3.jar包并未在ant包中,需要下载后放在对应的路径


3, Keystore was tampered with, or passwordwas incorrect: Password verification failed

执行


4ant cannot recoverkey

请检查ant.propertieskey.alias.password的值后面是否有多余的空格!有的话请把空格删除掉!

二,ant 代码基本语法

根据打包的需求,其实只需要两句代码:

1,固定值替换manifest中的某一个metadata,比如替换UMENG_SUB_CHANNEL

代码如下:

<replaceregexp flags="g" byline="false">  <regexp pattern="android:name=&quot;UMENG_SUB_CHANNEL&quot; android:value=&quot;(.*)&quot;" />  <substitution expression="android:name=&quot;UMENG_SUB_CHANNEL&quot; android:value=&quot;${sub_channel}&quot;" />  <fileset dir="" includes="AndroidManifest.xml" />  </replaceregexp>


2list循环替换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=&quot;(.*)&quot;" replace=""/>-->   <replaceregexp flags="g" byline="false">   <regexp pattern="android:name=&quot;UMENG_CHANNEL&quot; android:value=&quot;(.*)&quot;" />   <substitution expression="android:name=&quot;UMENG_CHANNEL&quot; android:value=&quot;${channel}&quot;" />   <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,每一个包,有对应的channel1,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"/>


更多相关文章

  1. Android(安卓)Java中调用js代码,js中调用Java代码
  2. Android中两种设置全屏的方法!!!
  3. 2012Android开发热门资料(110个)
  4. android 中bitmap与String(base64) byte[]、和drawable的互相转换
  5. android 两种全屏
  6. 在intellij idea 中进行android 单元测试
  7. 分享:android图片浏览器—类微信朋友圈相片浏览【android代码下载
  8. Android(安卓)Studio 快捷方式
  9. TabActivity底部菜单栏

随机推荐

  1. pycharm最新激活方法亲测有效可用!!!
  2. Windows系统中python的保姆级安装教程
  3. 12、华为 华三中小型企业网络架构搭建 【
  4. 一份优秀的数据分析报告该具备什么条件?
  5. php学习笔记(类的别名引入与命名冲突的解
  6. Scrapy有什么功能?架构有哪些?
  7. 给一些不懂又装逼的一些人的建议
  8. 51CTO博客意见反馈处【2021版】
  9. Oracle OCP 19c 认证1Z0-083考试题库(第8
  10. 入域时候提示无法加载指定的脱机注册表配