文档章节

Android Ant 批量多渠道打包实例

Cundong
 Cundong
发布于 2014/10/17 16:11
字数 1332
阅读 4827
收藏 20

Android Ant 批量多渠道打包实例


关于批量打包,无需多言,这是每个国内Android开发者必须面对的一个问题。

下面,我就以开源项目「知乎小报」为例,详细说明如何使用ANT实现批量打渠道包。

1 Ant 安装

  • 下载ANT

请前往 http://ant.apache.org 下载。

  • 配置环境变量

设置环境变量后,在命令行下测试ant命令,如果出现以下内容,则说明配置成功:

cundongdeMacBook-Pro:~ cundong$ ant Buildfile: build.xml does not exist! Build failed

  • ant-contrib-1.0b3.jar下载

由于ant本身不支持迭代,因此我们需要用到一个第三方的库 ant-contrib来实现迭代功能。

下载ant-contrib,并将ant-contrib-1.0b3.jar文件拷贝至ANT安装目录。

下载地址:http://ant-contrib.sourceforge.net/

2 生成local.properties、build.xml文件

先介绍一下iZhihuPaper的工程依赖情况。

  • iZhihuPaper 依赖 actionbarpulltorefresh.extras.actionbarsherlock、Crouton、PhotoView

  • actionbarpulltorefresh.extras.actionbarsherlock 依赖 ActionBarPullToRefresh

  • ActionBarPullToRefresh 依赖 actionbarsherlock、SmoothProgressBar

  • Crouton、actionbarsherlock 依赖 SupportLib

  • PhotoView、SmoothProgressBar、SupportLib 无任何依赖

生成方式

我们需要为iZhihuPaper工程和他直接或者间接引用的所有工程(一共7个)都生成local.properties、build.xml文件。

命令格式:

android update project --target {target版本} --name {工程名字} --path {工程目录}

依次执行以下命令:

1.

android update project --target android-20 --name SupportLib --path /Users/cundong/Documents/github/SupportLib

2.

android update project --target android-20 --name PhotoView --path /Users/cundong/Documents/github/PhotoView

3.

android update project --target android-20 --name SmoothProgressBar --path /Users/cundong/Documents/github/SmoothProgressBar

4.

android update project --target android-20 --name Crouton --path /Users/cundong/Documents/github/Crouton

5.

android update project --target android-20 --name actionbarsherlock --path /Users/cundong/Documents/github/actionbarsherlock

6.

android update project --target android-20 --name ActionBarPullToRefresh --path /Users/cundong/Documents/github/ActionBarPullToRefresh

7.

android update project --target android-20 --name actionbarpulltorefresh.extras.actionbarsherlock --path /Users/cundong/Documents/github/actionbarpulltorefresh.extras.actionbarsherlock

8.

android update project --target android-20 --name iZhihuPaper --path /Users/cundong/Documents/github/iZhihuPaper

注意事项

  • BUILD SCUUCESS 如果执行命令后,出现如下所示:

cundongdeMacBook-Pro:~ cundong$ android update project --target android-20 --name SupportLib --path /Users/cundong/Documents/github/SupportLib Updated project.properties Updated project.properties Added file /Users/cundong/Documents/github/SupportLib/build.xml Updated file /Users/cundong/Documents/github/SupportLib/proguard-project.txt It seems that there are sub-projects. If you want to update them please use the --subprojects parameter.

则说明执行成功。

  • 常见BUILD FAILED问题

如果执行后,出现如下提示:

BUILD FAILED /Users/cundong/Documents/github/iZhihuPaper/build.xml:44: The following error occurred while executing this line: /Users/cundong/Documents/github/iZhihuPaper/build.xml:59: The following error occurred while executing this line: /Applications/adt-bundle-mac-x86_64/sdk/tools/ant/build.xml:470: Invalid file: /Users/cundong/Documents/github/SmoothProgressBar/build.xml

则说明它所依赖的工程缺少project.properties、project.properties文件,请先参照步骤1,为其依赖的工程生成project.properties、project.properties文件。

如果遇到以下问题:

BUILD FAILED /Applications/adt-bundle-mac-x86_64-20140624/sdk/tools/ant/build.xml:601: The following error occurred while executing this line: /Applications/adt-bundle-mac-x86_64-20140624/sdk/tools/ant/build.xml:653: The following error occurred while executing this line: /Applications/adt-bundle-mac-x86_64-20140624/sdk/tools/ant/build.xml:698: null returned: 1

