唯一标识符最佳做法

本文档将指导您为自己的客户选择适当的标识符, 确定应用场景。

要大致了解 Android 权限,请参阅权限 概览。有关使用 Android 权限的具体最佳实践,请参阅应用权限最佳实践

使用 Android 标识符的最佳做法

为了保护用户的隐私,请使用符合您应用场景且限制性最强的标识符。具体而言,请遵循以下最佳实践:

  1. 尽可能选择用户可重置的标识符。即使应用使用的是不可重置的硬件 ID 以外的标识符,也能实现大多数用例。
  2. 避免使用硬件标识符在大多数用例中,您可以避免使用硬件标识符(例如国际移动设备识别码 [IMEI]),而不会限制所需的功能。

    Android 10(API 级别 29)增加了针对不可重置的标识符、 其中包括 IMEI 和序列号。您的应用必须是设备或 个人资料所有者 应用, 有特殊的运营商 权限,或者 必须具备 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问 这些标识符

  3. 只针对用户剖析或广告用例使用广告 ID在使用广告 ID 时,请始终遵循用户关于广告跟踪的选择。如果您必须将广告标识符与个人身份信息相关联,则只能在征得用户明确同意的情况下执行此操作。

  4. 请勿对广告 ID 重置进行桥接。

  5. 每次使用时都使用 Firebase 安装 ID (FID) 或私密存储的 GUID 除了支付欺诈和 电话。对于绝大多数非广告用例,FID 或 GUID 应该就足够了

  6. 使用适合您的用例的 API 以尽量降低隐私权风险。使用 DRM API 保护重要内容,并使用 Play Integrity API 防止滥用行为。Play Integrity API 是确定设备是否遭到 真实可靠,而不会招致隐私风险。

本指南其余部分将以 开发 Android 应用

使用广告 ID

广告 ID 是一种可由用户重置的标识符,适用于广告用例。但是,在使用此 ID 时,请注意以下要点:

在重置广告 ID 时始终尊重用户的意图。 不要通过使用其他标识符或指纹进行链接来桥接用户重置 将后续广告 ID 放在一起,而不将 获得用户同意。Google Play 开发者内容政策声明如下:

“...如果重置,新的广告标识符不得连接到 先前的广告标识符或源自先前广告的数据 标识符。”

始终尊重关联的个性化广告标记广告 ID 是可配置的,用户可以限制与 ID 关联的跟踪数量。始终使用AdvertisingIdClient.Info.isLimitAdTrackingEnabled() 方法,以确保您不会规避用户愿望。Google Play 开发者内容政策声明如下:

“...您还必须遵循用户的‘选择停用针对用户兴趣投放广告’”选项,或 “选择停用广告个性化功能”设置。如果用户已启用此设置,您不得出于广告目的使用该广告标识符创建用户画像,也不得使用该广告标识符向用户投放个性化广告。允许的活动包括:内容相关广告定位、频次上限、转化跟踪、生成报表以及安全性和欺诈检测。”

注意与您使用的 SDK 有关、涉及广告 ID 用途的任何隐私权或安全性政策。 例如,如果您将 true 传递到 Google Analytics SDK 中的 enableAdvertisingIdCollection() 方法,请务必查看和遵守所有适用的 Google Analytics SDK 政策

此外,还要注意,Google Play 开发者内容政策要求广告 ID“不得与个人身份信息或任何永久性设备标识符(例如:SSAID、MAC 地址、IMEI 等)相关联。”

举例来说,假设您想要收集信息来填充包含以下列的数据库表:

TABLE-01
timestamp ad_id account_id clickid
TABLE-02
account_id name dob country

在本例中,ad_id 列可通过两个表中都存在的 account_id 列与 PII 关联,如果您未获得用户的明确许可,则会违反 Google Play 开发者内容政策

请注意,广告客户 ID 和 PII 之间的关联并非始终是这样 明确。PII 和广告 ID 键控表中可能都存在一些“准标识符”,它们也会引发问题。例如,假设我们对 TABLE-01 和 TABLE-02 做如下更改:

