基于Manifest的AppsFlyer出厂预装归因(安卓)

概要:对于预装到设备出厂设置中的应用,AppsFlyer可以将其激活归因到相应的设备厂商。注意:另请参见其它预装归因原理

pre-install-intro-breakdown.png

简介

什么是预装推广?

应用所有者(广告主)可以通过预装推广在不投放线上广告的情况下触达大量潜在用户。

在预装推广场景中,广告主会让设备生产商将相关应用作为出厂设置安装在设备中

预装推广也包括与第三方渠道合作,让其代表广告主通过设备生产商实现预装。

 重要事项!

用户首次启动应用时,AppsFlyer会记录一次激活。因此,AppsFlyer中呈现的预装数量是指激活应用的用户数量,而不是预装了该应用的设备数量。

记录预装推广带来的激活有何意义

对预装推广进行归因后,您就可以了解:

  • 打开了相关预装应用的用户数量
  • 各设备生产商带来的用户数量
  • 用户LTV,并以此来判断带来高价值用户的生产商

如何衡量预装推广?

预装推广的衡量方式共有四种。详情请见本文的设置部分。

查看预装数据

与其他激活一样,预装激活在AppsFlyer面板中会呈现在获得归因的渠道下。但是,这些激活的广告系列名称总是显示为Pre-install

 注意

您可以使用SDK API方法为预装激活配置不同的广告系列名称。

 注意

从2022年5月24日:

  • 在原始数据报告中,预装推广的Match_type(匹配类型)显示为preload_conf
  • AppsFlyer会在面板中展示促成预装的广告平台以及促成应用首次打开的广告平台。详情请见预装推广

设置

下表列出了衡量预装推广的各种方式,您可以根据实际需求选用其中任意一种。

方法名称 是否需要多个APK 能否确保预装归因 是否需要渠道或厂商侧操作
系统属性(System Properties)
SDK API
在Manifest文件中指名(Name in Manifest File)
路径(Path Way)

系统属性(推荐)

适配要求:必须使用V4.0+版本的SDK。

该方法是所有方法中最稳定可靠的,但需注意:预装完成后,所有应用激活(包括新增激活和重装激活)都会被归因到预装渠道。

系统属性(System Properties)方法需要应用开发人员和设备生产商双方都完成相应的操作。

开发人员

您需要向设备生产商或媒体渠道APK。该方法只需要用到默认APK,无需提供其他单独的APK。

创建一个名为pre_install.appsflyer的文件,并在该文件添加以下键值对:

<package_name>=<media_source>

例如:

com.appsflyer.sampleapp=huawei

请使用以下方式指定其他预装参数:

pre_install.appsflyer文件中以JSON格式传递其他参数。例如:

com.appsflyer.sampleapp={"pid":"huawei", "c":"special_campaign","af_adset":"some_adset"}

 重要事项!

使用此方案时,请务必注意以下事项:

  • 在原始数据中,Channel(流量入口)显示为“Pre-install”
  • 如果JSON配置中没有pid参数,则原始数据中的媒体渠道(Media Source)显示为“None”
  • 如果JSON配置中没有c参数,则广告系列名称显示为“Pre-install”
  • 如果JSON格式有误,则参数中的字符串会作为媒体渠道名称显示。

pre_install.appsflyer配置完毕后,请将其连同APK一起发送给媒体渠道或设备生产商。

设备生产商

设备生产商需要将pre_install.appsflyer放置在其指定的文件路径中,并将pre_install.appsflyer的文件权限设置为744。

然后,设备生产商需要在该系统属性文件中添加一个键值对,以指向pre_install.appsflyer文件。

 注意

这一环节以及预装配置测试都需要用到Root权限。详情请见本文的测试部分。

在安卓系统属性中添加键值对

adb shell su 
 setprop ro.appsflyer.preinstall.path /data/pre_install.appsflyer

另一种方法是从安卓文件系统中提取system-properties-file,并返回编辑完毕后的文件。

adb root
adb remount
adb pull /system/build.prop
echo ro.appsflyer.preinstall.path=/data/pre_install.appsflyer >> build.prop
adb push build.prop /system/build.prop
adb shell chmod 644 /system/build.prop
adb reboot

优势

无需分媒体渠道或厂商单独维护APK。对于在Google Play上架的应用,无需在其代码中添加路径。厂商可以使用自定义路径,并能在不同设备上预装多个应用,且这些应用之间不存在依赖关系。

此方法可确保将激活归因到预装广告系列和媒体渠道。即使用户在打开应用前先进行了更新,或在点击广告后才激活应用,AppsFlyer仍会将预装激活归因到预装渠道或厂商。

缺点

部分工作转移到了渠道和厂商侧,因此开发人员需要确保渠道或厂商完成必要操作。此外,该方法可能会增加开发人员的测试难度。

SDK API

SDK API方法可以在本机层面指定预装激活的归因厂商或渠道名称。