则需要手动删除该工程的gen、bin目录。

配置 local.properties

配置local.properties文件,增加ant.dir、target.dir:

sdk.dir=/Applications/adt-bundle-mac-x86_64/sdk ant.dir=/Applications/apache-ant-1.9.4 target.dir=/Users/cundong/Documents/ZhihuPaperRelease

ant.dir为ant安装目录,target.dir为批量打包的apk存储目录。

详细例子可参考:ZhihuPaper/local.properties

3 添加 ant.properties文件

1.将签名文件(*.keystore)拷贝到工程的目录。

2.在根目录下新建ant.properties文件。

key.store=android.keystore key.alias=android key.store.password=Cundong123456!@# key.alias.password=Cundong123456!@# market_channels=Wandoujia,360 app_name=ZhihuPaper app_version=2.1

说明: key.store为签名文件; key.alias为签名文件别名; key.store.password、key.alias.password为密码; market_channels为我们需要生成的所有渠道列表,使用“,”分开;app_name为生成apk的文件名; app_version为生成apk的版本号;

详细例子可参考:ZhihuPaper/ant.properties

配置build.xml

为了实现批量打出多个渠道包,我们必须手动对刚刚生成的build.xml文件进行修改。

  • 引入ant.properties文件。

    <property file="ant.properties" />
  • 支持循环执行

    <!-- 支持循环执行 -->       
    <taskdef resource="net/sf/antcontrib/antcontrib.properties" >           
        <classpath>              
            <pathelement location="${ant.dir}/lib/ant-contrib-1.0b3.jar" />           
        </classpath>       
    </taskdef>       
    
    <echo>Run ant-contrib-1.0b3.jar ok</echo>

  • 配置循环打包代码

   
   <target name="deploy">   
        <foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">   
        </foreach>   
    </target>  
    
    <target name="edit_and_build">   
        <echo>Run '${channel}' apk</echo>  
        
		<replaceregexp
		    encoding="utf-8"
		    file="AndroidManifest.xml"
		    flags="s"
		    match='android:name="UMENG_CHANNEL".+android:value="([^"]+)"'
		    replace='android:name="UMENG_CHANNEL" android:value="${channel}"'/>
			
      	<property name="out.final.file"  location="${target.dir}/${app_version}/${app_name} V${app_version}(${channel}).apk" /> 
	    <antcall target="clean" />  
	    <antcall target="release" />  
    </target>

配置后,会读取ant.properties中market_channels中配置项,得到一个渠道号数组,对这个数据进行迭代,替换AndroidMainfext.xml文件中的android:name="UMENG_CHANNEL"。

每替换好一个,将输出到"out.final.file"。

${target.dir},即为local.properties文件中配置的target.dir=/Users/cundong/Documents/ZhihuPaperRelease ${app_name},即为ant.properties文件中配置的app_name=ZhihuPaper ${app_version},即为ant.properties文件中配置的app_version=2.1 ${channel},即为当前循环的渠道号

请务必保证${target.dir}/${app_version}目录真是存在并且有写权限。

当前例子中为:/Users/cundong/Documents/ZhihuPaperRelease/2.1,如果这么目录不存在,则会提示报错信息。

详细例子可参考:ZhihuPaper/build.xml

4 配置proguard-project.txt文件

proguard-project.txt,即混淆时的配置文件。

  • 引用的第三方jar包,不要混淆;

  • 自己写的控件,即需要配置在layout文件中的Widget,不要混淆;

  • Android的基础组件,不要混淆。

  • 需要在project.properties中配置:proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

详细例子可参考: ZhihuPaper/proguard-project.txt

5 打包

在iZhihuPaper中创建一个批处理文件,Mac为.sh文件,Window为.bat文件:

 cd /Users/cundong/Documents/github/iZhihuPaper ant deploy pause

调用这个批处理文件,即可进行批量打混淆后的渠道包。


© 著作权归作者所有

Cundong
粉丝 185
博文 28
码字总数 30973
作品 0
海淀
私信 提问
加载中

评论(7)

