您的位置:首页 > 其它

史上最全:ant多渠道打包安卓工程(一)

2016-02-17 22:16 309 查看

初识ant

网上看到一些说ant构建已经不太现实的言论,想想也是,google的android studio广受欢迎,它推崇的gradle使用起来方便快捷,似乎已成主流,笔者确有体会。

回头整理工程,心血来潮,想试试ant,竟然整理了半天没弄出来,哎,真个是饭可一日不食,学不可一日而止呃。

ant是Apache基金会提供的一个打包工具,可以很方便地将软件编译、测试、部署等步骤联系在一起,自动化有序进行,也就是常说的一键打包,用起来简单省心。ant作为一个构建工具来讲,它底层依赖于Java语言,具有较好的跨平台性,所以大多数基于Java语言的工程,多选择它来实现编译部署,比如Web工程、安卓应用等。

当然,这里不得不承认,随着CoC越来越被推崇,大多数人也越喜欢使用maven来管理自己的项目。至于安卓开发,在google声明放弃了对eclipse继续提供支持之后,大多数开发者的中心也都随之迁移到google自己推出的IDE-AndroidStudio上了,老实说,google提供gradle使用起来确实很方便,而且网上的资料也远比ant要多,千好万好,有一点不得不吐槽,gradle脚本实在太恶心,像是一堆结构体,乱糟糟的,不太优雅。

无论maven也好,gradle也好,存在的即是合理的,ant也必有它存在的意义,也不是随随便便就会被完全淘汰的。退一步来讲,maven与ant并不是水火不容,它俩的比较这里给出个链接,有心的童鞋可继续探讨/article/3618018.html;而安卓开发来讲,大多数早期的安卓工程依然需要ant来完成这最后一步的签名打包,我知道的百度地图就是ant来实现的。

废话不多言,下面步入正题。

初识构建

安卓开发,发布之前,我们都知道要对生成的apk进行签名,以防被人冒充顶替。使用ADT开发,默认使用的就是用ant来实现构建,不信的话你可以打开自己的sdk路径,肯定会在tools文件夹下发现ant子文件夹,它里面会有一个build.xml文件,这个文件的重要性不言而喻,一般的,我们的应用就是在它的指挥下,一步步编译、混淆、签名,渠道发布,最终走向用户。而且这个文件极其规整,完全可用作学习ant的范本教材,绝对比你在网上查到的任何ant脚本都要简明、清晰。

不过,我们这里只是使用build.xml这个文件,并不使用ADT内部集成的ant,所以还得去ant的官网上下载安装一下,步骤跟jdk差不多,具体可参考:

/article/5095371.html

正式使用ant之前还有一点需要了解,ADT为每一个用户都提供了一个默认的密钥库,打开你的C盘,顺着这个路径找下去,正常在C:\Users\“yonghuming”.android这个文件下,会有一个debug.keystore,我们在开发的过程中,点击run时,默认的就是使用这个库里面的密钥来签名的,所以你会发现,同一个应用,如果由两台电脑生成两个apk,要安装到同一个手机上的话,必须卸载前一个(而不是覆盖)才可以。

如果我们要使用默认的debug.keystore来生成一个debug版本的apk的话,ant实现起来还是比较简单的,一般可两步走:

生成build.xml和local.properties文件。

cmd切换到工程的根目录下(快捷方法:打开工程根目录,空白处按住shift+鼠标右键,选择在此处打开命令窗口);

运行命令 android update program –name XXX – target android-19 –path “d:xx\xx\xx” ,其中第一个参数XXX 和第三个参数”d:xx\xx\xx”是必须的,分别表示你个工程名和工程路径,第二个参数显然是你的目标api。

正常情况下,根目录下会自动多出两个文件。

注意:此时可能会遇到诸如“android不是内部命令”等错误,不要着急,这是你配置环境变量path时,没有将sdk的tools加进去(通常只是配置了platform-tools目录,主要用来运行adb命令),导致人家不知道你这命令是干啥的。要解决也很简单,只须依葫芦画瓢,将tools路径粘贴到path的开头或者结尾即可,然后关闭命令行窗口,再运行,嘿,是不是完美了。

这里附上一般的build.xml内容,略加注释,供大家参考。

<?xml version="1.0" encoding="UTF-8"?>
<project
name="此处应修改成你的工程名"
default="help" >
<!-- 导入local.properties中定义的属性  -->
<property file="local.properties" />
<!-- 导入ant.properties中定义的属性    -->
<property file="ant.properties" />
<!--  ant的运行环境    -->
<property environment="env" />
<condition
property="sdk.dir"
value="${env.ANDROID_HOME}" >
<isset property="env.ANDROID_HOME" />
</condition>
<!-- 导入project.properties中定义的属性    -->
<loadproperties srcFile="project.properties" />
<!-- update失败的信息提示    -->
<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" />
<!-- 导入自定义的ant规则,此处在后文中用重要作用 -->
<import
file="custom_rules.xml"
optional="true" />
<!-- 导入adt自带的build.xml,里面大多数编译打包规则早就定好了,完全不用你在那里胡编乱造。可惜的是,网上大多数文章都重新来写这个build.xml,我觉得完全就是没弄明白人家的意图,东抄西凑,混乱不堪不说,而且坑了好多人跟着走弯路,实在可恶可恶 -->
<import file="${sdk.dir}/tools/ant/build.xml" />

</project>


仍然是在工程根目录下,命令行执行ant debug命令,不出意外即可生成一个采用adt默认签名生成的debug版本的apk,保存在bin目录下。

大多数时候,我们不可能采用默认的debug.key来签名,而是会采用自己的私钥更可靠一点,那怎么办呢?

也不难,首先要有一个自己的私钥库。私钥库的创建如果你还不明白的话,那就…百度一下吧。

假设现在你已经有了一个属于自己的私钥库,而且放在了e盘的key文件夹下。

然后,你要用这个私钥来完成签名,除了使用adt的右键导出,“工程->右键->Android Tools->Export Signed Application Package…”之外,完全可以借助ant来实现:

key.store= E:/xx/xx.key
key.store.password=*****(你的store.password,创建时输入的)
key.alias=******
key.alias.password=****** (你的alias.password,创建时输入的,注意alias与alias.password不要一样,否则会有你后悔的时候...)


然后就可以在cmd下执行ant release,刷新之后,正常情况下在bin目录下会生成一个经过签名和aligned的apk,名字类似(your_project_name-release.apk)。

release过程说着容易,实现起来可谓困难重重,脚本语言总会给你报出许多你想象不到的麻烦,这里举出几个,可供参考,更多的常见错误请参考下一篇文章 《ant多渠道打包安卓工程(二)》

执行ant release之前,你的目录结构应该是这样的,如果不是请参照更改。



key.store= E:/xx/xx.key。key.store文件可以放在任意目录下,但路径一定要注意,一定是linux的习惯,使用/,而不是\,否则会报“value for ‘key.store’is not valid,please use a single path.”此外路径千万不能加引号,我在这困了半天,google了无数方法,甚至听从了一个歪果仁的建议,将key.store放在了工程的根目录下来实现所谓的“single path”,然并卵。最后才发现写成了这样key.store= “E:/xx/xx.key”,简直是噩梦,歪果仁也不靠谱呃。所以这里很负责人色说一下,如果出现了“value for ‘key.store’is not valid,please use a single path.”这个错误,你就认认真真地检查一下你的ant.properties中key.store路径,绝对是这里的问题。

至于多渠道,我们留在下一篇讲,《史上最全:ant多渠道打包安卓工程(二)》

欢迎留言拍砖,转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: