AppsFlyer / Firebase Android SDK 接入需求文档

1. 背景与目标

我司为现金贷类 Android App,需要接入 AppsFlyer,用于海外投放归因、安装统计、关键业务漏斗事件统计、收益/金额类事件统计、卸载统计,以及将 AppsFlyer ID 与我司后端用户/设备体系关联。同时需要接入 Firebase,支持 Push 消息触达和 Crash 崩溃采集,满足海外投放后的召回、运营通知、问题定位和版本质量监控需求。

本需求文档面向研发评审,范围聚焦 Android 端:AppsFlyer Install SDK、Integrate SDK、In-app Event、Uninstall Measurement、getAppsFlyerUID,以及 Firebase Analytics、Firebase Cloud Messaging、Firebase Crashlytics。

2. 接入范围

模块是否必须说明
AppsFlyer SDK 安装必须通过 Gradle 接入 SDK,保证安装、会话和事件可上报
SDK 初始化与启动必须在全局 Application 初始化并启动 SDK
AppsFlyer UID 获取与后端关联必须获取 appsFlyerId 后传给后端,和用户、设备、订单、风控链路关联
应用内事件上报必须覆盖注册、提交申请、授信通过、首贷、借贷等现金贷核心漏斗
金额字段 af_revenueaf_currency必须涉及金额/收益类事件必须按 AppsFlyer 规则上报
卸载统计建议必须用于分析获客质量、贷后触达、召回和渠道质量
Firebase Push必须通过 Firebase Cloud Messaging 支持运营通知、系统通知和召回触达
Firebase 归因必须通过 Firebase Analytics/GA4 记录安装来源、营销活动和核心漏斗,作为 AppsFlyer 的补充分析口径
Firebase Crash必须通过 Firebase Crashlytics 采集崩溃、非致命异常和版本质量数据
测试设备白名单必须使用 GAID 加白,支持反复安装测试

3. 前置条件

  1. AppsFlyer 后台已创建 Android App,App ID 与 Android applicationId 保持一致。
  2. 产品/运营提供 AppsFlyer Dev Key、App ID、投放渠道、默认币种、后台时区。
  3. 本期投放国家为尼日利亚,默认币种采用奈拉,币种代码为 NGN
  4. 测试设备 GAID 已加入 AppsFlyer 测试设备白名单。
  5. 研发确认当前 App 是否已接入 Firebase Cloud Messaging;该结论影响卸载统计方案。
  6. Firebase 项目已创建 Android App,Android 包名、SHA-1/SHA-256 证书指纹、环境区分方式已确认。
  7. 产品/运营确认 Push 使用场景、消息类型、跳转规则、默认渠道和用户退订/关闭通知后的产品策略。
  8. 研发确认 Crashlytics 是否按环境区分上报,Debug 包默认不进入正式质量报表。
  9. 产品/运营确认 Firebase 归因是否用于 Google Ads 关联、渠道补充分析和漏斗分析;AppsFlyer 仍作为付费投放归因主口径。
  10. 法务/合规确认隐私政策中已覆盖归因 SDK、广告 ID、设备标识、Push token、崩溃日志和事件数据上报说明。

4. SDK 安装需求

4.1 Gradle 依赖

研发需在项目仓库声明 mavenCentral(),并在 App 模块添加 AppsFlyer Android SDK 依赖。

建议版本策略:

要求
SDK 版本优先评估接入 Maven 最新版本 7.0.0;如项目需沿用 6.x 稳定 API,则至少使用 6.18.1 并单独评估后续 v7 迁移
依赖方式使用 Gradle 依赖,不建议手动放置 aar
Google Play Install Referrer必须接入 com.android.installreferrer:installreferrer:2.2,提升安装归因准确性
Meta Install Referrer如投放 Facebook/Instagram,需配置 Facebook App ID 供 SDK 读取
Firebase BoM必须接入 Firebase BoM,统一管理 Firebase Messaging、Crashlytics 等依赖版本
Firebase Messaging必须接入,用于 Push token 获取、前台/后台消息接收和 AppsFlyer 卸载统计 token 上报
Firebase Analytics必须
Firebase Crashlytics必须接入,用于采集崩溃、非致命异常、版本号和设备环境信息

Firebase Gradle 接入要求:

  1. 项目级 Gradle 需添加 Google Services 插件和 Crashlytics Gradle 插件。
  2. App 模块需应用 com.google.gms.google-servicescom.google.firebase.crashlytics 插件。
  3. App 模块需添加 google-services.json,并按开发、测试、生产环境区分配置文件或构建变体。
  4. Firebase 依赖版本统一由 Firebase BoM 管理,避免各 SDK 版本手动混配。