TABLE-01
timestamp ad_id clickid dev_model
TABLE-02
timestamp demo account_id dev_model name

在这种情况下,如果点击事件足够罕见,仍可将 使用 事件的时间戳和设备型号。

尽管通常难以保证数据集内不存在此类准标识符,但您可以通过尽可能泛化唯一数据来预防最明显的关联风险。在前面的示例中,这意味着需要降低时间戳的准确性,让每个时间戳都对应多台同型号的设备。

其他解决方案包括:

  • 设计表时不在 PII 与广告 ID 之间建立明确关联在上面的第一个示例中,这意味着 TABLE-01 中不包含 account_id 列。

  • 对于同时拥有广告 ID 键控数据和 PII 访问权限的用户或角色,隔离并监控其访问控制列表。 通过严格控制和审核对两个来源的访问能力 (例如,通过在表之间执行联接),可以减少 广告 ID 与个人身份信息之间的关联风险。一般来说 控制访问权限意味着执行以下操作:

    1. 保留针对广告客户 ID 键控数据和个人身份信息的访问控制列表 (ACL) 尽量减少同时担任两个职务的个体或角色的个数, ACL。
    2. 实现访问日志记录和审核,以检测和管理此规则的任何例外情况。

如需详细了解如何以负责任的方式使用广告 ID,请参阅 AdvertisingIdClient API 参考文档。

使用 FID 和 GUID

识别在 使用 Firebase 安装 ID (FID),建议使用 解决方案。只有 其已配置后可以访问此标识符,并且(相对) 可重置,因为它只在应用安装期间持续存在。

因此,相较于 设备级范围的不可重置硬件 ID。如需了解详情,请参阅 firebase.installations API 参考文档。

如果 FID 不可行,您还可以使用自定义 全局唯一 ID (GUID),用于对应用实例进行唯一标识。最简单的方式是使用以下代码生成您自己的 GUID。

Kotlin

var uniqueID = UUID.randomUUID().toString()

Java

String uniqueID = UUID.randomUUID().toString();

由于标识符具有全局唯一性,因此可用于识别特定的 应用实例。为了避免与跨应用关联标识符有关的问题, 将 GUID 存储在内部存储空间而非外部(共享)存储空间中。有关 请参阅数据和文件存储 概览页面。

不要使用 MAC 地址

MAC 地址具有全局唯一性,无法由用户重置,并且在出厂后仍然有效 重置。出于这些原因,为了保护用户隐私,在 Android 版本 6 和 则只有系统应用才能访问 MAC 地址。第三方应用 无法访问这些内容

Android 11 中的 MAC 地址可用性变更

在以 Android 11 及更高版本为目标平台的应用中,Passpoint 网络的 MAC 地址随机分配是基于每个 Passpoint 配置文件进行的,系统会根据以下字段生成唯一的 MAC 地址:

  • 完全限定域名 (FQDN)
  • 大区
  • 凭据,基于 Passpoint 配置文件中使用的凭据:
    • 用户凭据:用户名
    • 证书凭据:证书和证书类型
    • SIM 卡凭据:EAP 类型和 IMSI

此外,非特权应用无法访问设备的 MAC 地址;只有具有 IP 地址的网络接口可见。这会影响 getifaddrs()NetworkInterface.getHardwareAddress() 方法,以及发送 RTM_GETLINK Netlink 消息。

下面列出了此变更会以哪些方式影响应用:

  • NetworkInterface.getHardwareAddress() 会针对每个接口返回 null。
  • 应用无法对 NETLINK_ROUTE 套接字使用 bind() 函数。
  • ip 命令不会返回有关接口的信息。
  • 应用无法发送 RTM_GETLINK 消息。

