Android 下载归因 — GA和Play Install Referrer库

当App开发完成后就会发布到各种应用商店。在海外通常会选择Google Play商店,而在国内通常会选择各大手机厂商的应用商店或腾讯的应用宝。

应用商店本身会提供一些推广服务来增加App的曝光度,但仅依靠商店自身的推广效果往往不够理想。因此,通常需要通过投放广告来推广App。这种广告投放可以在不同的平台和渠道进行,但如何评估投放效果呢?这就需要运用归因的方法,将App的下载与用户通过哪个广告途径下载的App进行关联。

通过归因分析,可以确定哪些广告对App的下载和安装产生了比较显著的影响。从而帮助优化广告投放策略,集中资源在效果较好的渠道上,提高推广效果和回报率。

本文主要介绍应用发布到谷歌商店后如何进行下载归因。

Play Install Referrer 库

Google Play商店的Install Referrer API可以从Google Play安全的获取安装引荐来源相关的信息。

Play Install Referrer库对Install Referrer API进行了封装,相比起来使用更加简单。但如果使用的语言不是Kotlin或Java,那么只能通过Install Referrer API来获取安装引荐来源相关的信息。

官方文档

添加依赖

在项目app module的build.gradle中的dependencies中添加依赖:

scss 复制代码
dependencies {
    implementation("com.android.installreferrer:installreferrer:2.2")
}

获取安装引荐参数

可以通过以下步骤实现获取安装引荐参数。

  • 创建InstallReferrerClient类的对象。
  • 通过创建的对象调用 startConnection()方法发起连接,可以传入InstallReferrerStateListener对连接状态进行监听。
  • InstallReferrerStateListener.onInstallReferrerSetupFinished()回调中处理成功或失败信息。当responseCode返回InstallReferrerResponse.OK时,就可以通过getInstallReferrer()方法获取安装引荐来源参数。
  • InstallReferrerStateListener.onInstallReferrerServiceDisconnected回调在连接断开时触发,此时可以进行重连。

示例代码如下:

kotlin 复制代码
object InstallReferrerUtils {

    private var referrerClient: InstallReferrerClient? = null

    private val installReferrerStateListener = object : InstallReferrerStateListener {
        override fun onInstallReferrerSetupFinished(responseCode: Int) {
            if (responseCode == InstallReferrerResponse.OK) {
                // 连接成功,可以获取安装引荐来源参数
                handlerInstallReferrerParams()
                // 处理完后释放资源
                release()
            } else {
                // 连接失败,根据需求可以进行重连
                Log.e(CustomConstant.TAG, "connect to google play failed errorCode:$responseCode")
            }
        }

        override fun onInstallReferrerServiceDisconnected() {
            // 与Google Play连接断开,10秒后进行重连
            reconnectHandler?.postDelayed(reconnectRunnable, 10000)
        }
    }

    private var reconnectHandler: Handler? = null
    private var reconnectHandlerThread: HandlerThread? = null
    private var reconnectRunnable = Runnable { connectReferrerClient() }

    init {
        reconnectHandlerThread = HandlerThread("InstallReferrerReconnectThread").apply {
            start()
            reconnectHandler = Handler(looper)
        }
    }

    fun init(context: Context) {
        if (referrerClient == null) {
            referrerClient = InstallReferrerClient.newBuilder(context).build()
        }
        connectReferrerClient()
    }

    private fun connectReferrerClient() {
        referrerClient?.run {
            if (!isReady) {
                // 发起连接
                startConnection(installReferrerStateListener)
            }
        }
    }

