SDK ランタイムの広告 SDK はパブリッシャーのビュー階層にアクセスできません。その代わりに、ランタイムの SDK には独自のビューがあります。SDK は、SDK ランタイムの外部で使用する場合と同じ View API を使用して、広告がユーザーに表示されるかどうかを判断することはできません。広告ビューはアプリのウィンドウにアタッチされていないためです。これには、想定される値を返さない Android View API(getLocationOnScreen
、getLocationInWindow
、getVisibility
など)も含まれます。
広告の視認性の測定をサポートすることは、SDK ランタイムの中核的な要件です。この設計案は、Open Measurement および同様の測定サービスをサポートすることを目的としています。ここで説明する解決策は、Attribution Reporting API にも応用できる場合があります。この提案についてフィードバックをお寄せください。
機能
この設計は、広告 SDK または測定パートナーが次の視認性データを算出できるようにすることを目的としています(名称は暫定的なものであり、変更される可能性があります)。
<ph type="x-smartling-placeholder">viewport [Rect]
: プラットフォームの機能に応じて、デバイス画面またはアプリ ウィンドウのジオメトリを表します。uiContainerGeometry [Rect]
: レンダリングされるSandboxedSdkView
のジオメトリ。alpha [float]
: レンダリングされるSandboxedSdkView
の不透明度。onScreenGeometry [Rect]
: 親ビューによりクリップされてないuiContainerGeometry
のサブセット、viewport
まで。occludedGeometry [Rect]
:onScreenGeometry
の中で、アプリの階層内のビューによって遮られる部分。オクルージョンごとにRect
が含まれ、SandboxedSdkView onScreenGeometry
と交差する 0、1、または複数個のアプリビューに対応します。
要件
uiContainerGeometry
、onScreenGeometry
、occludedGeometry
の値は、viewport
の座標空間で表されます。- 可視性の変化の報告は最小限のレイテンシで行われます。
- 可視性は、最初の表示から最後の表示まで、広告ビューのライフサイクル全体にわたり測定できます。
設計案
この案は、クライアントとプロバイダの UI ライブラリを使用した UI の表示の仕組みに基づいています。SDK が UI セッションの 1 つ以上のオブザーバーを登録できるように、UI ライブラリを拡張します。オブザーバーは、Capabilities セクションのデータ型を変更する関連イベントが検出されると、視認性情報を受け取ります。SDK ランタイムの測定 SDK(OMID 実装と MRAID 実装)は、このオブザーバーを UI セッションにアタッチできるため、この情報を直接送信できます。測定パートナーは、UI ライブラリから取得した情報と、すでに利用可能なコンテンツに関するデータ(広告クリエイティブに挿入された測定スクリプトを使用している場合など)を組み合わせて、JavaScript の視認性イベントを生成できます。
クライアント ライブラリは、ViewTreeObserver
などのイベント リスナーを介して広告 UI の変化をリッスンします。視認性の測定に影響する可能性がある形で広告 UI が変化したと判断されるたびに、クライアント ライブラリが、最後の通知がいつオブザーバーに送信されたかをチェックします。最後の更新が許容されるレイテンシ(SDK で設定可能、モバイルでは最小 200 ミリ秒)を超える場合、新しい AdContainerInfo
オブジェクトが作成されて、通知がオブザーバーにディスパッチされます。このイベントベースのモデルは、現在の Android のほとんどの OMID 実装によって行われるポーリングよりも、システムの健全性に関して優れています。
API
以下が privacysandbox.ui.core ライブラリに追加されます。
SessionObserver
: 通常は測定 SDK によって実装され、privacysandbox.ui を介して SDK から返されたセッションに追加されます。また、このインターフェースでは、測定 SDK で特定のカテゴリの視認性シグナルをオプトインすることもできます。これにより、UI クライアント ライブラリはオブザーバーが関係するシグナルのみを収集できるようになり、システムの健全性全体が向上します。registerObserver()
:Session
クラスに追加されます。このメソッドにより、セッションにアクセスできる誰もがオブザーバーを登録できるようになります。UI セッションが開かれた後にオブザーバーが登録されると、キャッシュに保存されているAdContainerInfo
がすぐに送信されます。セッションが開かれる前に登録した場合は、セッションが開かれたときにAdContainerInfo
が送信されます。AdContainerInfo
: オブザーバーが上記の機能セクションにリストされているデータ型の読み取り専用の広告コンテナ情報を取得できるようにするゲッターを備えたクラス。これらのゲッターからの戻り値は、可能な限り、View
とそのサブクラスの既存のゲッターからの Parcelable 戻り値に対応しています。広告コンテナが Jetpack Compose で作成された場合は、コンテナのセマンティック プロパティが公開されます。このクラスを使用して、視認性に関する MRAID イベントと OMID イベントを計算できます。SessionObserverotifyAdContainerChanged()
: 視認性が変化するたびにオブザーバーに通知するために使用されます。AdContainerInfo
オブジェクトを渡します。これは、機能セクションに表示されているデータ型に影響するイベントが検出されると呼び出されます。注: このメソッドは、Session のメソッドに加えて呼び出される場合があります。たとえば、SDK に広告のサイズ変更をリクエストするためにSession.notifyResized()
が呼び出され、その際にSessionObserver.notifyAdContainerChanged()
も呼び出されます。SessionObserverotifySessionClosed()
: セッションが閉じたことをオブザーバーに通知します。
今後の機能強化
privacysandbox.ui.client ライブラリのコードなど、アプリケーション プロセスで実行されるコードはすべて、アプリケーションが侵害を受けた場合に変更される可能性があります。そのため、アプリプロセスで実行されるシグナル収集ロジックは、アプリコードによって改ざんされやすくなります。これは、アプリプロセスで実行されるプライバシー サンドボックスが利用可能になる前にデプロイされた SDK コードにも該当します。そのため、UI ライブラリによるシグナルの収集によってセキュリティ状況が悪化することはありません。
また、SDK ランタイムのコードでは、setTrustedPresentationCallback
というプラットフォーム API を使用して、広告 UI の表示についてフレームワークからより強力な保証を提供できます。setTrustedPresentationCallback
は Surface レベルで機能します。(表示されるピクセルの割合、画面上の時間、スケールなどについて)表示の最小しきい値を指定することで、広告 UI を含む Surface についてのアサーションに役立てることができます。このデータは、前述のとおり、UI クライアント ライブラリが提供する視認性データと照合できます。フレームワークが提供するデータの信頼性が高いため、データがフレームワークのデータと一致しない UI ライブラリのイベントは破棄できます。たとえば、広告 UI のピクセルが画面に表示されていないという通知によって setTrustedPresentationCallback
に提供されたリスナーが呼び出され、クライアント UI ライブラリがゼロ以外の画面上ピクセル数を示した場合、後者のデータは破棄できます。
自由回答形式の質問
以下の点についてフィードバックをお寄せください。
- この説明で言及されていない、どの視認性シグナルに興味がありますか?
- 現在の提案では、UI で関連する変化がある場合、200 ミリ秒ごとより高い頻度で視認性を更新することになっています。この頻度は許容範囲内ですか?そうではない場合、理想的な頻度はどの程度ですか?
setTrustedPresentationCallback
のデータと一致しない場合に、setTrustedPresentationCallback
からの情報をご自身で分析したいと考えますか?あるいは、プロバイダ UI ライブラリがクライアント UI ライブラリからのデータを削除するようにしたいと考えますか?- 視認性シグナルはどのように利用していますか?Google がユースケースを把握できるように、こちらの質問に対する回答のフィードバックをお送りください。