背景
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 安装成功。
打包还需要用到android命令,在android sdk目录 \sdk\tools 目录下,需要配置到环境变量中。 我用的是
如果之前没有配置过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文件,新手可能会漏掉。