laojiadingxi
laojiadingxi
哦,不好意思,上面那个我的说法是错的,经过测试,不是由于eclipse打开AndroidManifest.xml引起的替换失败,而是,当AndroidManifest.xml文件中的友盟的这个标签,必须是这样的<meta-data android:name="UMENG_CHANNEL" android:value="baidu" />,而不是这样的<meta-data android:value="baidu" android:name="UMENG_CHANNEL" />。为了安全起见,命令行用ant打包的时候,最好把此AndroidManifest.xml关闭。不放心的话,可以用反编译工具,把自己生成的apk,反编译出AndroidManifest.xml来看看,是否真的替换了。
laojiadingxi
laojiadingxi
这里有个需要特别注意的问题,就是eclipse不能打开那个文件,也就是说,ant在打包的时候,要关闭eclipse,不然始终替换不了渠道号
laojiadingxi
laojiadingxi
不错13,解决了我的问题
perry_li
perry_li

引用来自“perry_li”的评论

请教下,为什么我运行的时候报错呢

D:\ljp_projects\workingspaces\AntTest\build.xml:65: The following error occurred while executing this line:
D:\ljp_projects\workingspaces\AntTest\build.xml:81: The following error occurred while executing this line:
D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:720: The following error occurred while executing this line:
D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:734: Class not found: javac1.8

在build.xml中
65 line
<foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">
81 line
<antcall target="release" />
求回复

引用来自“Cundong”的评论

Class not found: javac1.8
我更换了jdk,允许还是报错误 D:\ljp_projects\workingspaces\AntTest\build.xml:65: The following error occurred while executing this line: D:\ljp_projects\workingspaces\AntTest\build.xml:81: The following error occurred while executing this line: D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:1139: The following error occurred while executing this line: D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:1151: Signing key jrgc not found 不明白为什么那个循环有问题呢
Cundong
Cundong 博主

引用来自“perry_li”的评论

请教下,为什么我运行的时候报错呢

D:\ljp_projects\workingspaces\AntTest\build.xml:65: The following error occurred while executing this line:
D:\ljp_projects\workingspaces\AntTest\build.xml:81: The following error occurred while executing this line:
D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:720: The following error occurred while executing this line:
D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:734: Class not found: javac1.8

在build.xml中
65 line
<foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">
81 line
<antcall target="release" />
求回复
Class not found: javac1.8
perry_li
perry_li
请教下,为什么我运行的时候报错呢

D:\ljp_projects\workingspaces\AntTest\build.xml:65: The following error occurred while executing this line:
D:\ljp_projects\workingspaces\AntTest\build.xml:81: The following error occurred while executing this line:
D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:720: The following error occurred while executing this line:
D:\developing_enviroment\adt-bundle-windows-x86_64-20131030\sdk\tools\ant\build.xml:734: Class not found: javac1.8

在build.xml中
65 line
<foreach target="edit_and_build" list="${market_channels}" param="channel" delimiter=",">
81 line
<antcall target="release" />
求回复
perry_li
perry_li
学习
在Linux下的批量打包apk方法

在Android项目需要发布的时候,经常需要发布多个渠道,这写渠道信息一般写在minifest.xml文件当中,这样的话,每次发布一个渠道的时候,需要去更改minifest.xml文件,这样显然不是一个程序员...

蜗牛TT
2012/08/28
4.5K
4
使用Ant 实现批量打包Android应用

由于公司运维需要以及应用中需要加上应用推广的统计,往往要对应二三十个渠道,按照正常方法一个一个的去生成不同渠道包的应用,不仅浪费了时间,而且大大降低了效率. 上一篇讲到使用Ant进行...

Easince
2012/11/27
577
0
Android ANT多渠道打包

在没用AndroidStudio的Gradle构建项目之前,多渠道打包一般都是基于ANT构建,所以在此记录一下,以供查阅! 一、文件准备 1、首先要去官网下载ANT代码。 ANT官网下载地址 2、下载ANT循环打包...

军歌
2014/11/20
2K
3
基于Jenkins + Tomcat 的安卓客户端可持续化构建及发布下载(loltube.cn)

一. Jenkins 可持续化构建环境请参考 文章 http://my.oschina.net/long0419/blog/183299 二. 基于搭好可持续构建环境完成基础上 ,使用Ant 来编写安卓持续化构建环境 (未使用gradle 原理一样...

long0419
2015/04/02
257
0
Linux,maven,redis,android,java,yum,ant部署相关命令

(linux系统查看) getconf LONG_BIT 查看系统位数 (java环境变量) export JAVAHOME=/home/gcweb/usr/java/jdk1.7.045 export PATH=$JAVA_HOME/bin:$PATH 如果需要修改到系统变量中: cd ~ vi .......

shengguimin
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
43分钟前
14
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
8
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
21
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
76
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部