背景


Android在生成APK的时候需要根据不同是市场打不同的渠道包,如果人肉用eclipse打包的话,效率极低,而且容易出错。


环境准备


使用ant打包需要下载ant,ant的安装比较简单,下载ant压缩包  http://ant.apache.org  (最新的为1.9.4版本),下载之后将其解压到某个目录(本人解压到E:\apache-ant-1.9.4) ,然后配置环境变量(新建ANT_HOME环境变量,值为ant所在的目录,然后将ANT_HOME/bin添加到path中)。打开命令行工具,输入 ant  -version ,如果出现如下结果,说明ant 安装成功。


bat android_ant


打包还需要用到android命令,在android sdk目录 \sdk\tools 目录下,需要配置到环境变量中。 我用的是



bat android_xml_02

  


bat android_bat android_03


如果之前没有配置过android 命令环境 添加环境变量后可以 重启一下电脑


生成build文件


打开命令行工具,切换路径到项目所在的目录;输入命令
  android update project --name <project_name> --target <target_ID>--path <path_to_your_project>
  项目根目录下多了build.xml,以及local.properties两个文件。


如果需要打签名包 还要新建一个ant.properties文件


key.store=
key.alias=
key.store.password=
key.alias.password=


在 <!-- version-tag: 1 --> 下面加上


<import file="${sdk.dir}/tools/ant/build.xml" />
		<property name="proguard-home" value="${sdk.dir}/tools/proguard/lib" />
		
		<target name="-config">
		<!-- Copy the configuration file, replacing tokens in the file. -->
		<filterset id="build-tokens">
			<filter token="project.version.name" value="${project.version.name}" />
			<filter token="project.version.code" value="${project.version.code}" />
			<filter token="version.market.um" value="${version.market.um}" />
		</filterset>
		
		<copy file="./config/AndroidManifest.xml" todir="." overwrite="true" encoding="utf-8">
			<filterset>
				<filterset refid="build-tokens" />
			</filterset>
		</copy>
		
		<property name="out.final.file" location="./release/${ant.project.name}-${version.market.um}}.apk" />


		<echo level="info">${out.final.dir} ××××××××××××××××××××××××</echo>
		<echo level="info">${out.final.file} ×××××××××××××××××××××</echo>
	</target>
	
	<target name="config-google" depends="clean"
		<property name="version.market.um" value="GooglePlay" />
	</target>
<span >	</span><target name="release_mine" depends="-config, -set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build" description="Builds the application in release mode.">
	</target>

这里有一个去备份清单文件的操作


<span >	</span><copy file="./config/AndroidManifest.xml" todir="." overwrite="true" encoding="utf-8">
			<filterset>
				<filterset refid="build-tokens" />
			</filterset>
	</copy>

是由于每次都要该渠道内容 会导致AndroidManifest.xml变量version.market.um找不到


AndroidManifest.xml里面的变量写法


<span >	</span><meta-data
            android:name="UMENG_CHANNEL"
            android:value="@version.market.um@" />

这里 批量打包的第一步就完成了cmd到项目跟目录执行命令


ant config-google release_mine


就可以打包了。


批量打包


我这我用批处理完成的操作


添加一个文件build.bat 


if not exist release md release

start /wait /MIN cmd.exe /c "ant config-google release_mine"
start /wait /MIN cmd.exe /c "ant config-360 release_mine"
start /wait /MIN cmd.exe /c "ant config-baidu release_mine"
start /wait /MIN cmd.exe /c "ant config-hiapk release_mine"
start /wait /MIN cmd.exe /c "ant config-tencent release_mine"
start /wait /MIN cmd.exe /c "ant config-wandou release_mine"
...


如果有依赖工程的话 需要添加编译lib的命令


例如:lib工程位于项目工程根目录下 为一个名为lib/lazylist的lib 最后在cd回项目根目录


REM cd ../lib
REM cd LazyList 
REM android update lib-project -p .
start /wait /MIN cmd.exe /c "android update project -p ../lib "
REM cd ..




如360,这个里面可以很灵活的改变内容


<target name="config-360" depends="clean">
		<property name="version.market.um" value="360BOX" />
		<property name="version.market.id" value="2943" />
	</target>

总结

优点:


ant+bat批量打包可以节省很多时间,而且比网上的ant批量循环打包要灵活,



缺点:


每次添加一个渠道都要写对应的config文件,新手可能会漏掉。