Android广告量监控的技术实现(campaign measurement)

来源:互联网 发布:淘宝商城2016女装新款 编辑:程序博客网 时间:2024/05/29 14:12

有这么一种需求,我们找广告平台来推销我们的APP,我们想要知道这个广告平台的转化率到底怎么样。是否可以做到?如果APP是发布在Google Play的话,那么是可以做到的。

当用户点击一条广告,并跳转进了Google Play,Google Play可以获取到广告的链接,而这条链接里带有referrer参数的话,referrer参数里的内容将在APP安装完之后,就发给APP。如果APP有监听这个广播的对象的话,就能成功捕捉到安装的来源信息。

Google Play Campaign Attribution介绍了一种解决方案,这种解决方案可以帮助开发者在Google Play的开发者控制台(developer console)查看到相关信息。

一般的开发者也许读完上面的教程就足矣,但若是没搞懂安卓以及Google Play背后的机制,恐怕还有不少坑要踩,毕竟这个方案并不是很容易测试,只有发布到google play后才能真正的检验是否成功。(Testing Google Play Campaign Measurement介绍了一种并不完全可靠的方法。)

事实上,当用户从Google Play安装完APP后,Google Play作为一个APP本身,会触发一个Intent实例,Intent实例的action"com.android.vending.INSTALL_REFERRER"。这个Intent实例并非简单的发出,而是先通过queryBroadcastReceivers的方式先获取一个接受的队列,然后只会对队列的第一个发出Intent实例!

如果一个APP中只有一个INSTALL_REFERRER监听对象,那还不会触碰雷区,然后作为开发者,往往更可能接触到一个已经接入众多SDK的安卓项目,有多个Receiver监听INSTALL_REFERRER。对于这种情况,谷歌在文档中已经说明了一种解决方案(只要一个receiver,其他的不要注册,在代码里显示地(explicitly)整合进去,参考《Testing Google Play Campaign Measurement》一文最后的注意事项),但当某个SDK的Receiver又偏偏提供了另一种解决方案:

List<ResolveInfo> l=context.getPackageManager().queryBroadcastReceivers(intent, 0);// then send the content to each receiver

这个时候如果照着google提供的方案来实现的话,必然会导致一个死循环。(请自行思考原因)如果鄙弃谷歌的方案,而实现这种方案,也未尝不可。appflyer正是这种方案的实现者之一,这种方案要实现的前提是,在AndroidManifest.xml中一定要注册好所有的receiver,而不是像谷歌官方推荐的那种——只注册一种。

官方文档并没有说明AndroidManifest.xml中书写的前后顺序是否会影响queryBroadcastReceivers的前后顺序,目前只能乐观地认为它会。通过这种方案,把作为gate的receiver放在第一个,就可以完成。

经测试,android:priority不能影响queryBroadcastReceivers的前后顺序。

除了这种方案外,还有另一种方案,比较可靠,像Tapjoy等SDK采用这种方案:

以下代码拷贝自Stackoverflow用户Mathijs Vogelzang的回答

//This is Appbrain's receiver<receiver android:exported="true" android:name="com.appbrain.ReferrerReceiver" >    <intent-filter>        <action android:name="com.android.vending.INSTALL_REFERRER" />    </intent-filter>    <meta-data android:name="forward.inmobi" android:value="com.inmobi.adtracker.androidsdk.IMAdTrackerInstallRefererReciever" />     <meta-data android:name="forward.custom" android:value="com.xgame.adproject2.TestReceiver" /></receiver>//个人补充:其他的不需要写在Manifest, 除非要监听其他的action。

就是通过meta-data的方式,引入其他几个receiver。

其实了解到这里,就能知道,就算不接入GA,也一样可以实现数据的统计,只不过可能不能使用Google的相关服务而已。

0 0