出价和竞价服务集成和优化

Android 出价和竞价服务设计提案详细介绍了使用可信出价和竞价服务器在 Android 上运行竞价的执行及数据传输流程。为了确保传输中的数据仅由可保护隐私的 API 和可信服务器处理,客户端和服务器之间的数据将使用双向混合公钥加密方法进行加密。

Protected Audience 流程插图。三个列分别表示数据在设备、不可信卖方服务和可信执行环境之间的移动情况。
Protected Audience 竞价流程。

如需如前所述运行竞价,设备上的卖方广告技术平台必须执行以下步骤:

  1. 收集服务器竞价的相关数据并进行数据加密
  2. 向不可信的卖方服务发送请求
  3. 收到来自不可信卖方服务的响应
  4. 对 Protected Audience 竞价响应进行解密并获取竞价结果

Protected Audience 将引入两个新 API 以支持运行服务器竞价:

  1. getAdSelectionData API 会收集服务器竞价的数据,并生成包含竞价数据的加密载荷。出价和竞价服务器使用此载荷运行竞价、生成竞价结果并返回竞价结果。
  2. 设备端广告技术平台客户端可以调用 persistAdSelectionResult API 来对服务器竞价生成的结果进行解密,并获取胜出的广告呈现网址。

设备端卖方广告技术平台需要集成并构建以下各项来运行竞价:

  1. 为服务器竞价卖方收集数据并进行数据加密:广告技术平台应调用 getAdSelectionData API 来获取加密的载荷。
  2. 向不可信的卖方服务发送请求:将包含 getAdSelectionData API 生成的加密载荷的 HTTP POSTPUT 请求发送给其不可信的卖方服务,并发送不可信的卖方服务所需的数据以生成内容相关结果。
  3. 接收来自不可信卖方服务的响应:来自不可信卖方服务的响应将包含加密的 Protected Audience 竞价结果和内容相关竞价结果。
  4. 对 Protected Audience 竞价响应进行解密并获取竞价结果:如需对 Protected Audience 竞价结果进行解密,卖方广告技术平台应调用 persistAdSelectionResult API。persistAdSelectionResult 生成的结果将有助于广告技术平台确定内容相关广告或 Protected Audience 广告是否在竞价中胜出,以及胜出的 Protected Audience 广告的 URI(如果适用)。

服务器竞价支持的功能

我们的目标是支持目前可用于设备端竞价的所有功能。在服务器竞价中支持这些功能的时间表如下:

设备端竞价

服务器竞价

开发者预览版

Beta 版

开发者预览版

Beta 版

事件级胜出报告

2023 年第 1 季度

2023 年第 3 季度

不适用

2023 年第 4 季度

广告瀑布流中介

2023 年第 1 季度

2023 年第 4 季度

不适用

2024 年第 1 季度

频次上限过滤

2023 年第 2 季度

2023 年第 3 季度

不适用

2023 年第 4 季度

将内容相关广告传递到广告选择工作流程以进行过滤

2023 年第 2 季度

2024 年第 1 季度

不适用

不适用

互动报告

2023 年第 2 季度

2023 年第 3 季度

不适用

2023 年第 4 季度

加入自定义受众群体委托

2023 年第 3 季度

2023 年第 4 季度

不适用

2023 年第 4 季度

非 CPM 结算

2023 年第 3 季度

2023 年第 4 季度

调试
报告

2023 年第 3 季度

2023 年第 4 季度

2023 年第 3 季度

2023 年第 4 季度

公开出价中介

不适用

不适用

不适用

2024 年第 1 季度

应用安装广告过滤

2023 年第 2 季度

2024 年第 1 季度

不适用

2024 年第 1 季度

货币管理

不适用

不适用

不适用

2024 年第 1 季度

K 匿名性集成

不适用

2024 年第 1 季度

不适用

2024 年第 1 季度

不公开汇总集成

不适用

不适用

不适用

2024 年第 3 季度

使用 Protected Audience API 运行服务器竞价

在开发者预览版轨道中,AdSelectionManager 提供了两个新 API:getAdSelectionDatapersistAdSelectionResult。这两个 API 允许广告技术平台 SDK 与出价和竞价服务器集成。

收集服务器竞价的相关数据并进行数据加密