如需使用SDK API,请在AFApplication类中添加以下方法,在SDK初始化之前调用:

setPreinstallAttribution(String mediaSource, String campaign, String siteId)

与媒体渠道合作时

AppsFlyerLib.getInstance().setPreinstallAttribution("MEDIA_SOURCE_NAME", "CAMPAIGN_NAME", "123");
AppsFlyerLib.getInstance().init(AF_DEV_KEY , conversionListener , getApplicationContext());

与厂商合作时

AppsFlyerLib.getInstance().setPreinstallAttribution(android.os.Build.MANUFACTURER, "CAMPAIGN_NAME", "123");
AppsFlyerLib.getInstance().init(AF_DEV_KEY , conversionListener , getApplicationContext());

 注意

  • 媒体渠道是必须配置的参数。
  • android.os.Build.MANUFACTURER属性中包含由操作系统配置的厂商名称。使用此属性获取厂商名称时,同一厂商的不同设备可能会以不同的格式呈现该名称。请确保该属性中包含您预期的厂商名称。
  • campaignsiteId不是必须配置的参数,但使用setPreinstallAttribution方法时必须配置这两个参数。如果您不想指定campaignsiteId ,请将这两个参数的值设置为null。

优势

您可以使用SDK API以程序化的方式拉取厂商名称信息。无论您与哪个厂商合作,SDK方法都可以直接从设备中读取该厂商的名称。也就是说,即使您与多个厂商合作,也只需要维护一个APK。

您可以使用setPreinstallAttribution方法指定广告系列名称。您可以将各个厂商或媒体渠道划分为不同的广告系列,而不是全都设置为“Pre-install”广告系列。

缺点

如果您直接与厂商合作,就必须维护两个版本的APK,一个用于厂商预装,另一个用于Google Play上架。这两个场景都需要用到多个APK。

如果您通过多个渠道与厂商合作,还需要针对每个渠道维护单独的APK。

预装应用的激活在部分情况下不会被归因到预装媒体渠道:

  • 用户使用新设备直接通过Google Play更新预装应用,然后才完成该应用的首次打开,这时AF会将该激活记录为自然量。
  • 用户在新设备上点击广告后通过Google Play更新预装应用,这时AF会将该激活归因到展示广告的媒体渠道。

 提示

您可以在应用中添加逻辑,使得预装应用的激活在上述场景中也会被记录为预装激活。您需要确保Google Play Store中的APK和厂商预装的APK中都包含该逻辑。

示例:

  • 已知某个厂商在某个型号的设备中预装了广告主的应用,且这些设备具有相同的移动运营商。
  • 用户首次启动应用后,您可以在其激活中核对上述信息。如果该激活中的信息与此一致,就将其记录为预装激活。由于Google Play Store的APK中也存在该逻辑,因此即使用户在启动应用之前对其进行了更新,其激活也会记录为预装激活。

在Manifest文件中指名

使用这个方法时,您需要在相关应用的Manifest文件中添加元数据标签,并针对每个合作渠道或厂商分别完成该操作。

如需使用该方法,请在关闭应用程序标签之前添加以下元数据标签:

...
    <meta-data android:name="AF_PRE_INSTALL_NAME" android:value="market_name"/>
  </application>
</manifest>

应用首次启动时,AppsFlyer SDK在manifest文件中检测到这个元数据标签,并根据该标签对激活进行归因。

优势

这是一种是较为简便的预装归因方案,只需要在Manifest中添加一个标签便可完成。此外,该方法也不涉及任何渠道或厂商侧的操作。

缺点

由于元数据标签指定了媒体渠道或厂商名称,因此您需要针对每个媒体渠道分别维护一组APK。

预装应用的激活在部分情况下不会被归因到预装媒体渠道:

  • 用户使用新设备直接通过Google Play更新预装应用,然后才完成该应用的首次打开,这时AF会将该激活记录为自然量。
  • 用户在新设备上点击广告后通过Google Play安装相关应用,这时AF会将该激活归因到投放广告的媒体渠道。

路径

 注意

该方法适用于4.5.0及以上版本的SDK。

此方法同时涉及开发侧和厂商侧的操作。

开发人员

使用此方法时,您可以指定一个文件路径,该文件中含有预装渠道或厂商的名称。您需要完成三个步骤:

  1. 创建一个包含键值对的文件,并将该文件命名为pre_install.appsflyer。在该文件中,以<PACKAGE_NAME>=<MEDIA_SOURCE>的格式配置键值对,如com.appsflyer.sampleapp=my_media_source

    传递其他预装参数

    您可以使用JSON在文件中指定其他预安装参数。例如,您可以在pre_install.appsflyer文件中添加以下键值对:

    com.appsflyer.sampleapp={"pid":"huawei", "c":"special_campaign","af_adset":"some_adset"}
    

     重要事项!

    使用此方案时,请务必注意以下事项:

    1. af_channel显示为"Pre-install"
    2. 如果JSON中没有pid,则媒体渠道显示为“无”。
    3. 如果JSON配置中没有c参数,则广告系列名称显示为“Pre-install”
    4. 如果JSON格式有误,则参数中的字符串会作为媒体渠道名称显示。

    pre_install.appsflyer配置完毕后,请将其连同APK一起发送给媒体渠道或设备生产商。

  2. 与渠道或厂商讨论该文件的存放路径并达成一致。建议将路径设置为“ /data/local/tmp/pre_install.appsflyer”。
  3. 在manifest文件中配置商定的路径。请在关闭应用程序标签之前添加以下代码段:
    <meta-data android:name="AF_PRE_INSTALL_PATH" 
          android:value="/data/local/temp/pre_install.appsflyer" />
    

