Appy
← 返回博客
指南

在 Android 上解密 Meta Install Referrer

Facebook 和 Instagram 能告诉你的应用,一次安装来自哪个广告系列、广告组和广告,浏览归因也包括在内。数据用只有你持有的密钥加密。

2026年10月15日•阅读约 4 分钟

Google Play Install Referrer 只带同一会话内完成安装的 Meta 广告点击。其余的由 Meta Install Referrer 补上:Facebook、Instagram 和 Facebook Lite 应用会记下用户看过或点过的广告,再交给你的应用。

Play Install Referrer

  • 同一会话内的点击
  • 加密的 Meta 数据
  • 也带 Google Ads 点击

Meta Install Referrer

  • 点击、浏览和更早的会话
  • 加密方式相同,密钥相同
  • 区分点击还是浏览

开始之前

01

一个 Android 应用安装广告系列

投放在 Facebook、Instagram 或 Audience Network 上。

02

你的 Facebook App ID

广告实际使用的那个。

03

解密密钥

Meta for Developers › App settings › Basic › Android。需要管理员权限。

1. 首次启动时读取

AndroidManifest.xml

<queries>
    <package android:name="com.facebook.katana" />
    <package android:name="com.instagram.android" />
    <package android:name="com.facebook.lite" />
</queries>

Kotlin

val providers = listOf(
    "com.facebook.katana.provider.InstallReferrerProvider",
    "com.instagram.contentprovider.InstallReferrerProvider",
    "com.facebook.lite.provider.InstallReferrerProvider",
)

fun readMetaReferrer(context: Context, facebookAppId: String): String? {
    for (authority in providers) {
        val uri = Uri.parse("content://$authority/$facebookAppId")
        runCatching { context.contentResolver.query(uri, null, null, null, null) }
            .getOrNull()?.use { cursor ->
                if (cursor.moveToFirst()) {
                    return cursor.getString(cursor.getColumnIndexOrThrow("install_referrer"))
                }
            }
    }
    return null
}
没有 queries 声明,Android 11 及以上版本什么也返回不了。

2. 在服务器上解密

绝不要把密钥打包进应用,谁解包 APK 都能读到。

Node.js

import crypto from 'node:crypto';

export function decryptMetaReferrer(installReferrer, keyHex) {
  const {utm_content} = JSON.parse(installReferrer);
  const {source} = typeof utm_content === 'string' ? JSON.parse(utm_content) : utm_content;
  const sealed = Buffer.from(source.data, 'hex');
  const decipher = crypto.createDecipheriv('aes-256-gcm', Buffer.from(keyHex, 'hex'), Buffer.from(source.nonce, 'hex'));
  decipher.setAuthTag(sealed.subarray(-16));
  return JSON.parse(Buffer.concat([decipher.update(sealed.subarray(0, -16)), decipher.final()]).toString());
}
AES-256-GCM,data 和 nonce 为十六进制,16 字节 tag 在末尾,密钥 64 个字符。

字段名整体错开了一级

campaign_groupcampaignadgroup

  1. campaign_group

    广告系列

    广告管理工具里的“广告系列”。

  2. campaign

    广告组

    不是广告系列。

  3. adgroup

    广告

    用户看到的那条创意。

Adjust 和 AppsFlyer 也是这样对应的。

返回为空的时候

manifest 里没有 queries
结果空结果
解决办法加上三个包名
App ID 用错了
结果空结果
解决办法用广告的 App ID
密钥不是 64 个字符
结果全部解不开
解决办法重新复制
手机上的 Meta 应用太旧
结果没有 provider
解决办法Facebook 428、Instagram 296+
仅限 Android。Meta 在 iOS 上不提供单次安装的 referrer。

用 Appy,粘贴一次密钥就行

在 Enterprise 套餐中,你在后台添加密钥,在 SDK 里设置 App ID。解密在 Appy 的服务器上完成。

首次启动

Android,Appy SDK

  • 点了你的 Appy 链接归到该链接
  • Meta 广告,点击或浏览广告系列、广告组、广告
  • Google Ads 点击归到 Google Ads
  • 以上都不是自然量
密钥加密存储,保存后不再显示。

延伸阅读

常见问题

解密密钥在哪里?

Meta for Developers 中,App settings › Basic 的 Android 部分。

Meta 用的是什么加密方式?

AES-256-GCM,密钥为 64 个十六进制字符。

包含浏览归因的安装吗?

包含。is_ct 为 0 表示浏览,为 1 表示点击。

campaign_name 就是广告系列吗?

不是,它是广告组。广告系列是 campaign_group_name。

继续探索

指南
2026年8月14日
11 分钟阅读

不用 SDK 的延迟深度链接:底层到底是怎么运作的

不嵌入归因 SDK,也能把链接意图带过应用安装这道坎。本文讲清 Android 和 iOS 上什么能真正穿过商店边界、什么会断掉,以及每种变通方案的隐私代价。

deferred deep linking
install referrer
ios
android
阅读文章
产品
2026年10月1日
8 分钟阅读

看清每次安装来自哪条链接:Appy 的 iOS 与 Android SDK

Appy 的链接现在能跟到应用商店之后。新的 SDK 为每条链接、每个二维码、每个营销活动统计安装、应用内事件和收入,还让新用户第一次打开就进入对的页面。

install attribution
deferred deep linking
install referrer
mobile attribution
阅读文章
指南
2026年10月1日
7 分钟阅读

Chrome 让每部手机都自称 Android 10

Android 上的 Chrome 把每部手机都报成 Android 10、型号 K。这给延迟深度链接的匹配带来了什么问题,为什么 Critical-CH 会把每次点击算两遍,以及 Client Hints 如何找回真实的版本和型号。

android
user agent
client hints
deferred deep linking
阅读文章

想看更多内容?浏览 博客全部主题.

把 Meta 安装和每条链接、每个二维码放在一起看

粘贴一次密钥,Appy 就会把 Facebook 和 Instagram 带来的安装归到具体的广告系列、广告组和广告。