为什么要写这篇博客,因为我被这个东西折磨了两天,网上说的好多都有问题,最坑爹的就是版本不同导致的错误。下面分享一下我总结出来的快捷的ant打包方式以及遇到的一些问题和解决方法(在windows环境下)。
ant打包有什么好处?
在eclipse中当我们的android项目需要打包出来的时候,往往是手动打包,如果有签名文件则需要输密码,选择输出目录等等操作,很麻烦。打包一个apk还好,当需要打包多个apk的时候,比如发布应用时需要打包各个平台的渠道包,几十上百个渠道号,一旦有改动或者版本升级时需要重新打包的时候,手动打包就不是很好的方式了。这时候可以用ant自动打包。ant打包出来的apk和我们手动打包出来的是一样的,它只不过是自动执行已经写好的打包命令而已。OK,下面讲一下如何使用ant进行打包,待会儿我会演示我遇到的打包失败的情况和解决方式。第一次写博客,有点啰嗦......
配置ANDROID_HOME环境变量
很简单的ant打包我们只需要利用eclipse自带的ant插件即可实现,首先配置ANDROID_HOME,右键 计算机->属性->高级->环境变量,如下图,在“系统变量”下新建一个变量,变量名为ANDROID_HOME,变量值为android_sdk的存放目录 然后,在系统变量中的Path变量里最前面添加“%ANDROID_HOME%/tools;”;如下图(注意有个后面有个分号) 好了,确定配置完毕,这样完了之后我们就可以在cmd窗口中执行android命令了,如果显示android不是系统命令,那么检查自己在配置ANDROID_HOME过程中出了什么问题吧,其实咱们执行的android命令就是tools目录下的android.bat,所以才在Path中添加tools的路径。 ant打包
前面我们已经配置好ANDROID_HOME了,下面我们进入cmd,并进入需要ant打包的工程根目录,执行命令“android update project -p ./”,参数p表示路径,用./表示当前路径,执行结果如下图: 然后我们在eclipse中刷新项目,可以看到多了以下两个文件 building.xml和local.properties 我们先不要看里面是什么,现在我们已经可以使用ant进行打包了,在build.xml文件上右键->运行方式,由于是第一次执行ant构建,我们选择第二个“ant 构建”配置执行的选项target 这里我选的release,这些target都是sdk自带的ant写好的,在“xxx\android-sdk\tools\ant\build.xml”中有定义 执行顺序可以自己调整,“help”可以在目标中把勾去掉。点击运行,开始打包。如果最后打包成功了,恭喜你,你的软件版本没有问题,可以跳过下面的问题。我在使用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 这个很容易解决,下载ant1.8以上就可以了,遇到这个问题的小伙伴们可以提取码:66b4。我上传的ant压缩包。csdn资源上传审核真特么恶心,我只能放在360云盘了。 下完之后解压即可,这里我解压到E盘,"E:\Ant",然后在eclipse中配置ant目录,窗口->首选项->Ant,选择“运行时” 确定后再按照前面讲的执行“ant 构建”,如果成功打包,说明没有其他问题了。 问题2
[dx] UNEXPECTED TOP-LEVEL EXCEPTION: [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) 这个问题是由于sdk的build-tools版本导致的,我在19.x版本上都遇到这个问题,更新到20或者删掉19改用18问题解决。如果sdk Manager更新不了可以到网上直接下载最新的sdt把build-tools目录拷贝到当前sdk的build-tools中即可,如果安装了低版本的可以直接把19版本删掉。
如果打包成功,刷新bin目录会发现有未签名的apk:“xxx-release-unsigned.apk”,下面我们要为ant配置签名文件和混淆文件。 加入混淆和签名
数字签名大家都知道怎么一回事儿了,混淆代码就是将编译好的.class中的类名映射成一些看不出确切意义的字母,防止被反编译。我们在ant的配置文件中添加参数名和参数值。那我们就要看自动生成的build.xml里写的是什么东西了。 - <?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带签名和代码混淆的自动打包搞定了!
注意:ant 构建前先clean一下!这个也可以写到配置文件里,下一篇文章会讲到。在下一篇文章中,我将会讲到如何批量多渠道打包!