由于项目中需要根据不同的渠道来进行打包,通过Eclipse打包过程非常繁琐,并且因为Eclipse打包对内存要求比较高,经常会出现打包过程中Eclipse内存溢出的问题。后面了解到Ant是一个非常不错的工具,于是翻阅了很多文章来进行了解。不断尝试下终于打包成功。
环境:Eclipse
apache-ant-1.9.4-bin 需要将/bin目录添加到path中
ant-contrib-1.0b3-bin 多渠道循环打包时需要,下载后解压,将ant-contrib-1.0b3.jar复制到/ant/lib下
1.对于没有引用第三方库的项目
首先,在项目的根目录下,使用命令行键入命令:android update project --name your_project_name -p ./,项目的根目录下会多出build.xml和local.properties两个文件。
build.xml是ant打包的重要文件,打开后可以发现,大部分语句都有注释,还是比较容易懂的。
local.properties 文件中只有一句话:sdk.dir=E:\\adt-bundle-windows-x86_64-20140624\\sdk
接下来就可以利用命令来生成apk了。
ant debug : 生成一个测试版apk,默认使用 debug key 进行签名,在bin目录下会生成your_project_name-debug.apk
ant release : 生成一个未签名和未aligned的apk包,在bin目录下生成your_project_name-release-unsigned.apk和 your_project_name-release-unaligned.apk
如果自己有签名文件(keystore文件),需要打包生成一个签名的apk,需要在项目的根目录下面新建一个ant.properties文件,然后添加内容:key.alias=*****
key.alias.password=*****
key.store=*****
key.store.password=*****
然后在执行ant release命令,就可以生成对应签名的release包了
对于多渠道的打包:
由于对ant语法不是很熟,直接贴文件吧。主要就是local.properties和custom_rules.xml的修改
local.properties:
sdk.dir=E:\\adt-bundle-windows-x86_64-20140624\\sdk
market_channels=Gfan,AnZhi,MuMayi,360,baidu
version=1.2.1
custom_rules.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules" >
<taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<!-- ${market_channels} 要在local.properties里声明,并用,来分隔你要打包的channel名 -->
<!-- 比如local.properties里可以这样写 market_channels=Google,Gfan,AnZhi,MuMayi -->
<target name="deploy" >
<foreach
delimiter=","
list="${market_channels}"
param="channel"
target="modify_manifest" >
</foreach>
</target>
<!-- 修改manifest.xml里的渠道名-->
<!-- regexp pattern是正则匹配,"代表双引号>
<!-- substitution expression 是你要替换的的channel名-->
<target name="modify_manifest" >
<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"
location="${out.absolute.dir}/${ant.project.name}_${channel}.apk" />
<!--
<antcall target="clean" />
-->
<antcall target="release" />
<!--输出渠道包到bin/out目录下 -->
<copy tofile="${out.absolute.dir}/out/${ant.project.name}-${channel}-v${version}.apk" file="bin/${ant.project.name}-release.apk"/>
</target>
</project>
2.对于引用了第三方库的项目
被引用的项目中也需要添加build.xml,用命令 android update lib-project -p ./或者直接拷贝一个自动生成的都可以。然后在主项目中,利用 android update project --name MenudrawSample -p ./ --subprojects 来更新或者生成build.xml和local.properties。然后就可以执行ant release或者ant deploy来进行打包了。
打包过程中可能会出现 \sdk\ant\build.xml 698 :null returned 1 的错误,只需要在主项目以及引用的库项目的build.xml中添加一行:
<property name="aapt.ignore.assets" value="!.svn:!.git:\x3Cdir\x3E_*:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~:crunch" />。
3.对于第三方库项目中还有.so的情况
暂时还没有涉及到,稍后补充。