请注意,大多数开发者应使用 ConnectivityManager(而非 较低级别的 API NetworkInterface, getifaddrs(), 或 Netlink 套接字例如,如果某个应用需要获取有关当前路线的最新信息,则可以使用 ConnectivityManager.registerNetworkCallback() 监听网络变化并调用网络的关联 LinkProperties.getRoutes() 来获取此类信息。

标识符特性

Android 操作系统提供了多种具有不同行为特性的 ID。您应使用何种 ID 取决于以下特征的搭配方式 您的用例。然而,这些特性还涉及到隐私权,因此您必须要了解这些特性彼此之间是如何互动的。

范围

标识符作用域说明了哪些系统可以访问标识符。Android 设备 标识符的作用域一般分为三种:

  • 单一应用 - ID 仅限应用内部使用,其他应用无法访问。
  • 一组应用 - ID 可供一组预先定义的相关应用访问。
  • 设备 - ID 可供安装在设备上的所有应用访问。

向标识符授予的作用域越大,其出现的风险就越大 用于跟踪目的。相反,如果标识符只能由单一应用实例访问,就无法用于跨不同应用的事务跟踪设备。

重置性与持久性

重置性和持久性定义了标识符的生命周期并说明了如何对其进行重置。常见的重置触发器包括:应用内重置、通过 系统设置,会在启动时重置,以及在安装时重置。Android 设备 标识符可能具有不同的有效期,但有效期通常与 ID 的重置方式:

  • 仅限会话期间 - 每次用户重新启动应用时都使用新的 ID。
  • 安装重置 - 每次用户卸载并重新安装应用时都使用新的 ID。
  • FDR 重置 - 每次用户恢复设备出厂设置时都使用新的 ID。
  • FDR 持久性 - ID 在恢复出厂设置后保持不变。

重置性让用户能够创建与任何现有个人资料信息无关的新 ID。标识符持久存在得越久、越可靠(例如在恢复出厂设置后继续存在的标识符),用户被长期跟踪的风险就越高。如果 标识符会在应用重新安装时重置,这会减少持久性和 提供了重置 ID 的方式,即使用户 控件,以便在应用或系统设置中对其进行重置。

唯一性

唯一性可确定发生冲突的可能性;也就是说 标识符在关联范围内存在。从最高层面来看,全球范围内 唯一标识符始终不会发生冲突,即使在其他设备或应用中也不例外。 唯一性级别取决于标识符的熵和用来创建标识符的随机性来源。例如,带有安装日期(例如 2019-03-01)的随机标识符的冲突几率要比带有 Unix 安装时间戳(例如 1551414181)的标识符高得多。

一般而言,您可以将用户账号标识符视为具有唯一性。也就是说,每个 具有唯一 ID。另一方面, 如果某个标识符属于某个群体,那么隐私保护措施就会越强, 那么跟踪单个用户就没那么实用了

完整性保护和不可否认性

您可以使用难以仿冒或重播的标识符证明关联的设备或账号具有某些属性。例如,你可以 证明设备不是被垃圾内容发布者使用的虚拟设备。 难以仿冒的标识符还能提供不可否认性。如果设备 使用密钥为邮件签名,也很难说别人的 设备发送了这条消息。不可否认性可能是用户想要的,例如 或不希望的财产 会感到后悔

常见用例和适用的标识符

此部分为使用 IMEI 等硬件 ID 提供了替代方案。使用 不建议使用硬件 ID,因为用户无法重置它们, 将范围限定为设备。在许多情况下,作用范围仅限于应用的标识符足以满足您的需求。

账号

运营商状态

在此情况下,您的应用要使用运营商账号与设备的电话和短信功能进行交互。

推荐使用的标识符:IMEI、IMSI 和 Line1

为什么这样建议?

如果需要,可以使用硬件标识符 运营商相关功能。例如,您可以使用这些标识符 切换手机运营商或 SIM 卡插槽,或通过 IP(适用于 Line1)- 基于 SIM 卡的用户账号。不过,对于非特权应用,我们建议您使用账号登录在服务器端检索用户设备信息。这样做的其中一个原因是,在 Android 6.0(API 级别 23)及更高版本中,这些标识符只能通过运行时权限来使用。用户可能会关闭此权限,因此您的应用应妥善处理这些异常。

移动设备订阅状态

在这种情况下,您需要将应用功能与设备上的某些移动服务订阅相关联。例如,您可能有以下要求 根据设备的移动设备验证对某些高级应用功能的访问权限 订阅(通过 SIM 卡)。

建议使用的标识符订阅 ID API 识别设备上使用的 SIM 卡。

订阅 ID 提供了一个索引值(从 1 开始),作为唯一 识别 设备。通过此 ID,您的应用可以将其功能与给定 SIM 卡的各种订阅信息相关联。此值对于给定 SIM 卡而言是稳定的 除非设备恢复出厂设置不过,在某些情况下,同一 SIM 卡在不同设备上可能具有不同的订阅 ID,或者不同 SIM 卡在不同设备上具有相同的 ID。

为什么这样建议?

某些应用目前可能出于此目的使用 ICC ID。由于 ICCID 是全局唯一且不可重置的,因此自 Android 10 起,只有具有 READ_PRIVILEGED_PHONE_STATE 权限的应用才能访问 ICCID。从 Android 11 开始,Android 进一步 通过 getIccId() API(无论应用的目标 API 级别如何)。受影响的应用应迁移到 请改用订阅 ID。

单点登录

在这种情况下,您的应用会提供单点登录体验,让用户能够 将现有账号与您的组织相关联。

建议使用的标识符:与客户经理账号兼容的账号,例如 Google 账号关联

为什么这样建议?

借助 Google 账号关联功能,用户可以将其现有的 Google 账号与您的应用相关联,从而更安全地顺畅访问贵组织的产品和服务。此外,您还可以 定义自定义 OAuth 范围 仅分享必要的数据,并通过明确定义 使用其数据。

广告

Targeting

在这种情况下,您的应用会根据用户的兴趣构建个人资料,以便向用户展示更相关的广告。

建议使用的标识符:如果您的应用使用 ID 投放广告,并且上传或发布到 Google Play,则该 ID 必须是广告 ID。

为什么这样建议?

这是一种与广告有关的用例,需要使用在贵组织的不同应用中均可用的 ID,因此使用广告 ID 是最合适的解决方案。按照 Google Play 开发者内容政策,在广告用例中使用广告 ID 是强制性要求,因为用户可以对其进行重置。

无论您是在应用中分享用户数据,如果您收集和使用这些数据 您需要在 “数据安全”部分 (位于 Play 管理中心内的应用内容页面上)。

测量

在这种情况下,您的应用会根据用户的行为创建个人资料 同一设备上的所有应用。

建议使用的标识符:广告 ID 或 Play 安装引荐来源网址 API

为什么这样建议?

这是一个与广告相关的用例,可能需要可用的 ID 组织的不同应用,因此使用广告 ID 最合适的解决方案。如果您要将某个 ID 用于广告用例,则该 ID 必须是广告 ID,因为用户可以对其进行重置。如需了解详情,请参阅 Google Play 开发者内容政策

转化次数

在本例中,您需要通过跟踪转化情况来判断您的营销策略是否 会成功。

建议使用的标识符:广告 ID 或 Play 安装引荐来源网址 API

为什么这样建议?

这是一种与广告有关的用例,需要使用在贵组织的不同应用中均可用的 ID,因此使用广告 ID 是最合适的解决方案。对于以下情况,则必须使用广告 ID: 根据 Google Play 开发者内容政策, 因为用户可以重置

再营销

在这种情况下,您的应用会根据用户之前的兴趣展示广告

推荐使用的标识符:广告 ID

为什么这样建议?

这是一个与广告相关的用例,可能需要可用的 ID 组织的不同应用,因此使用广告 ID 最合适的解决方案。对于以下情况,则必须使用广告 ID: 根据 Google Play 开发者内容政策, 因为用户可以重置

应用分析工具

在这种情况下,您的应用会评估用户的行为,以帮助您确定以下事项:

  • 贵组织的哪些其他产品或应用可能适合 用户。
  • 如何持续吸引用户使用您的应用。
  • 衡量已注销或匿名用户的使用情况统计信息和分析数据。

可能的解决方法包括:

  • 应用组 ID:通过应用组 ID,您可以分析用户在 贵组织拥有的多款应用,前提是您不使用用户数据 。如果您定位的是搭载 Google Play 服务的设备,建议您使用应用集 ID。
  • Firebase ID (FID):FID 的范围限定为创建它的应用, 可防止标识符被用来跨应用跟踪用户。它还 可轻松重置,因为用户可以清除应用数据或重新安装应用。通过 创建 FID 的流程非常简单:查看 Firebase 安装 指南。

应用开发

崩溃报告

在这种情况下,您的应用会收集有关其在用户设备上崩溃的时间和原因的数据。

建议使用的标识符:FID 或应用组 ID

为什么这样建议?

FID 的作用范围为创建它的应用,这样可以防止他人利用该标识符跟踪用户在不同应用中的行为。此外,此标识符还可以轻松地进行重置,因为用户可以清除应用数据或重新安装应用。创建 FID 的过程简单明了;请参阅 Firebase 安装指南。借助应用集 ID,您可以分析用户在贵组织拥有的多个应用中的行为,前提是您不会将用户数据用于广告用途。

效果报告

在这种情况下,您的应用会收集性能指标(例如加载时间和电池用量),以帮助提升应用质量。

建议使用的标识符:Firebase Performance Monitoring

为什么这样建议?

Firebase Performance Monitoring 可帮助您关注最重要的指标 并测试近期一项更改对应用的影响。

应用测试

在这种情况下,您的应用会评估用户使用该应用的体验,以进行测试 或调试目的。

建议使用的标识符:FID 或应用组 ID

为什么这样建议?

FID 的作用域限定为创建它的应用,这样可以防止标识符 来跨应用跟踪用户此外,此标识符还可以轻松地进行重置,因为用户可以清除应用数据或重新安装应用。创建 FID 的过程简单明了;请参阅 Firebase 安装指南。借助应用组 ID,您可以分析用户在多个应用上的行为, 只要您不将用户数据用于广告用途 目的。

跨设备安装

在这种情况下,当发生以下情况时,您的应用需要识别正确的应用实例: 同一用户的多部设备上会安装该应用。

建议使用的标识符:FID 或 GUID

为什么这样建议?

FID 明确针对这一用途而设计;其作用域被限定在应用范围,这样就无法被用于跟踪用户在不同应用中的行为,并且在应用重新安装后会重置。在极少数情况下, 也可以使用 GUID。

安全

滥用行为检测

在此情况下,您希望发现多台正在攻击 后端服务

建议使用的标识符:Google Play Integrity API 完整性令牌

为什么这样建议?

为了验证请求是否来自真实的 Android 设备,而不是来自 或假冒其他设备的其他代码,请使用 Google Play Integrity API

广告欺诈

在这种情况下,您的应用会检查用户在应用中的展示和操作 真实可验证。

推荐使用的标识符:广告 ID

为什么这样建议?

按照 Google Play 开发者内容政策,在广告用例中使用广告 ID 是强制性要求,因为用户可以对其进行重置。

数字版权管理 (DRM)

在这种情况下,您的应用想要防止欺诈性地访问知识产权或付费内容。

建议使用的标识符:如果使用 FID 或 GUID,用户要想规避内容限制就必须重新安装应用,这已足以让大多数人打消这样的念头。如果这样的保护还不够,还可以利用 Android 提供的 DRM API 限制对内容的访问,包括针对每个 APK 的标识符、Widevine ID。

用户偏好设置

在这种情况下,您的应用会将每台设备的用户状态保存在其 。您可以将此状态转移到其他应用 。

建议使用的标识符:FID 或 GUID

为什么这样建议?

不建议在重新安装后保留信息,因为用户可能 想要通过重新安装应用来重置其偏好设置。