    private fun handlerInstallReferrerParams() {
        referrerClient?.run {
            if (isReady) {
                installReferrer.let {
                    // 安装引荐信息
                    val installReferrer = it.installReferrer
                    // 安装版本号
                    val installVersion = it.installVersion
                    // 开始安装的时间
                    val installBeginTimestampSeconds = it.installBeginTimestampSeconds
                    // 开始安装的服务器时间
                    val installBeginTimestampServerSeconds = it.installBeginTimestampServerSeconds
                    // 点击推荐信息的时间
                    val referrerClickTimestampSeconds = it.referrerClickTimestampSeconds
                    // 点击推荐信息的服务器时间
                    val referrerClickTimestampServerSeconds = it.referrerClickTimestampServerSeconds
                    // 过去7天是否参与过免安装体验
                    val googlePlayInstantParam = it.googlePlayInstantParam
                }
            }
        }
    }

    private fun release() {
        referrerClient?.endConnection()
        reconnectHandler?.removeCallbacksAndMessages(null)
        reconnectHandlerThread?.quit()
        reconnectHandlerThread = null
        reconnectHandler = null
        referrerClient = null
    }
}

Application或启动Activity中调用InstallReferrerUtils.init()方法即可。

测试

添加referrer的链接:

bash 复制代码
https://play.google.com/store/apps/details?id=${app的包名}&referrer=${推荐来源参数}

这边referrer字段先使用testinstallreferrer测试效果。

由于是通过Google Play获取信息,因此可以将App的aab先发布到商店的内测渠道或封闭式测试渠道。

  • 发布到封闭式测试渠道后,添加测试人员的邮箱。
  • 在参与的方式中获取邀请参加测试的链接。
  • 获取邀请链接后在测试设备打开并接收邀请。
  • 在参与的方式中获取测试安装包对应的商店链接。

获取到链接之后记得拼接参数&referrer=testinstallreferrer

上传的测试包输出了日志信息,所以安装后在Logcat中可以看到如下日志:

需要注意的是,由于需要从Google Play商店获取相关信息,所以需要确保Google Play商店可以正常使用。

Google Analytics

实现了获取引荐来源参数之后,下一步就是上报对应信息,才能将信息用于分析投放效果。如果App在Google Play商店发布,那么不妨看看同为谷歌系的Google Analytics

在领导的指导下,发现Google Analytics已经内置了Play Install Referrer API

官方文档

广告归因

通过在广告链接中设置广告系列参数,可以用于分析广告的投放效果。官方提供了辅助工具可以协助配置。

可以配置下列5种参数:

  • utm_source:标识为您的媒体资源带来流量的广告客户、网站、出版物等,例如:google、newsletter4、billboard。
  • utm_medium:广告媒介或营销媒介,例如:每次点击费用、横幅广告和电子邮件简报。
  • utm_campaign:产品的具体广告系列名称、标语、促销代码等。
  • utm_term:标识付费搜索关键字。如果您采用人工方式标记付费关键字广告系列,那么您还应使用 utm_term 来指定相应关键字。
  • utm_content:用于区分相似内容或同一广告内的链接。例如,如果您在同一封电子邮件中使用了两个号召性用语链接,就可以使用 utm_content 并为每个链接设置不同的值,以便判断哪个版本的效果更好。

测试

测试步骤与上一部分类似,只是链接改为使用广告系列参数。

测试链接如下:

perl 复制代码
https://play.google.com/store/apps/details?id=${app的包名}&referrer=utm_source%3Dminigame%26utm_medium%3Ddownload%26utm_term%3Dtest%26utm_content%3Dtest%26utm_campaign%3Dtest

通过测试链接安装后,可以在GA后台的报告->发掘潜在客户->用户获取情况中看到安装已经被统计到(不是实时的),如下图:

相关推荐
找藉口是失败者的习惯2 小时前
Jetpack Compose 如何布局解析
android·xml·ui
Estar.Lee7 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
温辉_xh7 小时前
uiautomator案例
android
工业甲酰苯胺8 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
少说多做3438 小时前
Android 不同情况下使用 runOnUiThread
android·java
Estar.Lee10 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
找藉口是失败者的习惯10 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey12 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
大白要努力!13 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟14 小时前
Android音频采集
android·音视频