首先声明,android开发小白一枚,一直保持成长的“猩猩”,ant自己也不是很懂,扒啦了网上很多资料才实现了android使用ant的批量打包工作(大神勿笑,我很羞涩,我很腼腆);言归正传:
1.准备工作。
ant的下载,配置(为实现自动批量打包,就要使用for循环,ant不支持for,就要引入ant-contrib-1.0b3.jar,让ant能使用foreach)
ant下载官网网址:http://ant.apache.org/bindownload.cgi
http://download.csdn.net/detail/qq_21945825/9514071
ant-contrib-1.03b.jar 下载网址:http://download.csdn.net/detail/qq_21945825/9514064
配置工作:
ant环境配置,将文件解压后(这是我的解压路径D:\ant\apache-ant-1.9.7-bin\apache-ant-1.9.7),在环境变量中新建:ANT_HOME 对应 解压文件路径,在Path中添加%ANT_HOME%\lib(就这么简单),在cmd中输入ant -version 显示ant版本号说明配置没问题。过程如下图:
到这里,你的ant已经能跑起来了(以下的操作会在cmd命令框中进行),将命令框转入项目根目录,输入android update project -n (项目名) -p ./
(注:这里如果报android不是内部活着外部命令,请注意查看android的环境配置是否正确百度android环境配置一大堆,这里不再说)
配置最后一步,将ant-contrib-1.03b.jar 拷贝到解压后的ant文件夹下的lib中,这里都是ant的jar包,到这里配置工作全部做完。
2、正式开始打包前准备工作
打开工程根目录文件,可以发现多了几个文件build.xml、local.properties、project.properties
一个一个解释:
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="LP" default="help">
<property file="local.properties" />
<property file="ant.properties" />
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<import file="custom_rules.xml" optional="true" />
<import file="${sdk.dir}/tools/ant/build.xml" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<target name="deploy">
<foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">
</foreach>
</target>
<target name="modify_manifest">
<replaceregexp flags="g" byline="false">
<!-- 匹配的内容是 android:value="*****" android:name="BILLING_CHANNEL" -->
<regexp pattern='android:value="(.*)" android:name="BILLING_CHANNEL"' />
<!-- 匹配之后将其替换为 android:value="渠道名" android:name="BILLING_CHANNEL" -->
<substitution expression='android:value="${channel}" android:name="BILLING_CHANNEL"' />
<!-- 正则表达式需要匹配的文件为AndroidManifest.xml -->
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp>
<property name="out.release.file" location="${out.absolute.dir}/${ant.project.name}_${channel}.apk" />
<!--包 -->
<antcall target="release" />
<!--输出渠道包到bin/out目录下 -->
<copy tofile="${out.absolute.dir}/out/${ant.project.name}v${version}-${channel}.apk" file="bin/${ant.project.name}-release.apk"/>
</target>
</project>
我也是ant小白,就是把自己理解的简单说一下:
1、project name 自己项目的名称,需要改;
2、下面这段代码就是引入jar包使ant支持for
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
3、实现循环、根据正则表达式去匹配
<foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">
</foreach>
4、最后输入。
其他文件编写:
build.xml文件是ant生成的,文件中引入了几个其他文件,ant.properties、local.properties、project.properties
local.properties文件中是我们sdk的信息,注意这里 不要写成单“\”了
自建文件ant.properties
我们整个打包的中的参数基本都在这个文件中
#keystore的路径,必须使用正斜杠
key.store=D:/lp.keystore
#keystore的密码
key.store.password=123456789
#alias名
key.alias=lp
#alias密码
key.alias.password=123456789
#渠道市场列表
market_channels=BILLING_CHANNEL,baidu
#版本号
#version=1.2.1
到这里,我们的整个工作基本已经做完了,然后还是在原来的cmd命令框中输入,ant deploy
注:这里并没有对作为引用libary的支持,可以到网上搜索,相信很容易实现,作为lib下的第三方jar是自动打包进apk的这个无需担心。
碰到的错误总结一下:
在这里先声明一下,刚进行业的小白,碰到的问题千奇百怪的,很多常识性的错误,在此仅纪念自己的蠢萌!
1、ant打包时报错null returned 1;
D:\Android\sdk\tools\ant\build.xml:698: null returned: 1
<property name="aapt.ignore.assets" value="!.svn:!.git:\x3Cdir\x3E_*:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~:crunch" />
2、if doesn’t support the “condition”attribute
两个解决办法:1、依次打开ant-contrib-1.03b.jar—> net/sf/antcontrib/antcontrib.properties,看到以下这一行:用#号注释掉if=net.sf.antcontrib.logic.IfTask这一行,这是因为ant本身自带的if会与android的if冲突,只用ant的foreach语句
2、比较简单,将build.xml中的<import file="${sdk.dir}/tools/ant/build.xml" />
放到下面,让最后执行这个操作就可以了
3、最后一个比较蠢:java.io.EOFException:这个错误真是折磨死我了,心疼自己是个小白,首先检查你keystore文件是否存在,配置中的信息和keystore是否一致即可。
4、出现编码格式错误,例如包清单文件编码格式UFT-8错误,首先确定编码格式和保存格式是否一致,还错就去掉清单文件中中文。
路漫漫其修远兮,修学。