Android使用ant实现自动化打包和多渠道打包

前言

eclipse在Android开发过程中使用起来还是比较方便的,但是在打包时的编译速度确实不敢恭维,那么自动化打包在这时就显得很重要了,这是一个解决程序员宝贵的双手的技术。

正文

一、在开始自动化打包之前我们先要配置好环境变量(包括jdk、Android sdk以及ant的环境变量)

  • 配置JDK
    1.右击“我的电脑”弹出菜单,点击“属性“》“高级“》“环境变量“,在“系统变量”下方点击“新建”,“变量名”输入"JAVA_HOME",“变量值”输入jdk的安装目录,点击“确认”;在“系统变量”选择变量为“Path”的选项,点击下方的“编辑”,在弹出框中修改“变量值”,在原有值的末尾输入“;%JAVA_HOME%\bin”,注意开头包含一个英文的分号。
    2.点击“开始”》“运行”,输入“cmd”,在弹出的命令窗口中输入“javac -version”然后回车,如果下方出现:javac version "1.6.0_45”,说明配置成功。

  • 配置Android SDK
    1.右击“我的电脑”弹出菜单,点击“属性“》“高级“》“环境变量“,在“系统变量”下方点击“新建”,“变量名”输入"ANDROID_HOME",“变量值”输入sdk的安装目录,点击“确认”;在“系统变量”选择变量为“Path”的选项,点击下方的“编辑”,在弹出框中修改“变量值”,在原有值的末尾输入“;%ANDROID_HOME%\platform-tools”,注意开头包含一个英文的分号。
    2.点击“开始”》“运行”,输入“cmd”,在弹出的命令窗口中输入:adb回车,如果下方出现:Android Debug Bridge version ...等多行文字,说明配置成功。

  • 配置Ant
    1.右击“我的电脑”弹出菜单,点击“属性“》“高级“》“环境变量“,在“系统变量”下方点击“新建”,“变量名”输入"ANT_HOME",“变量值”输入ant的安装目录,点击“确认”;在“系统变量”选择变量为“Path”的选项,点击下方的“编辑”,在弹出框中修改“变量值”,在原有值的末尾输入“;%ANT_HOME%\bin”,注意开头包含一个英文的分号。
    2.点击“开始”》“运行”,输入“cmd”,在弹出的命令窗口中输入“ant -version”然后回车,如果下方出现:Apache Ant(TM) version 1.9.3,说明配置成功。

二、当环境变量配置完成后,我们就可以开始准备开始实现自动化打包了

1.进入要打包的工程的项目目录。
2.输入命令" android update project --name MyProject -p ./ ",其中-name参数是指定项目名称;-p参数是要打包的地址(./ 表示当前目录)。
这时候我们可以看到在我们的项目根目录下多了build.xml,以及local.properties两个文件。

  • 其中local.properties写明了我们的android SDK的目录(其实是环境变量ANDROID_HOME的值,所以如果环境变量中没有这个的,请增加)。
  • build.xml则是ant构建的最重要脚本,打开一看,发现里面其实大部分都是写注释,有用的没几行,这是因为生成的这个build.xml引用了android SDK自带的构建脚本,具体目录是{sdk目录}/tools/ant/build.xml 。

到此,我们的项目就支持ant编译打包了

三、项目中引用了其他library项目时,我们还需要让其依赖的项目支持ant编译打包

  • 进入到library项目所在的目录,输入命令 android update lib-project -p ./ (注意是 lib-project);
  • 在被依赖的library项目也支持ant打包后,我们回到主项目的工程目录下,输入之前的命令,这里要注意的时在最后需要添加一句 --subprojects,命令如下:
    android update project --name MyProject -p ./ --subprojects

四、进行项目的编译打包。

  • ant debug : 生成一个测试版apk,默认使用 debug key 进行签名,生成的apk(your_project_name-debug.apk)在bin目录下。
  • ant release : 生成一个未签名和未aligned的apk包,生成的apk(your_project_name-release-unsigned.apk和your_project_name-release-unaligned.apk)在bin目录下

五、加入签名信息
在项目的根目录下建一个ant.properties文件,输入如下内容,其中keystore密码和alias密码可以不指定(防泄漏),那么在命令执行的过程中会要求你输入。

