Android使用Ant进行apk多渠道打包

Android使用Ant进行apk多渠道打包

前言:

Ant 是什么?

详细介绍请看http://ant.apache.org/

总之一句话:Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。

准备工作:

android sdk中默认支持使用ant来执行编译动作。但是要想使用ant来进行编译,还需要ant的执行环境。

为了能顺利使用ant来编译,我们需要如下准备:

1,android sdk,最简单的是下载一个adt bundle即可;

2,ant包,下载链接:http://ant.apache.org/bindownload.cgi,将压缩包下载完解压到某个目录即可。

3,ant-contrib.jar,这个jar主要用来支持编译的批量操作,下载地址http://mirrors.ibiblio.org/maven2/ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3.jar,下完之后放到步骤2解压目录的lib目录。

参考:

关于android编译生成apk的流程,可以参照http://www.oschina.net/code/snippet_16_6782,

其实有个偷懒的方式,就是借用 android sdk的tools/ant/目录中build.xml文件内已定义好的动作,主要是用到”release”。

下面主要介绍一下基于已定义好的release,怎么修改实现自己的build.xml文件。

步骤:

首先介绍一下build.xml文件中变量的定义格式如下,后面会用到

1 <property name=”key_sample” value=”value_sample” />

1,对生成目录做必要的清除动作,起名为myClean,这里我删除了生成目录下的所有apk文件。

1     <target name="myClean">
2         <mkdir dir="${outputDir}"/>
3         <delete verbose="true">
4             <fileset dir="${outputDir}" includes="*.apk" />
5         </delete>
6     </target>

outputDir是我事先定义好的变量:

1 <property name=”outputDir” value=”../output”/>

2,加载渠道信息,并使用ant的 foreach功能实现批量打包;

1 <target name="myPackChannels">
2   <foreach target="myPackBuild" list="${build.channels}" param="build.channel" delimiter=",">
3   </foreach>
4 </target>

可以看到这里是从 ${build.channels} 中读取相关渠道信息,多渠道中间用,分隔;

build.channels=101,201,301

3,将当前的AndroidMenifest.xml复制到备份目录;

1 <target name="myBackupManifest">
2   <delete file="${build}/${manifest}" />
3   <copy file="${manifest}" tofile="${build}/${manifest}" overwrite="true"/>
4 </target>

4,修改当前的AndroidMenifest.xml里面的内容,比如channel值;

 1     <target name="myPrepareBuildinfo" depends="myLoadBuildInfo">
 2         <replaceregexp flags="g" byline="true" encoding="UTF-8">
 3             <regexp pattern='android:versionCode="(.*)"' />
 4             <substitution expression='android:versionCode="${buildVersionCode}"' />
 5             <fileset dir="" includes="${manifest}" />
 6         </replaceregexp>
 7         <replaceregexp flags="g" byline="true" encoding="UTF-8">
 8             <regexp pattern='android:versionName="(.*)"' />
 9             <substitution expression='android:versionName="${buildVersionName}"' />
10             <fileset dir="" includes="${manifest}" />
11         </replaceregexp>
12         <replaceregexp flags="g" byline="true" encoding="UTF-8">
13             <regexp pattern='android:value="@string/APP_CHANNEL"'/>
14             <substitution expression='android:value="${build.channel}"'/>
15             <fileset dir="" includes="${manifest}" />
16         </replaceregexp>
17     </target>

我这里执行了修改versionName,versionCode和APP_CHANNEL这三个值。

5,执行release动作;

6,针对4生成的unsigned apk 用自己的签名文件签名;

 1 <!-- 签名 -->
 2      <target name="mySign">
 3         <mkdir dir="${outputDir}"/>
 4         <java jar="${signjar}" fork="true" failonerror="true" maxmemory="128m">
 5              <arg value="-w"/>
 6              <arg value="${key_pem}"/>
 7              <arg value="${key_pk8}"/>
 8              <arg value="${binDir}/${build.name}-release-unsigned.apk"/>
 9              <arg value="${binDir}/${build.name}-release-signed.apk"/>
10          <classpath>
11            <pathelement location="${signjar}"/>
12          </classpath>
13         </java>
14         
15         <property name="outName" value="${outputDir}/${build.name}-${buildVersionName}-${buildVersionCode}-${build.channel}-${build.timestamp}-${buildNumber}"/>
16         
17         
18         <zipalign-helper in.package="${binDir}/${build.name}-release-unsigned.apk"
19                         out.package="${outName}.apk" />
20         <copy file="${mapping}" tofile="${outName}-mapping.txt"  overwrite="true"/>
21     </target>

7,repeat step3,4,5;(这就是动作2 foreach的执行)

8,恢复之前备份的AndroidMenifest.xml到当前目录;

1 <target name="myRestoreManifest">
2   <copy file="${build}/${manifest}" tofile="${manifest}" overwrite="true"/>
3   <delete file="${build}/${manifest}" />
4 </target>

最后,整理一下要执行的步骤:

1     <target name=".output" depends="myClean, myBackupManifest, myLoadBuildInfo, myPackChannels, myRestoreManifest,myUpdateBuilderNumber">
2     </target>

so,在你的build.xml所在的目录,执行ant .output 即可,大功告成!

原文发布于微信公众号 - Java学习网(javalearns)

原文发表时间:2015-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏何俊林

插件开发之360 DroidPlugin源码分析(一)初识

DroidPlugin的是什么? 一种新的插件机制,一种免安装的运行机制,是一个沙箱(就是对于使用者来说,并不知道他会把apk怎么样), 是模块化的...

23380
来自专栏非著名程序员

如何优化 Android Studio 启动、编译和运行速度?

?作为一名 Android 程序员,选择一个好的 IDE 工具可以使开发变得非常高效,很多程序员喜欢使用 Google 的 Android Studio来进行...

20460
来自专栏Debian社区

使用 tmate 分享你的终端会话

tmate 的意思是 teammates,它是 tmux 的一个分支,并且使用相同的配置信息(例如快捷键配置,配色方案等)。它是一个终端多路复用器,同时具有即时...

11530
来自专栏漏斗社区

工具| OpenVas基础安装及使用篇

OpenVAS是开放式漏洞评估系统,也称为一个包含着相关工具的网络扫描器。其核心部件是一个服务器,包括一套网络漏洞测试程序,可以检测远程系统和应用程序中的安全问...

44680
来自专栏JavaWeb

分布式事务处理

44460
来自专栏IMWeb前端团队

前端需要知道的 依赖注入(Dependency Injection, DI)

前端需要知道的 依赖注入(Dependency Injection, DI) 1. 前言 XX库实现了依赖注入,哇塞,好牛X呀~~~ 切,依赖注入的实现那么简单...

31050
来自专栏Java技术栈

这 30 个常用的 Maven 命令你必须熟悉!

maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下。

12120
来自专栏BestSDK

REST API 安全设计指南

REST API 安全设计指南。REST的全称是REpresentational State Transfer,它利用传统Web特点,提出提出一个既适于客户端应...

96680
来自专栏云计算教程系列

如何在CentOS 7上使用OTRS设置帮助台系统

OTRS是一个开源的票证请求系统。它为用户,客户,IT人员,IT服务和任何外部组织提供单点联系。该程序是用Perl编写的,支持各种数据库(MySQL,Postg...

1K40
来自专栏程序猿DD

Jenkins:配置信息变更历史

作者:sparkdev 出处:http://www.cnblogs.com/sparkdev/ 像 Jenkins 这样的系统,使用的过程就是配置文件变更的过程...

26850

扫码关注云+社区

领取腾讯云代金券