本文档根据您的用例,提供了有关为您的应用选择合适的标识符的指导。
有关 Android 权限的概览,请参阅 权限概述。有关使用 Android 权限的具体最佳实践,请参阅 应用权限最佳实践。
使用 Android 标识符的最佳实践
为了保护用户的隐私,请使用最严格的标识符来满足您的应用用例。特别是,请遵循以下最佳实践
- 尽可能选择用户可重置的标识符。即使您的应用使用非重置型硬件 ID 之外的标识符,也能实现其大部分用例。
避免使用硬件标识符。在大多数用例中,您可以避免使用硬件标识符(例如国际移动设备识别码 (IMEI)),而不会限制所需的功能。
Android 10(API 级别 29)对不可重置的标识符增加了限制,其中包括 IMEI 和序列号。您的应用必须是 设备或配置文件所有者应用、具有 特殊的运营商权限,或具有
READ_PRIVILEGED_PHONE_STATE
特权权限才能访问这些标识符。仅将广告 ID 用于用户画像或广告用例。在使用 广告 ID 时,始终 尊重用户关于广告跟踪的选择。如果您必须将广告标识符与个人可识别信息关联,则只能在 获得用户的明确同意 后这样做。
不要桥接广告 ID 重置。
对于所有其他用例(除了支付欺诈预防和电话功能),尽可能使用 Firebase 安装 ID (FID) 或私有存储的 GUID。对于绝大多数非广告用例,FID 或 GUID 就足够了。
使用适合您用例的 API 以最大程度地降低隐私风险。对于高价值内容保护,请使用 DRM API;对于滥用防护,请使用 Play Integrity API。Play Integrity API 是确定设备是否为正版的最简单方法,并且不会产生隐私风险。
本指南的其余部分将在开发 Android 应用的上下文中详细说明这些规则。
使用广告 ID
广告 ID 是用户可重置的标识符,适用于广告用例。但是,在使用此 ID 时,需要牢记一些关键点
始终尊重用户重置广告 ID 的意图。未经用户同意,请勿通过使用其他标识符或指纹将后续广告 ID 链接在一起以桥接用户重置。 Google Play 开发者内容政策 中规定了以下内容
"...如果重置,则不得将新的广告标识符与之前的广告标识符或从之前的广告标识符派生的数据关联,除非获得用户的明确同意。"
始终尊重关联的个性化广告标记。 广告 ID 是可配置的,用户可以限制与 ID 关联的跟踪量。始终使用 AdvertisingIdClient.Info.isLimitAdTrackingEnabled()
方法确保您没有违背用户的意愿。 Google Play 开发者内容政策 中规定了以下内容
"...您必须遵守用户“拒绝基于兴趣的广告”或“拒绝个性化广告”的设置。如果用户启用了此设置,则您不得将广告标识符用于创建用于广告目的的用户资料或用于向用户投放个性化广告。允许的活动包括情境广告、频率上限、转化跟踪、报告以及安全和欺诈检测。"
注意与您使用的与广告 ID 使用相关的 SDK 关联的任何隐私或安全政策。 例如,如果您将 true
传递到 Google Analytics SDK 中的 enableAdvertisingIdCollection()
方法,请确保查看并遵守所有适用的 Analytics SDK 政策。
此外,请注意,Google Play 开发者内容政策 要求广告 ID“不得与个人可识别信息关联或与任何持久设备标识符(例如:SSAID、MAC 地址、IMEI 等)关联”。
例如,假设您想要收集信息以使用以下列填充数据库表
TABLE-01 | |||
时间戳 |
广告 ID |
账户 ID |
点击 ID |
TABLE-02 | |||
账户 ID |
姓名 |
出生日期 |
国家/地区 |
在此示例中,ad_id
列可以通过两个表中的 account_id
列与 PII 连接,如果您没有获得用户的明确许可,这将违反 Google Play 开发者内容政策。
请记住,广告商 ID 和 PII 之间的链接并不总是如此明确。有可能存在同时出现在 PII 和 Ad ID 键控表中的“准标识符”,这也会导致问题。例如,假设我们更改 TABLE-01 和 TABLE-02 如下
TABLE-01 | ||||
时间戳 |
广告 ID |
点击 ID |
设备型号 |
|
TABLE-02 | ||||
时间戳 |
演示 |
账户 ID |
设备型号 |
姓名 |
在这种情况下,对于足够稀少的点击事件,仍然可以通过事件的时间戳和设备型号在广告商 ID TABLE-01 和 TABLE-02 中包含的 PII 之间进行连接。
尽管通常很难保证数据集中不存在此类准标识符,但您可以通过尽可能概括唯一数据来防止最明显的连接风险。在前面的示例中,这意味着降低时间戳的精度,以便每个时间戳都显示具有相同型号的多个设备。
其他解决方案包括以下内容
不设计将 PII 与广告 ID 明确关联的表。在上面的第一个示例中,这意味着不包括 TABLE-01 中的
account_id
列。隔离和监控有权访问广告 ID 键控数据和 PII 的用户或角色的访问控制列表。通过严格控制和审核同时访问这两个来源的能力(例如,通过在表之间执行连接),您可以降低广告 ID 和 PII 之间关联的风险。一般来说,控制访问意味着执行以下操作
- 使广告 ID 键控数据的访问控制列表 (ACL) 和 PII 的访问控制列表保持分离,以最大限度地减少同时存在于这两个 ACL 中的个人或角色的数量。
- 实施访问日志记录和审核,以检测和管理对该规则的任何例外情况。
有关负责任地使用广告 ID 的更多信息,请参阅 AdvertisingIdClient
API 参考。
使用 FID 和 GUID
识别设备上运行的应用实例最直接的解决方案是使用 Firebase 安装 ID (FID),这是大多数非广告用例中推荐的解决方案。只有为其预配的应用实例才能访问此标识符,并且它(相对)易于重置,因为它仅在应用安装期间持续存在。
因此,与不可重置的设备范围硬件 ID 相比,FID 提供了更好的隐私属性。有关更多信息,请参阅 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,而不是更低级别的 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。另一方面,标识符在一个群体中越不唯一,隐私保护就越强,因为它对跟踪单个用户不太有用。
完整性保护和不可否认性
您可以使用难以伪造或重播的标识符来证明关联的设备或账户具有某些属性。例如,您可以证明该设备不是垃圾邮件发送者使用的虚拟设备。难以伪造的标识符还提供不可否认性。如果设备使用密钥对消息进行签名,则很难声称其他人的设备发送了该消息。不可否认性可能是用户想要的东西,例如在验证付款时,也可能是用户不希望拥有的属性,例如在发送他们后悔的消息时。
常见用例和要使用的适当标识符
本节提供了一些替代使用硬件 ID(例如 IMEI)的方法。不建议使用硬件 ID,因为用户无法重置它们,并且它们的作用域限定在设备范围内。在许多情况下,应用范围内的标识符就足够了。
账户
运营商状态
在这种情况下,您的应用使用运营商账户与设备的电话和短信功能进行交互。
建议使用的标识符:IMEI、IMSI 和 Line1
为什么推荐这些?
如果运营商相关功能需要使用硬件标识符,则可以接受。例如,您可以使用这些标识符在蜂窝网络运营商或 SIM 卡插槽之间切换,或通过 IP 传输短信(对于 Line1) - 基于 SIM 卡的用户账户。但是,对于非特权应用,我们建议使用账户登录在服务器端检索用户设备信息。这样做的一个原因是,在 Android 6.0(API 级别 23)及更高版本中,这些标识符只能通过运行时权限使用。用户可能会关闭此权限,因此您的应用应优雅地处理这些异常情况。
移动订阅状态
在这种情况下,您需要将应用功能与设备上的某些移动服务订阅关联起来。例如,您可能需要根据设备通过 SIM 卡的移动订阅来验证对某些高级应用功能的访问权限。
建议使用的标识符:Subscription ID API 用于识别设备上使用的 SIM 卡。
Subscription ID 为已安装的 SIM 卡(包括物理 SIM 卡和电子 SIM 卡)提供了一个唯一标识符的索引值(从 1 开始)。通过此 ID,您的应用可以将其功能与给定 SIM 卡的各种订阅信息关联起来。对于给定的 SIM 卡,此值是稳定的,除非设备恢复出厂设置。但是,在某些情况下,同一张 SIM 卡在不同的设备上可能具有不同的 Subscription ID,或者不同的 SIM 卡在不同的设备上可能具有相同的 ID。
为什么推荐这些?
某些应用目前可能正在使用ICC ID 用于此目的。由于 ICC ID 是全局唯一的且不可重置,因此自 Android 10 起,访问权限已限制为具有READ_PRIVILEGED_PHONE_STATE
权限的应用。从 Android 11 开始,Android 进一步限制了通过getIccId()
API 访问 ICCID,无论应用的目标 API 级别如何。受影响的应用应迁移到使用 Subscription ID。
单点登录
在这种情况下,您的应用提供单点登录体验,允许用户将其现有账户与您的组织关联起来。
建议使用的标识符:与账户管理器兼容的账户,例如Google 账户关联
为什么推荐这些?
Google 账户关联允许用户将其现有的 Google 账户与您的应用关联,从而为您的组织的产品和服务提供无缝且更安全的访问权限。此外,您可以定义自定义 OAuth 范围,以仅共享必要的数据,通过明确定义如何使用其数据来提高用户信任度。
广告
定向投放
在这种情况下,您的应用构建用户兴趣概况,以便向他们展示更相关的广告。
建议使用的标识符:如果您的应用使用 ID 用于广告,并上传或发布到 Google Play,则该 ID 必须是广告 ID。
为什么推荐这些?
这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。
无论您是否在应用中共享用户数据,如果您收集并将其用于广告目的,都需要在 Play Console 的应用内容页面上的数据安全部分中声明广告目的。
衡量
在这种情况下,您的应用根据用户在同一设备上您组织的不同应用中的行为创建用户概况。
建议使用的标识符:广告 ID 或 Play 安装推荐来源 API
为什么推荐这些?
这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。如果您将 ID 用于广告用例,则该 ID 必须是广告 ID,因为用户可以重置它。在Google Play 开发者内容政策中了解更多信息。
转化
在这种情况下,您正在跟踪转化以检测您的营销策略是否成功。
建议使用的标识符:广告 ID 或 Play 安装推荐来源 API
为什么推荐这些?
这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。
再营销
在这种情况下,您的应用根据用户的先前兴趣展示广告。
建议使用的标识符:广告 ID
为什么推荐这些?
这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。
应用分析
在这种情况下,您的应用评估用户行为,以帮助您确定以下内容
- 您组织的哪些其他产品或应用可能适合用户。
- 如何让用户对使用您的应用保持兴趣。
- 衡量未登录或匿名用户的用量统计信息和分析数据。
可能的解决方案包括
- 应用集 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 的设计明确用于此目的;其作用域仅限于应用,因此无法用于跨不同应用跟踪用户,并且在应用重新安装时会重置。在 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
为什么推荐这些?
不建议在重新安装后保留信息,因为用户可能希望通过重新安装应用来重置其偏好设置。