getAdSelectionData API 为出价和竞价组件(例如 BuyerInputProtectedAudienceInput)生成所需的输入,并对数据进行加密,然后再将结果提供给调用方。为防止在各应用间发生数据泄露,这些数据包含设备端存在的所有买方的信息。如需详细了解此决策,请参阅隐私保护注意事项部分;如需详细了解用于优化它的策略,请参阅大小注意事项部分。

如需访问此 API,必须启用对 Protected Audience API 的访问权限,并且必须在调用方的清单中定义 ACCESS_ADSERVICES_CUSTOM_AUDIENCE 权限。

public class AdSelectionManager {
    public void getAdSelectionData(
            GetAdSelectionDataRequest getAdSelectionDataRequest,
            Executor executor,
            OutcomeReceiver<GetAdSelectionDataOutcome, Exception> receiver) {}
}

GetAdSelectionDataRequest

调用方必须在请求中设置 seller 字段,因为在处理请求之前,该字段将被用来运行注册检查。

public class GetAdSelectionDataRequest {
  Public setSeller(AdTechIdentifier seller);
}

请求通过验证后,设备端买方数据会组合成 BuyerInputProtectedAudienceInput。然后,系统会使用双向混合公钥加密方法对最终的载荷对象进行加密。

GetAdSelectionDataOutcome

GetAdSelectionDataOutcome 是作为 getAdSelectionData API 的结果生成的。它包含以下各项:

  1. adSelectionId:一个不透明整数,用于标识此 getAdSelectionData 调用。广告技术平台客户端应保留此 adSelectionId 值,因为它充当指向 getAdSelectionData 调用的指针。persistAdSelectionResult API 需要此标识符对来自出价和竞价服务器的竞价结果进行解密,并且 reportImpressionreportEvent API 也需要此标识符。
  2. adSelectionData:这是出价和竞价服务器运行竞价所需的加密竞价数据。此方法包含:
    1. 根据自定义受众群体的频次上限、应用安装过滤条件和服务器竞价要求过滤出的自定义受众群体数据。
    2. 在未来的版本中,它将包含应用安装数据。
public class GetAdSelectionDataOutcome {
  Public getAdSelectionId(long adSelectionId);
  public byte[] getAdSelectionData();
}

错误、异常和失败处理

如果广告选择数据生成因参数无效、超时或资源消耗过多等原因而无法成功完成,OutcomeReceiver.onError() 回调会提供具有以下行为的 AdServicesException

  1. 如果使用无效参数发起了 getAdSelectionData,则 AdServicesException 会指明 IllegalArgumentException 是错误原因。
  2. 所有其他错误会收到 AdServicesException,并以 IllegalStateException 为错误原因。

向不可信的卖方服务发送请求

使用 AdSelectionData 时,设备端 SDK 可以将数据包含在 POSTPUT 请求中,从而将请求发送到卖方的广告服务:

fetch('https://www.example-ssp.com/auction', {
  method: "PUT",
  body: data,
...
})

设备端 SDK 负责对此类数据进行编码。建议使用节省空间的解决方案,例如以 multipart/form-data 的形式将请求发送到卖方的广告服务。

收到来自不可信卖方服务的响应

出价和竞价服务器解说中所述,当不可信的卖方服务收到请求时,它会向合作伙伴买方发出内容相关广告调用。

不可信的卖方服务会将加密的 adSelectionDataAuctionConfig 转发到在 TEE 中运行的出价和竞价服务器的 SellerFrontEnd 服务。

当 Protected Audience 竞价完成后,SellerFrontEnd 服务会将竞价结果加密,并返回该结果作为对不可信卖方服务的响应。

不可信的卖方服务会向包含内容相关广告和/或加密的 Protected Audience 竞价结果的设备发送响应。

收到响应时,设备端卖方广告技术平台代码可以选择仅在响应中使用内容相关广告,或如果它认为在获取 Protected Audience 结果时存在增量值,则可以通过调用 PersistAdSelectionResult API 选择对 Protected Audience 结果进行解密。

PersistAdSelectionResult API

如需对 Protected Audience 结果进行解密,卖方广告技术平台可以调用第二个 Protected Audience API persistAdSelectionResult。此 API 会对结果进行解密并返回 AdSelectionOutcome,这与今天从设备端竞价返回的对象相同。

