在上一篇文章《Eclipse下Ant自动打包,混淆和签名》中我们可以通过ant 进行打包了。。但是实际中。有的时候有业务需求。需要统计各个渠道的app下载量和使用情况。很多人会说。Android各大平台都有自己的统计量。通过下载链接那里就有。通过开发者平台后台可以看到。。我的回答是:扯淡。 举个例子:安卓app分发平台这么多。。他们统计的规则相同吗。你能确定吗。某个ip或者某个用户下载多次app.平台是否去重处理?他们给你看到的数据是一定是真实的吗?公司想看看我的用户在哪个平台使用量占比。。如何区分?多渠道打包应运而生。。当然你如果选择传统方法。。一个个打。。需要100个包我打100次。。没人拦着你。本文是一次性打出多个包。下面进入正题。本文多渠道打包使用的是友盟统计第三方。
遵照的链接是: http://blog.csdn.net/shanghaibao123/article/details/45598619 有兴趣的同学可以看一下。我们这里在此基础上做了完善。
我们在配置文件中写好需要用到的渠道名和渠道号,用ant构建时将会读取我们写好的渠道,动态替换AndroidManifest.xml中的meta节点的name和value,每替换完一个就打出一个apk包,用一个for循环不断地重复打包直到导出所有的渠道包为止。为了方便替换,在AndroidManifest.xml中</application>下添加一个meta节点如下:
<meta-data android:value="5853f5c34544cb51fd001de5" android:name="UMENG_APPKEY"/>
<meta-data
android:name="channelname" android:value="channelkey" >
</meta-data>
记住这里的 <meta-data android:name="channelname" android:value="channelkey"> 格式固定,必须要求android:name和android:value间必须有且只有一个空格符。
待会儿我们在打包的时候就会把channelname替换成渠道名,把channelkey替换成渠道号。上一篇文章讲到local.properties,我们把参数都写在这里
如下local.properties:
程序根目录下新建一个custom_rules.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 渠道包打包脚本 ant deploy -->
<project name="custom_rules" >
<taskdef resource="net/sf/antcontrib/antcontrib.properties" >
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<!-- 循环打包 -->
<target name="deploy" >
<antcall target="clean" />
<foreach
delimiter=","
list="${market_channels}"
param="channel"
target="modify_manifest" >
</foreach>
</target>
<target name="modify_manifest" >
<!-- 获取渠道名字 -->
<propertyregex
input="${channel}"
override="true"
property="channelname"
regexp="(.*):"
select="\1" />
<!-- 获取渠道号码 -->
<propertyregex
input="${channel}"
override="true"
property="channelkey"
regexp=":(.*)"
select="\1" />
<replaceregexp
byline="false"
flags="g" >
<!-- 匹配的内容是 android:name="channelname" android:value="(.*)" -->
<regexp pattern="android:name="channelname" android:value="(.*)"" />
<!-- 匹配之后将其替换为 android:name="${channelname}" android:value="channelkey" -->
<substitution expression="android:name="${channelname}" android:value="${channelkey}"" />
<!-- 正则表达式需要匹配的文件为AndroidManifest.xml -->
<fileset
dir=""
includes="AndroidManifest.xml" />
</replaceregexp>
<!-- 打包 -->
<antcall target="release" />
<!-- 拷贝渠道包到指定目录下 -->
<copy
file="${out.absolute.dir}/${ant.project.name}-release.apk"
tofile="${out.absolute.dir}/out/${ant.project.name}-v${version}-${channelkey}.apk" />
<!-- 打包完一个渠道包后把渠道名和渠道号替换回原来格式,这样可以进行下一次替换 -->
<replaceregexp
byline="false"
flags="g" >
<regexp pattern="android:name="${channelname}" android:value="(.*)"" />
<substitution expression="android:name="channelname" android:value="channelkey"" />
<!-- 正则表达式需要匹配的文件为AndroidManifest.xml -->
<fileset
dir=""
includes="AndroidManifest.xml" />
</replaceregexp>
</target>
</project>
在这里需要注意:双引号用",由于贴代码的时候网页自动把"转义字符替换成“了。。我们把代码粘贴进程序。需要我们手动修改一下。
如图:注意看一下我的截图和你粘贴上面代码的区别。你的多了几个双引号。我的改为转义字符了。
修改完成以后开始构建.
运行。等待结果。
这就是我打包出来的结果。。说明成功了。。文件存放在bin---out文件夹下。运行通过友盟统计查看结果吧。。记得友盟统计那个key改成你自己的。
不放心的话也可以通过反编译app查看一下meta值。
我在运行过程中也遇到了2个问题,比较棘手。。下面介绍一下:
报错形式1:
这种问题就是上面提到的双引号的问题。。按照指示修改对应行即可。
报错形式2:
custom_rules.xml内容粘贴有问题。。重新粘贴我上面的代码修改即可。
报错形式3:
这是代码混淆引起的。在local.properties里面去掉代码混淆语句即可。。如果需要增加混淆,请自行查找解决办法。
报错形式4:
这是由于缺少一个名为ant-contrib-1.0b3的jar包引起。下载该jar包放在libs下。通过 build.xml右击run as---Exterenal Tools configurations--Classpath 选择 add JARS 增加该jar包ok。开始生成app