4.2 Android 权限

AndroidManifest.xml 必须包含:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

Push 权限说明:

  1. Android 13 及以上必须在运行时申请 POST_NOTIFICATIONS 权限。
  2. 未授权通知权限时,不得阻断 App 核心流程;客户端需记录授权状态,供运营判断可触达用户规模。
  3. Android 12 及以下无需运行时申请通知权限,但仍需支持系统通知开关关闭后的降级处理。

广告 ID 权限说明:

  1. SDK 6.8.0 及以上会自动合并 com.google.android.gms.permission.AD_ID
  2. 我司现金贷 App 非儿童类应用,不需要移除 AD_ID。
  3. 若后续存在儿童/家庭政策适配包,需单独评估并移除 AD_ID。

4.3 备份规则

AppsFlyer SDK 会通过 Manifest 规则避免 appsflyer-data 被系统备份,以免卸载重装后复用旧计数器和旧 AppsFlyer ID,影响新安装/重装识别。若我司 App 自定义了 allowBackupfullBackupContentdataExtractionRules,研发需处理 Manifest merge 冲突,并保证 appsflyer-data 被排除备份。

5. SDK 初始化与启动需求

5.1 初始化位置

必须在全局 Application.onCreate() 中初始化 SDK,确保冷启动、深链、后台拉起等场景均可触发 SDK。

基础流程:

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AppsFlyerLib.getInstance().init(AF_DEV_KEY, null, this)
        AppsFlyerLib.getInstance().start(this)
    }
}

要求:

  1. AF_DEV_KEY 不得硬编码在业务代码散落位置,需通过统一配置管理。
  2. Release 包不得开启 AppsFlyer debug log。
  3. Debug/测试包可开启 AppsFlyerLib.getInstance().setDebugLog(true),用于 Logcat 搜索 AppsFlyer_ 排查。
  4. 如因隐私同意弹窗需要延迟 startinit 仍需在 Application 执行;start 延迟后必须传入 Activity Context,否则可能丢失归因和事件。

5.2 启动回调

建议研发在测试包或灰度阶段使用 AppsFlyerRequestListener 监听 start 成功/失败,便于定位 Dev Key、网络、配置问题。生产环境可保留轻量错误日志,但不得记录敏感用户信息。

6. AppsFlyer UID 获取与后端关联

6.1 获取方式

Android 端必须在 SDK 初始化后获取 AppsFlyer UID:

val appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(context)

AppsFlyer UID 是 SDK 为安装生成的唯一 ID。卸载重装后该 ID 可能变化,因此不能作为我司永久用户 ID 使用,只能作为归因/安装维度 ID。

6.2 后端关联要求

客户端需在以下时机把 appsFlyerId 传给后端:

时机是否必须说明
用户登录成功后必须关联我司 user_idappsFlyerId
额度申请提交后必须关联 application_id,用于渠道质量和放款 ROI 分析
借款申请提交后必须
每次进入首页必须

后端建议保存字段:

字段说明
appsflyer_idAppsFlyer UID
user_id我司用户 ID,登录后必填
device_id我司设备 ID,如已有
gaidAndroid Advertising ID,如合规允许获取
app_versionApp 版本
package_nameAndroid 包名
install_time_client客户端首次获取时间
last_seen_time最近一次上报时间

7. 应用内事件需求

7.1 上报方式

AppsFlyer 事件支持两类命名:

类型说明本期使用
官方预置事件AppsFlyer 已定义的推荐事件名,通常以 af_ 开头,例如 af_complete_registrationaf_login注册使用官方预置事件
自定义事件我司按业务自定义的事件名,例如 applyapprovedloan贷款申请、授信通过、放款等现金贷业务事件使用自定义事件

上报通道分为 Android SDK 上报和后端 S2S 上报:

通道适用场景要求
Android SDK 上报App 端可准确感知且不涉及资金最终状态的行为,例如注册成功、提交额度申请Android 端使用 logEvent
后端 S2S 上报以后端最终状态为准的事件,例如授信通过、首次成功放款、成功放款后端调用 AppsFlyer S2S Events API,并必须携带 appsflyer_id

Android 端使用 logEvent 上报事件:

AppsFlyerLib.getInstance().logEvent(
    context,
    eventName,
    eventValues
)

事件上报要求:

  1. 事件名必须稳定,不得随版本、语言、页面文案变化。
  2. 参数值不得包含手机号、身份证号、银行卡号、通讯录、精确地址等高敏感信息。
  3. 同一业务动作只上报一次,避免 10 秒内重复触发导致去重或数据偏差。
  4. 离线场景 SDK 会缓存事件,网络恢复后发送;关键风控/账务事件仍以我司后端为准。
  5. 涉及金额的事件必须同时上报 af_revenueaf_currency
  6. 后端 S2S 上报必须基于业务幂等键去重,例如 loan_order_id + event_name,避免重复放款事件导致收入重复。