#keystore的路径,必须使用正斜杠  
key.store= "C:\Users\Administrator\Desktop\is\android" 
#keystore的密码  
#key.store.password=123456
#alias名  
key.alias=myAlias
#alias密码  
#key.alias.password=abcdef 

在项目根目录下运行 ant release 命令就会帮你生成一个经过签名和aligned的apk,生成的apk(your_project_name-release.apk)在bin目录下

六、自动打包渠道包
1、实现批量循环打包需要一个类似于for循环的功能,在Ant的核心包里没有相关的For循环的Task,即不支持for循环,但是ant支持第三方扩展包,以支持更多的其他功能。
  于是我们要下载相应的支持for循环的扩展包。可以使用开源的Ant-contrib包。下载地址:http://ant-contrib.sourceforge.net/ ,也可以自行百度搜索资源包 。
  下载后的解压得到的jar文件放到ant的lib目录。
接下来我们就可以打包渠道包了。

  1. 首先在ant.properties文件中增加属性 market_channels (渠道列表,以逗号分割),version(应用程序版本名)
#渠道市场列表  
market_channels=yingyongbao,360,wandoujia,baidu  
#版本号  
version=8.0  

3.在我们项目的build.xml中加入如下代码:

<!-- 渠道包打包脚本  ant deploy-->    
<taskdef resource="net/sf/antcontrib/antcontrib.properties">  
    <classpath>  
        <pathelement location="lib/ant-contrib-1.0b3.jar"/>  
    </classpath>  
</taskdef>  
<target name="deploy">  
   <foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">       
   </foreach>  
</target>
<target name="modify_manifest">  
    <replaceregexp flags="g" byline="false">  
        <!-- 匹配的内容是 android:value="*****" android:name="UMENG_CHANNEL" -->  
        <regexp pattern='android:value="(.*)" android:name="UMENG_CHANNEL"' />  
        <!-- 匹配之后将其替换为 android:value="渠道名" android:name="UMENG_CHANNEL" -->  
        <substitution expression='android:value="${channel}" android:name="UMENG_CHANNEL"' /> 
        <!-- 正则表达式需要匹配的文件为AndroidManifest.xml -->  
         <fileset dir="" includes="AndroidManifest.xml" />  
    </replaceregexp>  
    <property name="out.release.file" location="${out.absolute.dir}/${ant.project.name}_${channel}.apk" />  
     <!--包 -->  
     <antcall target="release" />  
     <!--输出渠道包到bin/out目录下 -->  
    <copy tofile="${out.absolute.dir}/out/${ant.project.name}v${version}-${channel}.apk" file="bin/${ant.project.name}-release.apk"/>  
</target>  

在项目根目录下运行 ant deploy 命令就会帮你各个渠道的签名包了(为了全程可以自动执行,ant.properties文件中的keystore的密码可以指定,这样在执行过程中就不需要手动输入密码了),在bin目录的out目录下。

问题

在执行打包时我遇到了一个ant\build.xml:698: null returned: 1的错误,查了一下发现这个问题许多人都遇到了,这里记录一下:

  • 这个值主要是打包过程中忽略 res assets目录下 匹配规则的文件 默认忽略 “!.svn:!.git:.:<dir>_:!CVS:!thumbs.db:!picasa.ini:!.scc:~” 这类文件
    如果直接设置成 crunch 对其他工程会有影响。
    那么可以在自己项目的根目录下build.xml文件中加入:
    <property name="aapt.ignore.assets" value="!.svn:!.git:\x3Cdir\x3E_:.:!CVS:!thumbs.db:!picasa.ini:!.scc:~:crunch" />

这样子就只对自己的项目生效!
为什么会有\x3Cdir\x3E这个东西,其实就是<dir>,不过ant build.xml中不允许使用'<'字符,所以要转义一下。

如果没有解决的话可以换成
<property name="aapt.ignore.assets" value="<dir>crunch:!.svn:!.git:.:<dir>_:!CVS:!thumbs.db:!picasa.ini:!.scc:~" />

二者的区别在于<dir>的写法不同

将上面的代码复制到项目目录下的build.xml中,保存,再次打包即可。

总结

自动化打包是一门非常节省程序员开发时间的技术,自此我们宝贵的双手就解放了。233333~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容