Android学习 - ant批量打包

来源:互联网 发布:阿里云ecs vpn 编辑:程序博客网 时间:2024/05/17 15:41

很多的应用中需要加上应用推广的统计,如果一个一个的去生成不同渠道包的应用,效率低不说,还有可能不小心弄错了分发渠道,使用ant可以批量生成应用。

一、添加渠道包信息

为了统计渠道信息,就不得不在程序的某个地方加入渠道的信息,然后针对不同的渠道打不同的包。一般可以在Manifest文件中加入渠道编号,而不直接写在代码中。这样做的好处是,可以针对不同渠道,自动化去修改Manifest文件中的渠道编号,然后自动为该渠道打包。

Manifest文件支持Meta Data标签,建议使用这种自定义标签。例如下面的文件片段。

<meta-data android:value="000000" android:name="CHANNEL"/>

二、渠道包读取

public static String getChanel(Context ctx) {String CHANNELID = "000000";try {ApplicationInfo ai = ctx.getPackageManager().getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);Object value = ai.metaData.get("");if (value != null) {CHANNELID = value.toString();}} catch (Exception e) {//}return CHANNELID;}

三、自动打包实现

这一篇主要做了创建android项目、update已存在项目、ant编译项目。

1、准备ant

ant 官网可下载

http://ant.apache.org/

ant 环境配置:

1)、解压ant的包到本地目录。

2)、在环境变量中设置ANT_HOME,值为你的安装目录。

3)、把ANT_HOME/bin加到你系统环境的path。

2、使用ant

1)、首先需要检查一下android-sdk的环境换量是否添加到了path中。这样可以在任意目录下执行android命令,不然则要切换到 android-sdk\tools目录下。

2)、使用android create创建项目

参数说明:

-k /--package 为命名空间(包名)-a /--name 工程名

-p /--path 项目 -t 为目标平台的版本编号

C:\Documents and Settings\Administrator>android create project -k com.android.Tank -a Tank -t 4  -p F:\tank

列出不同版本平台的对应id编号 android.bat list targets /androidlist

C:\Documents and Settings\Administrator>android.bat list targets

3)、android update更新现有项目

对已经存在的android工程,我们可以update下(修改平台的版本),这样会自动添加build.xml等ant的配置文件。

C:\Documents and Settings\Administrator>android update project --name Tank -t 11 -p F:\tank

4)、ant 参数介绍

* debug:带调试用签名的构建

* release:构建应用程序,生成的apk必须签名才可以发布

* install:安装调试构建的包到运行着的模拟器或者设备;

* reinstall

* uninstall

使用ant命令时可以进入到项目目录中,或者

ant debug Buildfile:E:\MyLiB\Android\AndroidAnt\MyBoardCastReciver\build.xml

简单介绍了使用ant命令打包android程序,实现批量打包需要的加一个类似于for循环的功能即可,在Ant的核心包里没有相关的For循环的Task,要下载相应的扩展包。可以使用开源的Ant-contrib包。下载地址:http://ant-contrib.sourceforge.net/。下载后的解压得到的jar文件放到ant的lib目录。

在build.xml中增加如下代码就可以实现批量打包:

<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">    <regexp pattern="android:value="(.*)" android:name="CHANNEL"" />    <substitution expression="android:value="${channel}" android:name="CHANNEL"" />    <fileset dir="" includes="AndroidManifest.xml" />    </replaceregexp>    <property name="out.release.file"             location="${out.absolute.dir}/${ant.project.name}_${channel}_${app_version}.apk" />    <antcall target="release" /></target>

taskdef:声明需要放到较前位置,因为if condition也会用到此声明。

build.properties:文件增加

market_channels=000000,012345app_version=1.2.1

market名称用逗号分隔,执行ant deploy即可。

0 0
原创粉丝点击