设备生产商

厂商需要将文件放在约定的路径中,并将pre_install.appsflyer的文件权限设置为744。

应用启动后,SDK会读取到manifest文件中指定的路径,并根据该路径找到相应的文件,然后根据其中指定的媒体渠道对激活进行归因。

优势

AppsFlyer会按两个默认路径查找pre_install.appsflyer文件:

/data/local/tmp/pre_install.appsflyer
OR 
/etc/pre_install.appsflyer

部分厂商会选择将文件放在非默认路径中。这时,您可以在manifest文件中指定相应的非默认路径。

 重要事项!

如需使用非默认路径,必须接入4.8及以上版本的SDK。

虽然我们支持非默认路径,但更建议您使用系统属性方法。

缺点

您需要为不同的媒体渠道或厂商维护单独的pre_install.appsflyer文件。

厂商可能希望将pre_install.appsflyer文件放在非默认路径中。在这种情况下,您需要为每个非默认路径维护单独的APK。

如果使用非默认路径,则无法保证预装应用的激活能被归因到预装媒体渠道:

  • 用户使用新设备直接通过Google Play更新预装应用,然后才完成该应用的首次打开,这时AF会将该激活记录为自然量。
  • 用户在新设备上点击广告后通过Google Play安装相关应用,这时AF会将该激活归因到投放广告的媒体渠道。

测试预装配置

本节说明了预装配置的测试和验证方法。

 重要事项!

测试前请先确保您的测试设备已加白
另外,请在AFApplication类中将调试日志(Debug Log)设置为true。

AppsFlyerLib.getInstance().setDebugLog(true);

验证应用中的配置

 提示

为避免缓存问题并获得最佳结果,建议您在构建项目之前先对其进行清理。进入Android Studio,点击上下文菜单(Context Menu)中的Build ,然后选择Clean Project

在Android Studio中构建应用程序,然后将其安装到测试设备上。应用程序启动后,在Android Studio中打开Logcat,然后按“AppsFlyer”筛选,您会看到被归因的激活及其详细信息。如下图所示:

pre_install_logcat.png

pre_install_logcat_2.png

在AppsFlyer面板中验证配置

如果配置成功,则面板中会出现归因到相关厂商或渠道的非自然激活,且该激活会列在“Pre-install”(预装)广告系列下。

进入您的AppsFlyer帐户,打开要测试应用的面板,然后按照以下步骤操作:

  1. 在数据总览面板中按媒体渠道筛选数据,并选择相应的渠道:

    choose_media_source.png

  2. 按广告系列细分图表中,您可以看到被归因到“my media source”的激活来自预装广告系列:


    您也可以通过汇总效果报告来验证该激活的归因是否正确。在该报告中,您可以看到媒体渠道和广告系列信息。如下图截屏所示,媒体渠道为“My Media Source”,广告系列为Pre-install:

  3. 针对各个预装推广合作厂商和渠道分别完成上述流程。

特殊场景

同一台设备上的多个预装应用

如果您在同一设备上预装了多个应用,则可以使用以下任一方法来和衡量归因:

  • 在Manifest文件中指名——在每个应用的Manifest.xml中都指定媒体渠道或厂商。
  • SDK API——在每个应用的SDK API方法中都指定预装渠道或厂商。
  • 系统属性或路径——可以在pre_install.appsflyer文件中指定相关应用及其对应的媒体渠道。在该文件中,各应用的信息必须单独占用一行。例如:
    com.appsflyer.tester=market_name
    com.newapp.newapp=market_name
    com.game.king=market_name

发送激活回传

如果您的合作渠道或厂商是AppsFlyer的对接渠道,就可以向其发送激活回传。

如需发送激活回传,请确保其媒体渠道名称与AppsFlyer配置的媒体渠道pid一致。

比如您与market_name合作,其pid为market_name_int。您可以在对接渠道的归因链接中查看该pid。

代理商

目前代理商尚无法获得预装激活的归因。

如果预装数据中包含af_prt(用于表达代理名称的参数),则用户激活预装应用后:

  • 该用户会被归因到代理所使用的媒体渠道(pid=)。
  • 广告主可以访问完整的用户级别数据。
  • 用户不会归因给代理商。
  • 代理商无法访问用户级别数据。