如有转载,请声明出处:http://blog.csdn.net/zhongkejingwang/article/details/37914219
为什么要写这篇博客,因为我被这个东西折磨了两天,网上说的好多都有问题,最坑爹的就是版本不同导致的错误。下面分享一下我总结出来的快捷的ant打包方式以及遇到的一些问题和解决方法(在windows环境下)。
ant打包有什么好处?
在eclipse中当我们的android项目需要打包出来的时候,往往是手动打包,如果有签名文件则需要输密码,选择输出目录等等操作,很麻烦。打包一个apk还好,当需要打包多个apk的时候,比如发布应用时需要打包各个平台的渠道包,几十上百个渠道号,一旦有改动或者版本升级时需要重新打包的时候,手动打包就不是很好的方式了。这时候可以用ant自动打包。ant打包出来的apk和我们手动打包出来的是一样的,它只不过是自动执行已经写好的打包命令而已。OK,下面讲一下如何使用ant进行打包,待会儿我会演示我遇到的打包失败的情况和解决方式。第一次写博客,有点啰嗦......
配置ANDROID_HOME环境变量
ant打包
问题1
D:\Program Files\Android\android-sdk\tools\ant\build.xml:397: The Android Ant-based build system requires Ant 1.8.0 or later. Current version is 1.7.1
问题2
[dx] java.nio.BufferOverflowException
[dx] at java.nio.Buffer.nextPutIndex(Buffer.java:501)
[dx] at java.nio.HeapByteBuffer.putShort(HeapByteBuffer.java:296)
[dx] at com.android.dex.Dex$Section.writeShort(Dex.java:818)
[dx] at com.android.dex.Dex$Section.writeTypeList(Dex.java:870)
[dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:437)
[dx] at com.android.dx.merge.DexMerger$3.write(DexMerger.java:423)
[dx] at com.android.dx.merge.DexMerger$IdMerger.mergeUnsorted(DexMerger.java:317)
[dx] at com.android.dx.merge.DexMerger.mergeTypeLists(DexMerger.java:423)
[dx] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:163)
[dx] at com.android.dx.merge.DexMerger.merge(DexMerger.java:187)
[dx] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
[dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
[dx] at com.android.dx.command.dexer.Main.run(Main.java:230)
[dx] at com.android.dx.command.dexer.Main.main(Main.java:199)
[dx] at com.android.dx.command.Main.main(Main.java:103)
加入混淆和签名
<?xml version="1.0" encoding="UTF-8"?> <project name="MainActivity" 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" /> <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" /> </project>
build.xml里面就这么短的代码,其实,核心部分就是最后的“<import file="${sdk.dir}/tools/ant/build.xml" />”我们执行的release就是在/tools/ant/build.xml中定义的,那我们自己的东西要写在哪里呢?看这两句“<property file="local.properties" />”和“<property file="ant.properties" />”,local.properties已经给我们生成了,ant.properties没有生成,如果你需要也可以新建一个,那么我们的配置就写在local.properties中。如果不知道怎么创建数字签名文件,我就再啰嗦一会儿,手动导出apk的时候提示选择一个keystore,这时候可以选择Create
new keystore,存放目录放在当前工程根目录下,填完后先导出一个apk,之后就可以看到工程下有个.keystore文件了。接下来我们就可以配置ant打包选项了。下面来看local.properties的内容:
#下面这句是自动生成的 sdk.dir=D:\\Program Files\\Android\\android-sdk #数字签名文件 key.store=jingchen.keystore #别名alias key.alias=jingchen #数字签名的密码 key.store.password=111111 #alias的密码 key.alias.password=111111 #这里设置混淆代码,在当前项目的proguard-project.txt中编写混淆规则 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
上面注释都写着。好了,到这里我们的ant带签名和代码混淆的自动打包搞定了!