Đề xuất thiết kế cho chỉ số khả năng xem trong Thời gian chạy SDK

Các SDK quảng cáo trong Thời gian chạy SDK không thể truy cập vào hệ phân cấp khung hiển thị của nhà xuất bản. Thay vào đó, các SDK trong Thời gian chạy có khung hiển thị riêng. SDK không thể dùng cùng một View API (API Khung hiển thị) như chúng sử dụng bên ngoài Thời gian chạy SDK để xác định xem quảng cáo có hiển thị cho người dùng hay không, vì khung hiển thị quảng cáo không được đính kèm vào cửa sổ của ứng dụng. Điều này bao gồm các API Khung hiển thị của Android như getLocationOnScreen, getLocationInWindow hoặc getVisibility. Những API này không trả về các giá trị dự kiến.

Việc hỗ trợ chế độ đo lường khả năng xem quảng cáo là một yêu cầu chính trong Thời gian chạy SDK. Đề xuất thiết kế này nhằm mục đích hỗ trợ dịch vụ Đo lường mở và các dịch vụ đo lường tương tự. Các giải pháp được thảo luận ở đây cũng có thể áp dụng cho Attribution Reporting API.

Tính năng

Thiết kế này nhằm hỗ trợ SDK quảng cáo hoặc đối tác đo lường tính toán các dữ liệu về khả năng xem sau đây (các tên gọi là tạm thời và có thể thay đổi):

Hình minh hoạ cho thấy cách các thành phần của khả năng xem trong Thời gian chạy SDK tương tác
Tổng quan về khả năng xem trong Thời gian chạy SDK.
  • viewport [Rect]: Biểu thị màn hình thiết bị hoặc hình dạng của cửa sổ ứng dụng, tuỳ vào các chức năng của nền tảng.
  • uiContainerGeometry [Rect]: Hình dạng của SandboxedSdkView đang được hiển thị.
  • alpha [float]: Độ mờ của SandboxedSdkView đang được hiển thị.
  • onScreenGeometry [Rect]: Tập hợp con của uiContainerGeometry không bị cắt bởi các khung hiển thị mẹ, tối đa và bao gồm viewport).
  • occludedGeometry [Rect]: Các phần của onScreenGeometry bị che khuất bởi bất kỳ khung hiển thị nào trong hệ phân cấp của ứng dụng. Bao gồm một Rect cho từng trường hợp che khuất, tương ứng với 0, 1 hoặc nhiều khung hiển thị của ứng dụng giao với SandboxedSdkView onScreenGeometry

Yêu cầu

  • Giá trị của uiContainerGeometry, onScreenGeometryoccludedGeometry được biểu thị trong không gian toạ độ của viewport.
  • Hoạt động báo cáo sự thay đổi về mức độ hiển thị diễn ra với độ trễ tối thiểu.
  • Bạn có thể đo lường mức độ hiển thị trong toàn bộ vòng đời của khung hiển thị quảng cáo, từ lần xuất hiện đầu tiên cho đến lần xuất hiện cuối cùng.

Đề xuất thiết kế

Đề xuất này dựa trên cách hoạt động của bản trình bày giao diện người dùng khi sử dụng thư viện giao diện người dùng ứng dụng và nhà cung cấp. Chúng tôi sẽ mở rộng các thư viện giao diện người dùng để cho phép SDK đăng ký một hoặc nhiều đối tượng tiếp nhận dữ liệu của phiên giao diện người dùng. Đối tượng tiếp nhận dữ liệu này sẽ nhận được thông tin về khả năng xem bất cứ khi nào phát hiện thấy các sự kiện có liên quan sửa đổi kiểu dữ liệu trong phần chức năng. Các SDK đo lường trong thời gian chạy SDK (các phương thức triển khai OMIDMRAID) có thể đính kèm đối tượng tiếp nhận dữ liệu này vào phiên giao diện người dùng để gửi trực tiếp thông tin này tới đối tượng tiếp nhận. Các đối tác đo lường có thể kết hợp thông tin thu được từ thư viện giao diện người dùng với dữ liệu về nội dung đã có sẵn (chẳng hạn như khi sử dụng các tập lệnh đo lường được chèn vào mẫu quảng cáo) để tạo các sự kiện liên quan đến khả năng xem bằng JavaScript.

Luồng kiểm soát khả năng xem.
Luồng kiểm soát khả năng xem.

Thư viện ứng dụng theo dõi các thay đổi trong giao diện người dùng quảng cáo thông qua trình nghe sự kiện, chẳng hạn như ViewTreeObserver. Bất cứ khi nào xác định rằng giao diện người dùng quảng cáo đã thay đổi theo hướng có thể ảnh hưởng đến việc đo lường khả năng xem, thư viện ứng dụng sẽ kiểm tra thời điểm thông báo gần đây nhất được gửi đến đối tượng tiếp nhận dữ liệu. Nếu lần cập nhật gần đây nhất lớn hơn độ trễ cho phép (có thể được SDK định cấu hình, tối thiểu là 200 mili giây trên thiết bị di động), thì một đối tượng AdContainerInfo mới sẽ được tạo và một thông báo được gửi đến đối tượng tiếp nhận dữ liệu. Mô hình dựa trên sự kiện này phù hợp hơn với tình trạng hệ thống so với hoạt động thăm dò được thực hiện bởi hầu hết các phương thức triển khai OMID trên Android hiện nay.

API