如需访问此 API,调用方必须在其清单中启用对 Protected Audience API 的访问权限并定义 ACCESS_ADSERVICES_CUSTOM_AUDIENCE 权限。

    public void persistAdSelectionResult(
            PersistAdSelectionResultRequest persistAdSelectionResultRequest,
            Executor executor,
            OutcomeReceiver<AdSelectionOutcome, Exception> receiver) {}

PersistAdSelectionResultRequest

调用方必须在请求中设置以下项:

public final class PersistAdSelectionResultRequest {
  Public setAdSelectionId(long adSelectionId);
  public setSeller(AdTechIdentifier seller);
  public setAdSelectionResult(byte[] adSelectionResult);
}
  1. adSelectionId:由 getAdSelectionData 调用生成的不透明标识符,调用方需要对该调用的结果进行解密。
  2. seller:在处理请求之前,必须在请求中设置卖方广告技术平台标识符以运行注册检查。
  3. adSelectionResult:由出价和竞价服务器生成的加密竞价结果,调用方需要进行解密。

AdSelectionOutcome 响应

如果存在 Protected Audience 胜出方,则 AdSelectionOutcome 将返回胜出的广告呈现 URI。在 adSelectionResult 解密后,报告数据会保留在内部。OutcomeReceiver.onResult() 回调会返回一个包含以下内容的 AdSelectionOutcome

  • URI:如果存在胜出的 Protected Audience 广告,则会返回胜出广告的广告呈现网址。如果没有 Protected Audience 胜出方,则返回 `Uri.EMPTY。
  • adSelectionId:与此服务器竞价运行关联的 adSelectionId

错误、异常和失败处理

如果广告选择数据生成因参数无效、超时或资源消耗过多等原因而无法成功完成,OutcomeReceiver.onError() 回调会提供具有以下行为的 AdServicesException

  1. 如果使用无效参数发起了 getAdSelectionData,则 AdServicesException 会指明 IllegalArgumentException 是错误原因。
  2. 所有其他错误会收到 AdServicesException,并以 IllegalStateException 为错误原因。

隐私保护注意事项

adSelectionData 已经过加密,旨在确保只有 PPAPI 和可信服务器可以访问传输中的数据。

尽管已加密,但由于 adSelectionData 大小,仍可能会发生数据泄露。adSelectionData 大小可能会因以下因素而变化:

  1. 设备端存在的 CustomAudience 数据发生了变化。
  2. 过滤逻辑 CustomAudience 发生了变化。
  3. getAdSelectionData 调用的输入发生了变化。

adSelectionData 大小的变化可用于生成跨应用标识符(如 1 位泄露讨论中所述)。许多适用于 1 位泄露的缓解措施在此处也适用。

为了管理这些泄露,我们计划为对 getAdSelectionData API 的所有调用生成相同的 adSelectionData。在初始版本中,设备端的所有 CustomAudiences 都用于创建 adSelectionData,加密载荷将被填充以遮盖大小变化。我们还将限制 GetAdSelectionData 输入参数对所生成的 adSelectionData 的影响。

不过,如果使用所有设备端竞价数据为所有广告技术平台生成相同的 adSelectionData,现在会导致每次调用广告技术平台服务器时都需要传输较大的载荷。使用设备端所有自定义受众群体来生成竞价载荷,也会使生态系统开放而遭受恶意实体滥用。我们在下面的大小优化滥用缓解措施部分中介绍了这些问题。

大小优化

广告技术平台客户端 SDK 应将 adSelectionData 的加密字节打包到向广告技术平台服务器发出的 HTTP PUT/POST 内容相关调用中。为了缩短往返时间延迟和降低费用,您必须在不影响效用的情况下尽可能减小 adSelectionData 大小。

我们计划在即将发布的版本中探索并可能引入以下优化来减小 adSelectionData 的大小:

  1. 以一组固定的分桶大小(含内边距)生成的载荷:为了最大限度地减少因大小变化造成的泄露,同时仍然允许减小载荷,我们建议对所生成的载荷使用固定大小的分桶。将分桶数量保持在较小的值(例如 7)时,将会导致每次调用 getAdSelectionData 会泄露的熵小于 3 位。

    如果设备端数据超过分桶大小上限,系统将使用下文提到的策略(例如优先级值)来决定要丢弃哪些数据。

  2. 买方配置:我们正在评估让买方设置每位买方载荷配置的可行性。此配置有助于确定买方有兴趣加入的竞价。如果可行,在注册期间,买方广告技术平台可以注册一个端点,以便 Protected Audience 会每日定期从该端点提取载荷配置。此外,可保护隐私的 API 还会公开一个 API,以允许买方广告技术平台注册此端点。

    然后,此配置会用于评估买方对为每个 getAdSelectionData 请求生成的 adSelectionData 的贡献。

    买方载荷配置会允许买方指定:

    1. 许可的卖方名单:只有当 getAdSelectionData 调用由许可名单中的卖方发起时,买方 CustomAudience 才会添加到载荷中。我们会每日提取载荷配置,以确保许可名单保持最新。
    2. 每个卖方的大小限制:买方可以指定每个卖方的大小限制,以确定在某个卖方发起竞价时要在载荷中发送的数据大小。如果买方想要投入更多资源来处理某些卖方的竞价数据,这会非常有用。SellerFrontendService 仅将特定于买方的数据转发到每个 BuyerFrontendService。因此,通过定义每个卖方的大小限制,买方可以明确控制其出价和竞价服务器的 BuyerFrontendService 针对卖方进行的竞价所注入和处理的数据量。
  3. 卖方配置:我们正在评估实现每个卖方竞价配置的可行性,以允许卖方定义竞价参数来控制载荷大小和竞价参与者。如果可行,在注册期间,卖方广告技术平台将能够指定一个端点,以便 Protected Audience 可以定期从该端点提取针对每个卖方的竞价配置。然后,此配置会用于确定为每个 getAdSelectionData 请求生成的 adSelectionData 的组成和限制。

    与买方配置类似,每个卖方的配置允许卖方指定他们期望在竞价中看到的买方组,以及针对每个买方对载荷大小的贡献指明限制。

    卖方竞价配置允许卖方指定:

    1. 许可的买方名单:对于给定卖方发起的竞价,只有许可名单中的买方才能贡献 CustomAudience 来参与竞价。竞价配置需要每日更新,以便确保许可名单与服务器端买方许可名单保持同步更新。
    2. 每个买方的大小上限:卖方可以指定每个买方的限制,针对发送至 SellerFrontendService 的载荷管制每个买方上传到载荷中的数据大小。如果买方超出每个买方的大小限制,则买方载荷配置中设置的 CustomAudience 优先级将用于获取预期限制内的数据。
    3. 每个买方的优先级:允许卖方设置每个买方的优先级。买方优先级将用于确定当载荷大小超出载荷大小限制时,哪些买方数据应保留在载荷中。
    4. 载荷的大小上限:不同的卖方可能具有不同的资源分配,并且可能希望为每次请求的竞价载荷设置大小上限。该大小上限会遵循 Protected Audience API 设置的固定大小分桶。
  4. 自定义受众群体更改

    1. 指定自定义受众群体优先级:允许买方在自定义受众群体中指定优先级值。如果买方自定义受众群体组超出每个卖方或每个买方的大小限制,则 priority 字段将用于确定应包含在竞价中的自定义受众群体。自定义受众群体中未指定的优先级值将默认为 0.0
  5. 载荷数据变化

    1. 减少载荷中发送的数据:如出价和竞价服务载荷优化中所详述,自定义受众群体 ads 数据、用户出价信号和 Android 信号会导致载荷增多。通过以下方式可以减少增多的载荷:
      1. 让客户端在载荷中发送广告呈现 ID(而不是广告对象)。
      2. 让客户端在载荷中不发送任何广告数据。
      3. 在客户端载荷中不发送用户出价信号。

尽管上述策略允许广告技术平台定义配置来管理 adSelectionData 载荷组成和限制,但通过更改配置参数,它们也可能成为调节 adSelectionData 大小的因素。为避免出现这种情况,Protected Audience 会每日从配置的端点提取配置。

延迟时间优化

为了让服务器竞价具有理想的效用水平,我们需要确保 getAdSelectionData API 和 persistAdSelectionResult API 的每次调用延迟时间较短。尽管我们的目标是在 2023 年为 API 提供功能支持,但我们后续的版本将重点关注 API 的延迟时间基准和优化。

我们正在探索以下策略,以确保延迟时间在可接受的限制范围内:

  1. 预生成每个卖方的 Protected Audience 数据:由于卖方竞价配置和买方载荷配置将在相当长的时间(每日)内保持稳定,因此平台可以预计算和存储符合条件的 Protected Audience 数据。

    这需要平台构建一种机制来监控自定义受众群体更新,并根据更新修改预生成的 Protected Audience 数据。平台还需要声明竞态延迟的服务等级目标 (SLO);广告技术平台可以在自定义受众群体更新和看到为服务器竞价生成的 adSelectionData 发生变化之间预计有竞态延迟。

    由于设备提供具有不同进程优先级的有限资源计算模型,因此我们深知,提供此预生成功能必须有高可靠性和 SLO 保证。

    然后,系统会基于以下情况预生成 Protected Audience 数据:

    1. 卖方选择启用 Protected Audience 数据预生成功能。
    2. 买方有资格参与由特定卖方发起的竞价。
    3. 根据以下信息确定会成为载荷一部分的每个买方的自定义受众群体:
      1. 卖方配置中定义的每个买方的大小限制、每个买方的优先级以及大小上限,
      2. 买方配置中定义的每个卖方的大小限制、自定义受众群体优先级。
  2. 积极应用排除性过滤:如果由卖方首选,平台可以通过预生成 Protected Audience 数据并应用排除性过滤来滤掉关键 getAdSelectionData 调用,从而预计算 adSelectionData。这样,卖方便可以在平衡减少的延迟时间的同时,接受排除性过滤中的过时情况。

    平台可以通过在卖方配置中提供一个具有过时限制的默认选项并在 getAdSelectionData 中提供替换选项来提供此支持,以便在需要时支持最新的计算。或者,平台也可以提供要在 getAdSelectionData 之前调用的其他初始化 API 来预热竞价。

  3. 计算多个竞价的载荷:在某些情况下,可能会首选使用具有低延迟性能的 API,但其代价是增加了数据过时。为了提供此功能,平台可以引入一个初始化 API 来计算整个载荷,并为调用方提供对所计算载荷的引用。

    后续若要调用 getAdSelectionData,调用方可以提供对要用于生成 adSelectionData 的预计算载荷的引用。

上述所有三种策略都处于初始探索阶段,旨在说明平台为针对延迟时间进行优化而要采取的路线。随着我们探索该 API 的更详细延迟时间配置文件和广告技术平台要求,将继续提出其他策略。

滥用缓解措施和识别

如隐“私保护注意事项”所述,adSelectionData 是使用设备端的所有买方数据生成的。

但是,如果设备上的所有买方数据都用于生成 adSelectionData 输出,那么恶意实体可能会冒充买方,创建欺诈性的买方数据以降低 Android 性能,使载荷膨胀,从而增加广告技术平台运行竞价或出价所需的费用,等等。

应对措施

“大小注意事项”部分中提到的一些措施(如买方载荷配置中包含已列入许可名单的卖方,卖方竞价配置中包含已列入许可名单的买方)有助于排除载荷中的非预期数据。

其他一些大小注意事项措施(例如允许 SSP 指定买方优先级,在生成的载荷中放置每个买方的配额,以及设置每个竞价载荷的大小上限)还有助于减轻恶意载荷膨胀的影响。这些措施旨在使广告技术平台能够指定与哪些广告技术平台进行协作,并为它们需要处理的载荷设置可接受的限制。

如前所述,所有针对防滥用和大小限制推出的缓解措施都必须遵循隐私保护注意事项。

识别恶意实体

虽然上述缓解措施可以保护服务器竞价的 adSelectionData 生成,但并不能帮助识别恶意实体或防止平台遭到滥用,例如从买方创建数量空前的自定义受众群体。

为了确保平台的稳定性和运行状况,我们需要找到一种机制来识别恶意实体、识别滥用行为媒介以及确定特定攻击的动机。在后续版本中,我们将推出相关解说来详细说明潜在的滥用行为媒介以及用于对抗它们的保护措施。