很多的应用中需要加上应用推广的统计,如果一个一个的去生成不同渠道包的应用,效率低不说,还有可能不小心弄错了分发渠道,使用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,012345
app_version=1.2.1
market名称用逗号分隔,执行ant deploy即可。