Các mã sau đây sẽ được thêm vào thư viện privacysandbox.ui.core:

  • SessionObserver: Thường do SDK đo lường triển khai, được đính kèm vào phiên do SDK trả về thông qua privacysandbox.ui. Giao diện này cũng cho phép SDK đo lường chọn sẽ sử dụng một số danh mục tín hiệu về khả năng xem. Điều này cho phép thư viện giao diện người dùng ứng dụng chỉ thu thập các tín hiệu mà đối tượng tiếp nhận dữ liệu quan tâm, nhờ đó cải thiện tình trạng tổng thể của hệ thống.
  • registerObserver(): Được thêm vào lớp Session, phương thức này cho phép bất kỳ ai có quyền truy cập vào Phiên đều có thể đăng ký đối tượng tiếp nhận dữ liệu. Nếu đối tượng tiếp nhận dữ liệu được đăng ký sau khi phiên giao diện người dùng mở, thì AdContainerInfo lưu trong bộ nhớ đệm sẽ được gửi ngay cho đối tượng này. Nếu được đăng ký trước khi phiên mở, thì AdContainerInfo sẽ được gửi khi phiên mở.
  • AdContainerInfo: Một lớp có các phương thức getter cho phép đối tượng tiếp nhận dữ liệu nhận thông tin về vùng chứa quảng cáo chỉ đọc cho các kiểu dữ liệu được liệt kê trong mục chức năng ở trên. Bất cứ khi nào có thể, giá trị trả về của các phương thức getter này sẽ tương ứng với các giá trị trả về theo gói của các phương thức getter hiện có trên View và các lớp con của nó. Nếu vùng chứa quảng cáo được tạo bằng Jetpack Compose, lớp này sẽ hiển thị các thuộc tính ngữ nghĩa của vùng chứa đó. Bạn có thể dùng lớp này để tính toán các sự kiện MRAID và OMID liên quan đến khả năng xem.
  • SessionObserverotifyAdContainerChanged(): Dùng để thông báo cho đối tượng tiếp nhận dữ liệu bất cứ khi nào khả năng xem thay đổi. Phương thức này truyền một đối tượng AdContainerInfo. Đối tượng này được gọi bất cứ khi nào các sự kiện được phát hiện có ảnh hưởng đến kiểu dữ liệu liệt kê trong mục Chức năng. Lưu ý: Phương thức này có thể được gọi cùng với các phương thức trong Phiên. Ví dụ: Session.notifyResized() được gọi để yêu cầu SDK thay đổi kích thước quảng cáo và SessionObserver.notifyAdContainerChanged() cũng được gọi khi trường hợp này xảy ra.
  • SessionObserverotifySessionClosed(): Thông báo cho đối tượng tiếp nhận dữ liệu rằng phiên đã đóng.

Các điểm cải tiến trong tương lai

Bất kỳ mã nào đang chạy trong quy trình của ứng dụng, bao gồm cả mã trong thư viện privacysandbox.ui.client, đều có thể bị sửa đổi nếu ứng dụng bị xâm phạm. Do đó, mọi logic thu thập tín hiệu chạy trong quy trình của ứng dụng đều dễ dàng bị mã xử lý ứng dụng can thiệp. Điều này cũng xảy ra đối với mã SDK được triển khai trước khi Hộp cát về quyền riêng tư có sẵn để chạy trong quy trình của ứng dụng. Do đó, việc thư viện giao diện người dùng thu thập tín hiệu không khiến cho trạng thái bảo mật kém đi.

Ngoài ra, mã trong thời gian chạy SDK có thể sử dụng một API nền tảng có tên là setTrustedPresentationCallback. API này có thể đưa ra đảm bảo chắc chắn hơn từ khung về việc hiển thị giao diện người dùng quảng cáo. setTrustedPresentationCallback hoạt động ở cấp Nền tảng và có thể giúp đưa ra câu nhận định về Nền tảng chứa giao diện người dùng quảng cáo bằng cách chỉ định các ngưỡng tối thiểu cho việc hiển thị, chẳng hạn như tỷ lệ phần trăm pixel hiển thị, thời gian hiển thị trên màn hình hoặc tỷ lệ hiển thị. Bạn có thể kiểm tra dữ liệu này dựa trên dữ liệu về khả năng xem do thư viện ứng dụng giao diện người dùng cung cấp, như đã giải thích ở trên. Vì dữ liệu do khung cung cấp đáng tin cậy hơn, nên bạn có thể loại bỏ mọi sự kiện trong thư viện giao diện người dùng có dữ liệu không phù hợp với dữ liệu của khung. Ví dụ: nếu trình nghe đã cung cấp cho setTrustedPresentationCallback được gọi kèm theo một thông báo cho biết không có pixel nào của giao diện người dùng quảng cáo đang hiện trên màn hình và thư viện giao diện người dùng ứng dụng hiển thị một số khác 0 cho số lượng pixel trên màn hình, thì có thể loại bỏ dữ liệu trong thư viện giao diện người dùng.

Câu hỏi mở

  1. Bạn quan tâm đến những tín hiệu nào về khả năng xem mà không được đề cập trong phần giải thích này?
  2. Đề xuất hiện tại là nên cập nhật chỉ số về khả năng xem ít nhất là 200 mili giây một lần, miễn là có sự thay đổi liên quan trong giao diện người dùng. Tần suất này có chấp nhận được đối với bạn không? Nếu không, bạn muốn tần suất là bao nhiêu?
  3. Bạn muốn tự phân tích thông tin từ setTrustedPresentationCallback hay muốn thư viện giao diện người dùng của nhà cung cấp xoá dữ liệu khỏi thư viện giao diện người dùng ứng dụng khi dữ liệu này không khớp với dữ liệu setTrustedPresentationCallback?
  4. Bạn sử dụng các tín hiệu về khả năng xem như thế nào? Hãy giúp chúng tôi nắm được các trường hợp sử dụng của bạn bằng cách gửi ý kiến phản hồi trả lời cho những câu hỏi này.