友盟统计基础上Eclipse下使用Ant多渠道批量打包

时间:2021-05-17 18:38:47

在上一篇文章《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>


在这里需要注意:双引号用&quot;,由于贴代码的时候网页自动把&quot;转义字符替换成了。。我们把代码粘贴进程序。需要我们手动修改一下。

如图:注意看一下我的截图和你粘贴上面代码的区别。你的多了几个双引号。我的改为转义字符了。友盟统计基础上Eclipse下使用Ant多渠道批量打包

修改完成以后开始构建.

友盟统计基础上Eclipse下使用Ant多渠道批量打包

友盟统计基础上Eclipse下使用Ant多渠道批量打包

运行。等待结果。

友盟统计基础上Eclipse下使用Ant多渠道批量打包

这就是我打包出来的结果。。说明成功了。。文件存放在bin---out文件夹下。运行通过友盟统计查看结果吧。。记得友盟统计那个key改成你自己的。

不放心的话也可以通过反编译app查看一下meta值。

我在运行过程中也遇到了2个问题,比较棘手。。下面介绍一下:

报错形式1:友盟统计基础上Eclipse下使用Ant多渠道批量打包

这种问题就是上面提到的双引号的问题。。按照指示修改对应行即可。

报错形式2:友盟统计基础上Eclipse下使用Ant多渠道批量打包

custom_rules.xml内容粘贴有问题。。重新粘贴我上面的代码修改即可。

报错形式3:友盟统计基础上Eclipse下使用Ant多渠道批量打包

这是代码混淆引起的。在local.properties里面去掉代码混淆语句即可。。如果需要增加混淆,请自行查找解决办法。

报错形式4:友盟统计基础上Eclipse下使用Ant多渠道批量打包

这是由于缺少一个名为ant-contrib-1.0b3的jar包引起。下载该jar包放在libs下。通过 build.xml右击run as---Exterenal  Tools configurations--Classpath 选择 add JARS 增加该jar包ok。开始生成app

友盟统计基础上Eclipse下使用Ant多渠道批量打包友盟统计基础上Eclipse下使用Ant多渠道批量打包