7.2 时效性说明

数据类型预期时效说明
SDK Live Events近实时用于联调验证事件是否到达 AppsFlyer
安装归因面板通常 15-30 分钟白名单测试设备完成非自然安装后等待面板更新
应用内事件面板通常 30-60 分钟事件报表和看板存在处理延迟
后端 S2S 事件取决于后端触发和 AppsFlyer 处理授信通过、首贷、放款类事件以后端状态流转时间为准
卸载统计最长可能 24-48 小时卸载统计依赖 FCM 和 AppsFlyer 后台处理

7.3 现金贷核心事件表

业务事件业务 eventAppsFlyer 实际上报事件名事件类型上报方释义必传字段金额字段
注册registeraf_complete_registration官方预置后端 S2S用户注册成功af_registration_methoduser_id_hash
提交申请applyapply自定义后端 S2S用户提交额度申请application_id
授信通过approvedapproved自定义后端 S2S额度申请通过application_id、`user_credit_level“—— ADLEVEL:A/B/C/D
首贷first_loanfirst_loan自定义后端 S2S用户首次成功放款loan_order_idfirst_loan_valueaf_revenueaf_currency=NGNuser_credit_level必须上报,af_revenue=first_loan_value
借贷loanloan自定义后端 S2S用户成功放款loan_order_idloan_valueaf_revenueaf_currency=NGNuser_credit_level必须上报,af_revenue=loan_value

字段说明:

字段是否必须释义示例
user_credit_level如有则传用户额度等级,根据用户提交申请信息给用户分级额度标记ABCD
first_loan_value首贷事件必传用户首次获得的借贷金额50000
loan_value借贷事件必传用户本次成功放款金额50000

金额口径评审结论:

结论
金额上报事件只在放款成功相关事件上报金额:first_loanloan
af_revenue 口径放款本金金额;首贷为 first_loan_value,普通放款为 loan_value
af_currency固定传 NGN
非放款事件registerapplyapproved 不上报 af_revenue

7.4 金额与币种规则

  1. af_revenue 必须为纯数字,不得包含逗号、币种符号或文本,例如 1234.56
  2. af_currency 必须固定传 NGN,代表尼日利亚奈拉。
  3. AppsFlyer 后台默认币种需配置为 NGN,并与我司 BI/数仓口径保持一致。
  4. 退款、冲正、撤销等负向收益本期不启用,不上报负数 af_revenue

8. 卸载统计需求

8.1 接入方案

AppsFlyer Android 卸载统计依赖 Firebase Cloud Messaging。

当前 App 状态接入要求
已接入 FCMFirebaseMessagingService.onNewToken() 中调用 updateServerUninstallToken(context, token)
未接入 FCM新增 Firebase 配置、google-services.json、Firebase Messaging 依赖,并按官方方案接入卸载统计

已接入 FCM 的示例:

override fun onNewToken(token: String) {
    super.onNewToken(token)
    AppsFlyerLib.getInstance().updateServerUninstallToken(applicationContext, token)
}

8.2 卸载测试与验收

  1. 安装测试包。
  2. 打开 App,确保 SDK 初始化并上传 FCM token。
  3. 卸载 App。
  4. 等待 AppsFlyer 面板出现卸载数据;官方说明最长可能需要 48 小时。
  5. 如果用户在处理周期内重装 App,可能不会记录卸载事件。

9. Firebase 接入需求

9.1 Firebase 基础配置

Firebase 接入需满足以下基础要求:

配置项是否必须要求
Firebase 项目必须生产环境使用正式 Firebase 项目;测试环境建议独立项目或独立 App 配置
google-services.json必须包名必须与 Android applicationId 匹配,不得把生产配置误放到测试包
SHA 证书指纹必须Firebase 后台需配置发布证书和调试证书,用于后续能力扩展和问题排查
构建环境隔离必须Debug、Staging、Release 的 Push 和 Crash 数据需可区分
隐私合规必须Push token、崩溃堆栈、设备信息和用户标识需纳入隐私政策与 SDK 清单

9.2 Push 需求

Firebase Push 基于 Firebase Cloud Messaging 接入,需支持运营通知、系统通知、召回通知和后续贷后触达。

功能要求:

  1. 客户端需继承 FirebaseMessagingService,处理 onNewToken()onMessageReceived()
  2. FCM token 获取或刷新后必须上报后端,并同步调用 AppsFlyer updateServerUninstallToken(context, token)
  3. 后端需保存 FCM token 与 user_iddevice_idappsflyer_id、App 版本、语言、国家、通知授权状态的关系。
  4. 同一用户多设备、多 token 需保留有效 token 列表;发送失败或 token 失效时需支持后端清理。
  5. Push 消息需支持通知标题、正文、图片、业务类型、跳转目标、透传参数、过期时间和去重 ID。
  6. 前台收到 Push 时由客户端按产品规则展示站内提醒或系统通知;后台收到 Push 时由系统通知栏展示。
  7. Push 点击后需按 deep link 或业务参数打开指定页面;参数异常时回退到首页。
  8. Android 8.0 及以上需配置通知渠道,至少区分营销通知、系统通知、还款/账务通知。
  9. Android 13 及以上需按指定节点页面申请通知权限,并向后端同步授权结果。
  10. Push 内容不得包含身份证号、银行卡号、完整手机号、通讯录、精确地址等高敏感明文。

9.2.1 通知权限申请节点页面

Android 13 及以上系统需申请 POST_NOTIFICATIONS 运行时权限。本期通知权限申请不在 App 首次启动立即弹出,避免影响新用户首屏和注册转化;应在用户完成基础身份识别或进入强 Push 相关业务节点时触发。

UI 设计图:

Firebase Push 通知权限申请 UI 设计图

节点页面是否必须触发时机申请策略说明
登录成功后首页必须用户登录成功并进入首页后,且当前未授权通知权限;同一用户首次登录当天优先不弹窗,除非用户直接进入消息中心或关键业务节点可弹出业务说明弹窗,引导用户授权系统通知权限用于覆盖老用户、重装用户和已登录用户;避免新用户刚登录即被权限打断
提交额度申请成功页必须用户提交额度申请成功后,且未授权通知权限引导用户开启通知权限审核结果、补件、额度结果依赖 Push 触达
放款申请/提现提交成功页必须用户提交放款或提现申请成功后,且未授权通知权限引导用户开启通知权限放款成功、放款失败、银行卡异常等结果通知依赖 Push
还款结果页建议用户完成主动还款后,且未授权通知权限可引导开启通知权限用于还款结果、失败重试、后续账单提醒
消息中心页建议用户主动进入消息中心且未授权通知权限展示开启通知入口;用户点击后再展示业务说明弹窗或跳转系统设置作为用户主动开启通知的补充入口
我的/设置页建议用户进入设置或通知设置页面提供系统通知设置跳转用于用户拒绝后自行恢复权限

权限申请规则:

  1. 不在 App 首次启动、启动页、注册手机号输入页、验证码页、基础信息填写过程中主动弹出通知权限,避免影响首屏、注册和身份信息提交转化。
  2. 同一自然日内首页最多触发 1 次业务说明弹窗;同一用户 7 个自然日内最多触发 2 次主动弹窗。
  3. 各页面只在自身节点达成后判断是否展示权限说明弹窗,例如额度申请成功页只处理额度申请成功后的提示,放款/提现提交成功页只处理放款/提现提交后的提示;首页仅作为登录后老用户或重装用户的兜底入口,不集中补弹其他业务节点的提示。
  4. 客户端需记录本次会话是否已展示过强业务节点说明弹窗,以及最近展示时间、最近拒绝时间、授权状态;进入任一节点时先检查这些状态,命中频控或冷却规则则不弹窗,因此同一会话内即使用户连续经过多个节点,也只会出现一次主动提示。
  5. 用户点击业务说明弹窗的“开启通知”后,再调起系统权限弹窗;未点击“开启通知”时不得直接调起系统权限弹窗。
  6. 用户关闭业务说明弹窗但未触发系统权限弹窗时,记为 soft_dismissed,冷却 7 个自然日后才可在强业务节点再次主动提示。
  7. 用户拒绝系统权限后,不得阻断注册、申请、放款、还款等核心流程;拒绝后 30 个自然日内不再主动弹业务说明弹窗。
  8. 用户拒绝后需记录本地状态和后端状态,后续仅在消息中心、我的/设置页提供二次引导入口;用户主动点击入口不受 30 天冷却限制。
  9. 用户重新安装 App 后,以当前设备的通知授权状态和本地频控状态重新判断是否需要弹出;不得仅因重装就绕过拒绝后的冷却规则。
  10. 当客户端判断系统权限弹窗不会再展示时,不再重复调用权限申请;仅在用户主动点击消息中心或设置页的开启入口后,引导用户前往系统通知设置页。
  11. 消息中心和我的/设置页可提供固定的“开启通知”入口;是否展示只依赖当前通知授权状态,不要求根据审核、放款、还款等业务状态动态判断。
  12. Android 12 及以下无需运行时申请通知权限,但仍需记录系统通知开关状态(如可获取)。
  13. 后端需保存通知权限状态,用于判断 Push 可触达用户规模和发送策略。

建议的权限引导文案原则:

  1. 说明必须贴近现金贷业务结果通知,不使用“获得优惠”“重要福利”等泛营销理由作为主文案。
  2. 主文案建议覆盖审核结果、放款结果、还款提醒和异常处理,不承诺用户一定会提额或放款成功。
  3. 业务说明弹窗需提供“稍后再说”和“开启通知”两个操作;关闭或稍后不影响当前流程继续。
  4. 已拒绝系统权限后的二次引导文案应说明“可在系统设置中开启”,避免让用户误以为 App 内可直接恢复权限。

后端 token 建议保存字段:

字段说明
fcm_tokenFirebase Push token
user_id我司用户 ID,登录后必填
device_id我司设备 ID,如已有
appsflyer_idAppsFlyer UID,如已获取
app_versionApp 版本
package_nameAndroid 包名
country国家,例如 NG
languageApp 或系统语言
notification_permission通知权限状态
last_token_refresh_time最近一次 token 更新时间
last_push_open_time最近一次 Push 点击时间

9.3 Firebase 归因需求

Firebase 归因基于 Firebase Analytics(Google Analytics for Firebase)实现,用于补充 Firebase/GA4 侧的安装来源、营销活动、用户行为和漏斗分析。Firebase 归因不替代 AppsFlyer:付费媒体安装归因、AppsFlyer ID 关联、放款 ROI 和最终业务状态仍以 AppsFlyer 与我司后端为主口径。

接口与上报方式:

场景使用接口上报方说明
初始化 AnalyticsFirebaseAnalytics.getInstance(context)Android 客户端初始化 Firebase Analytics,建立 Firebase 安装实例和自动事件采集能力
获取并上报安装实例标识getAppInstanceId()Android 客户端 + 后端客户端获取 app_instance_id 后上报后端;后端使用该标识关联 Measurement Protocol 业务事件

后台事件上报要求:

  1. 正式上报地址:https://www.google-analytics.com/mp/collect
  2. 参数要求:请求 URL 必须包含 firebase_app_idapi_secret;请求体必须包含 app_instance_idevents
  3. events 中每个事件必须包含 name,业务参数放入 params;单次请求最多 25 个事件,请求体小于 130KB。
  4. app_instance_id 必须由 Android Firebase Analytics SDK 的 getAppInstanceId() 获取;不得使用 appsflyer_id、FCM token 或 Advertising ID 替代。
  5. api_secret 只能保存在后端,不得下发到 App;后端必须使用业务幂等键避免重复上报。
  6. 测试校验地址:https://www.google-analytics.com/debug/mp/collect。校验请求不会进入正式报表。
  7. Google 官方文档:

功能要求:

  1. Firebase Analytics SDK 自动记录安装、首次打开、会话和 App 更新事件;客户端不主动调用 logEvent() 上报现金贷业务事件。
  2. 后端必须通过 Measurement Protocol 上报以下 5 个业务事件:sign_upapplycredit_approvedfirst_loanloan
  3. 5 个业务事件必须按照“Firebase MVP 事件映射”表中的触发时机和参数上报;不得新增其他 Firebase 业务事件。
  4. 业务事件中的 application_idloan_order_id 和用户标识必须使用不可逆哈希或脱敏值;金额事件使用 valuecurrency,金额以我司后端最终财务口径为准。
  5. 业务事件使用后端业务幂等键去重;Firebase 上报失败最多重试 3 次,仍失败记录失败日志,不阻断核心业务。

Firebase MVP 事件映射:

业务事件Firebase 事件名触发方关键参数口径
安装/首次打开Firebase 自动事件Firebase SDKSDK 自动采集用于安装量和首次打开分析,不与 AppsFlyer 安装数强行相等
注册sign_up后端确认注册成功后methoduser_id_hash与 AppsFlyer af_complete_registration 表示同一业务结果
提交申请apply后端确认申请提交后application_id_hash仅表示申请提交,不表示授信通过
授信通过credit_approved后端确认最终结果后application_id_hash最终状态以后端为准
首贷成功first_loan后端确认首次放款成功后loan_order_id_hashvaluecurrency金额以后端财务口径为准
放款成功loan后端确认非首贷放款成功后loan_order_id_hashvaluecurrency金额以后端财务口径为准

Firebase MVP 归因字段必须保存:

字段来源说明
firebase_app_instance_idFirebase AnalyticsFirebase 安装实例标识,不作为永久用户 ID
firebase_sourceFirebase/深链/Install ReferrerFirebase 侧来源;缺失时保存为空,不自行推断
firebase_mediumFirebase/深链/Install ReferrerFirebase 侧媒介;缺失时保存为空
firebase_campaignFirebase/深链/Install ReferrerFirebase 侧活动名称;缺失时保存为空
firebase_first_open_timeFirebase首次打开时间

9.4 Crash 需求

Firebase Crash 基于 Firebase Crashlytics 接入,用于采集线上崩溃、非致命异常和版本质量数据。

功能要求:

  1. Release 包必须开启 Crashlytics 崩溃采集;Debug 包默认关闭或进入独立测试项目。
  2. 崩溃日志需包含 App 版本、build number、Android 版本、设备型号、线程、堆栈和崩溃时间。
  3. 客户端可设置低敏用户标识,例如 user_id_hash;不得上传手机号、身份证号、银行卡号等明文敏感信息。
  4. 关键业务异常可使用 non-fatal exception 上报,例如 Push 解析失败、关键页面初始化失败、SDK 初始化异常。
  5. 关键状态可通过 custom keys 上报,例如 appsflyer_id_existlogin_statuscountryapp_channel,但不得包含高敏感信息。
  6. Native 崩溃、混淆映射文件、R8/ProGuard mapping 上传需按项目技术栈确认并纳入构建流程。
  7. Crashlytics 数据需按版本维度用于发布质量评估;严重崩溃需支持回溯到版本、设备和页面路径。

建议上报的 custom keys:

Key示例说明
login_statusguest / login用户登录状态
countryNG当前业务国家
app_channelgoogle_play安装渠道或包渠道
appsflyer_id_existtrue / false是否已获取 AppsFlyer UID
push_permissiongranted / denied通知权限状态

10. 测试与验收

研发和 QA 测试前需先阅读飞书接入指南文件,用于理解测试设备加白、归因链接、事件验证和排查流程:https://lianlian-tech.feishu.cn/file/UiHobClfJoJOQBxsfZBcjVfdngc

10.1 测试设备白名单

Android 测试前必须在 AppsFlyer 后台添加测试设备:

  1. 使用 AppsFlyer Device ID App 或系统方式获取 GAID。
  2. 在 AppsFlyer 后台添加测试设备,Device Type 选择 AID
  3. 测试前卸载待测 App。
  4. 使用带 advertising_id={GAID} 的测试归因链接或 AppsFlyer SDK 对接测试功能进行验证。

10.2 测试场景

场景前置条件操作预期结果
SDK 初始化Debug 包开启 AppsFlyer debug log首次安装并打开 AppLogcat 可看到 AppsFlyer 初始化、launch 请求和返回
非自然安装归因测试设备 GAID 已加白卸载 App,点击测试归因链接,安装并首次打开15-30 分钟内 AppsFlyer 后台可看到 Non-organic install
AppsFlyer UID 关联SDK 初始化成功打开 App、注册、提交额度申请后端可查询到 appsflyer_iduser_idapplication_id 的关联
Android SDK 事件设备已加白触发注册、提交额度申请Live Events 可看到 af_complete_registrationapply;参数不包含敏感明文
后端 S2S 事件后端已保存 appsflyer_id触发授信通过、首贷、借贷AppsFlyer 可收到 approvedfirst_loanloan,且后端幂等不重复上报
放款金额事件后端放款成功触发 first_loanloan首贷传 af_revenue=first_loan_value,普通放款传 af_revenue=loan_valueaf_currency=NGN
重复放款防重同一 loan_order_id 重放消息或重复回调重复触发放款成功逻辑AppsFlyer 只产生一条有效放款事件
离线缓存测试机断网断网触发 Android SDK 事件,恢复网络网络恢复后事件补发;关键金额事件仍以后端为准
卸载统计FCM token 已上传给 AppsFlyer打开 App 后卸载24-48 小时内 AppsFlyer 后台出现卸载数据
Firebase 初始化App 已集成 google-services.json安装并启动 AppFirebase 初始化成功,无配置缺失或包名不匹配错误
Firebase Analytics 归因Firebase Analytics 已接入,测试来源参数已准备通过 Google Play 测试安装或带 UTM/深链参数打开 AppFirebase/GA4 可看到首次打开、来源、媒介、活动及时间;非法参数不阻断启动
Firebase 核心事件Analytics 已开启且用户已同意分析采集触发注册、申请、授信、首贷、放款Firebase/GA4 可看到对应事件和低敏参数;事件语义与 AppsFlyer 对齐
Firebase 归因边界AppsFlyer 与 Firebase 均已接入对比同一测试安装和业务事件AppsFlyer 作为付费投放主归因,Firebase 作为补充分析;两者字段不互相覆盖
FCM token 获取网络正常首次启动或清除数据后打开 App客户端可获取 FCM token,后端可查询 token 记录
FCM token 刷新触发 token 更新重新打开 App 或模拟刷新新 token 上报后端,并同步给 AppsFlyer 用于卸载统计
Android 13 通知权限Android 13 及以上设备在提交额度申请成功页、放款申请/提现提交成功页、登录成功后首页、还款结果页触发授权流程用户授权结果被客户端记录并同步后端,拒绝后不阻断核心流程
通知权限频次控制Android 13 及以上设备,用户未授权通知权限同一自然日和 7 日周期内多次进入触发节点同一自然日最多 1 次业务说明弹窗,同一用户 7 个自然日内最多 2 次主动弹窗;同一会话不重复弹出
通知权限拒绝冷却Android 13 及以上设备,用户拒绝系统通知权限30 个自然日内再次进入触发节点不再主动弹出业务说明弹窗,仅在消息中心页或我的/设置页保留用户主动开启入口
通知权限二次引导Android 13 及以上设备,用户已拒绝通知权限进入消息中心页或我的/设置页,并主动点击开启入口展示开启通知说明或跳转系统通知设置页;不阻断当前页面使用
前台 PushApp 在前台后台发送测试 Push客户端按产品规则展示站内提醒或系统通知
后台 PushApp 在后台后台发送测试 Push系统通知栏展示标题、正文,点击后进入目标页面
Push 跳转Push 携带业务参数点击通知正确打开业务页面;参数异常时回退首页
Push 内容合规测试不同消息模板查看通知栏和日志不展示或记录高敏感明文
Crash 采集Release 或测试 Crash 项目开启采集触发测试崩溃Firebase Crashlytics 后台可看到崩溃记录、版本和堆栈
Non-fatal 上报客户端触发可恢复异常上报 non-fatal exceptionCrashlytics 后台可看到非致命异常记录
Mapping 上传Release 开启混淆构建并触发崩溃Crashlytics 后台堆栈可读,不出现大面积混淆不可定位问题
数仓回流(P2)AppsFlyer 数据回流任务已配置后续 P2 阶段验证,本期不阻塞上线数仓可查询安装、事件、归因、放款金额数据

10.3 验收标准

验收项标准
SDK 初始化首次启动 Logcat 可看到 AppsFlyer 初始化和 launch 请求
非自然安装白名单测试设备通过测试链接安装后,AppsFlyer 后台可看到 Non-organic install
AppsFlyer UID客户端可获取 appsFlyerId,后端可查询到与用户/订单的关联
注册事件注册成功后 AppsFlyer Live Events 可看到 af_complete_registration
申请事件提交额度申请后 AppsFlyer Live Events 可看到 apply
授信事件额度申请通过后 AppsFlyer 可看到后端 S2S 上报的 approved
放款事件放款成功后可看到 first_loanloan,金额和币种字段符合口径
金额字段仅放款成功相关事件包含 af_revenueaf_revenue 为数字,af_currency=NGN
卸载统计卸载测试后 24-48 小时内后台出现卸载数据
Firebase Push客户端可获取 FCM token,后端可发送 Push,通知点击可按参数跳转
Firebase 归因Firebase/GA4 可记录首次打开、来源、媒介、活动和核心漏斗事件;归因字段与 AppsFlyer 分开保存,AppsFlyer 仍为付费投放主口径
通知权限申请Android 13 及以上按指定节点页面触发通知权限申请;满足单日、7 日、拒绝后 30 日冷却和同一会话不重复弹出规则;拒绝后不阻断核心流程,并支持消息中心页或我的/设置页二次引导
Firebase CrashCrashlytics 可采集 Release 崩溃和 non-fatal,堆栈可定位到业务代码
数仓回流(P2)后续 P2 阶段验收,本期不作为上线准入标准
Release 安全Release 包未开启 debug log,未上报敏感个人信息

11. 数据回流数仓需求(P2)

优先级:P2。本能力不作为本期 AppsFlyer SDK 接入上线阻塞项,可在后续阶段补充,用于渠道 ROI、漏斗转化、放款金额、卸载率和用户质量分析。

11.1 回流范围

数据P2 范围说明
安装归因数据建议纳入包含 install、media source、campaign、adset、ad、国家、设备标识、appsflyer_id
Firebase 归因数据必须纳入包含 Firebase 首次打开、来源、媒介、活动、App 实例和五个 MVP 业务事件;与 AppsFlyer 字段分开保存
应用内事件数据建议纳入包含注册、提交申请、授信通过、首贷、借贷等事件
放款金额数据建议纳入first_loanloanaf_revenueaf_currency=NGN
卸载数据建议纳入用于渠道质量和召回分析
原始回调或 Data Locker待技术选型根据 AppsFlyer 套餐和权限选择 Pull API、Push API 或 Data Locker

11.2 数仓关联键

关联键来源用途
appsflyer_idAndroid SDK / AppsFlyer 原始数据连接归因安装与事件
firebase_app_instance_idFirebase Analytics连接 Firebase 安装实例与事件,不作为永久用户 ID
user_id_hash我司后端连接用户维度,禁止使用明文手机号或证件号
application_id我司后端连接额度申请和授信链路
loan_order_id我司后端连接首贷和借贷放款链路
gaid设备侧,合规允许时采集辅助排查测试和归因匹配

11.3 时效要求

数据链路时效要求
AppsFlyer 面板联调近实时到 60 分钟内验证
数仓日常报表T+1 可用
放款 ROI 分析放款事件进入数仓后可按渠道、广告系列、日期聚合

12. 分工

角色职责
产品/运营确认事件清单、金额口径、币种、投放渠道、AppsFlyer 后台配置、Push 场景和消息模板
Android 研发SDK 接入、初始化、AppsFlyer/Firebase 事件埋点、Firebase 归因参数解析、FCM Push、FCM 卸载统计、Crashlytics、测试日志
后端研发接收并存储 appsflyer_idfcm_token,完成后端 S2S 事件上报、Push 发送和幂等控制
数据/BI定义 AppsFlyer 主归因口径、Firebase 补充归因口径、事件看板、渠道分析报表、Push 触达和打开数据分析;P2 阶段补充数仓回流表结构
QA白名单设备测试、安装归因测试、SDK 事件测试、S2S 事件测试、金额测试、卸载测试、Push 测试、Crash 测试;P2 阶段补充数仓验收
合规隐私政策、SDK 清单、广告 ID、设备标识、Push token 和崩溃日志采集说明

13. 评审待确认问题

  1. AppsFlyer SDK 版本最终采用 7.0.0 还是 6.18.1
  2. 后端是否已有匿名设备 ID;如有,需和 appsflyer_id 建立多对多历史关系。
  3. P2 阶段确认 AppsFlyer 数据回流采用 Pull API、Push API 还是 Data Locker,需由数据/后端根据套餐权限确认。
  4. Firebase 是否按开发、测试、生产拆分项目或 App 配置。
  5. Push 发送由现有后端系统承接,还是需要新增消息平台/运营后台。
  6. Android 13 通知权限申请节点页面的最终 UI、业务说明弹窗文案和消息中心/设置页入口样式需由产品确认;触发频次、冷却和拒绝后处理按 9.2.1 执行。
  7. Crashlytics Debug、Staging、Release 数据是否进入同一个 Firebase 项目,是否需要环境隔离。
  8. Firebase 归因是否需要关联 Google Ads;如需关联,需确认 Google Ads 账号、Firebase 项目、转化事件和归因窗口配置。

14. 已确认结论

结论
投放国家尼日利亚
默认币种奈拉,NGN
金额上报口径只在放款成功相关事件上报 af_revenue
af_revenue 含义放款本金金额;首贷为 first_loan_value,普通放款为 loan_value
数据回流P2 后续考虑,不作为本期上线阻塞项
Firebase 能力本期需支持 Analytics 归因、Push 和 Crash
Push 基础方案使用 Firebase Cloud Messaging
Firebase 归因基础方案使用 Firebase Analytics/GA4 作为 AppsFlyer 的补充分析口径
Crash 基础方案使用 Firebase Crashlytics

15. 参考资料

  1. AppsFlyer Android SDK 文档:https://dev.appsflyer.com/hc/docs/android-sdk
  2. Install SDK:https://dev.appsflyer.com/hc/docs/install-android-sdk
  3. Integrate SDK:https://dev.appsflyer.com/hc/docs/integrate-android-sdk
  4. In-app events:https://dev.appsflyer.com/hc/docs/in-app-events-android
  5. Uninstall measurement:https://dev.appsflyer.com/hc/docs/uninstall-measurement-android
  6. AppsFlyerLib / getAppsFlyerUID:https://dev.appsflyer.com/hc/docs/android-sdk-reference-appsflyerlib
  7. 飞书接入指南文件:https://lianlian-tech.feishu.cn/file/UiHobClfJoJOQBxsfZBcjVfdngc
  8. Firebase Cloud Messaging 文档:https://firebase.google.com/docs/cloud-messaging/android/client
  9. Firebase Analytics 文档:https://firebase.google.com/docs/analytics
  10. Firebase Crashlytics 文档:https://firebase.google.com/docs/crashlytics/get-started?platform=android