遥测

对于启用了“发送匿名使用数据”的客户端,Focus 会向 Mozilla 的遥测服务发送“核心” Ping 和“事件” Ping。可以在应用设置中禁用发送遥测数据。默认情况下,“Focus for Android” 的版本启用了遥测数据(“选择退出”),而“Klar for Android” 的版本默认禁用了遥测数据。

核心 Ping

Focus for Android 在应用转到后台时会创建并尝试发送“核心” Ping。此核心 Ping 使用与 Firefox for Android 相同的格式,并在 firefox-source-docs.mozilla.org 上有记录。

事件 Ping

除了核心 Ping 之外,还会生成用于 UI 遥测的事件 Ping,并在应用转到后台时立即发送。

设置

作为事件 Ping 的一部分,会发送用户设置的最新状态(默认值以**粗体**显示)

设置 值 (*)
默认搜索引擎 pref_search_engine 捆绑引擎名称/custom(**)
拦截广告跟踪器 pref_privacy_block_ads true/false
拦截分析跟踪器 pref_privacy_block_analytics true/false
拦截社交跟踪器 pref_privacy_block_social true/false
拦截内容跟踪器 pref_privacy_block_other true/false
拦截网页字体 pref_performance_block_webfonts true/false
拦截图像 pref_performance_block_images true/false
语言环境覆盖 pref_locale 空字符串/locale-code(***)
默认浏览器 pref_default_browser true/false
隐身模式 pref_secure true/false
自动填充(默认) pref_autocomplete_preinstalled true/false
自动填充(自定义) pref_autocomplete_custom true/false
在 Firefox Focus 主屏幕上显示提示 pref_key_tips true/false

(*) 所有值均以 String 格式发送。

(**) 如果默认值是捆绑引擎之一,则为引擎名称。否则,仅为 custom

(***) 空字符串值表示已选择“系统默认”语言环境。

事件

事件 Ping 包含事件列表(请参阅 readthedocs.io 上的事件格式),用于以下操作

会话

事件 类别 方法 对象
开始会话(应用位于前台) 操作 前台 应用
停止会话(应用位于后台) 操作 后台 应用

浏览

事件 类别 方法 对象 extras。
输入 URL 操作 type_url 搜索栏
输入搜索内容 操作 type_query 搜索栏
点击搜索提示(“搜索…”) 操作 select_query 搜索栏
来自第三方应用的链接 操作 intent_url 应用
来自应用的文本选择操作 操作 text_selection_intent 应用
长按图像/链接 操作 long_press 浏览器
“下拉刷新” 操作 swipe 浏览器 reload
显示自动填充弹出窗口 操作 show autofill
执行自动填充 操作 click autofill
根据提示启用搜索建议 操作 click search_suggestion_prompt true/false

自定义标签

事件 类别 方法 对象 extra
打开自定义标签 操作 intent_custom_tab 应用 选项*
点击“关闭”按钮 操作 click custom_tab_close_bu 标签*
点击“操作”按钮 操作 click custom_tab_action_bu
选择自定义菜单项 操作 open 菜单 custom_tab

(*) options 是第三方应用请求的已启用自定义标签选项的 JSON 映射,例如 [hasToolbarColor, hasCloseButton]

(*) tabs 是一个 JSON 映射,包含当前选定标签的位置和打开标签的总数

{
  "selected": "2"  // Currently selected tab (Zero-based numbering; -1 if no tab is selected)
  "total": "5"     // Total number of open tabs
}

上下文菜单

事件 类别 方法 对象
关闭链接上下文菜单 操作 cancel browser_contextmenu link
选择“分享链接”菜单项 操作 share browser_contextmenu link
选择“复制链接”菜单项 操作 copy browser_contextmenu link
关闭图像上下文菜单 操作 cancel browser_contextmenu image
选择“分享图像”菜单项 操作 share browser_contextmenu image
选择“复制图像”菜单项 操作 copy browser_contextmenu image
选择“保存图像”菜单项 操作 save browser_contextmenu image
关闭带有链接的图像上下文菜单 操作 cancel browser_contextmenu image+link
在新标签页中打开链接 操作 open browser_contextmenu tab
从自定义标签上下文菜单中在 Focus 中打开新标签页 操作 open browser_contextmenu full_browser

清除会话

事件 类别 方法 对象 extras
点击浮动操作按钮 操作 click erase_button 标签*
点击后退按钮:主屏幕 操作 click back_button erase_home 标签*
点击后退按钮:上一个应用 操作 click back_button erase_app 标签*
点击通知 操作 click notification erase 标签*
点击通知“清除并打开” 操作 click notification_action erase_open 标签*
点击主屏幕快捷方式 操作 click shortcut erase 标签*
在标签栏中清除历史记录 操作 click tabs_tray erase 标签*
用户从“最近使用的应用”中移除应用 操作 click recent_apps erase 标签*

(*) tabs 是一个 JSON 映射,包含当前选定标签的位置和打开标签的总数

{
  "selected": "2"  // Currently selected tab (Zero-based numbering; -1 if no tab is selected)
  "total": "5"     // Total number of open tabs
}

通知

事件 类别 方法 对象 extras
点击通知(清除) 操作 click notification erase
点击“打开”操作 操作 click notification_action open
点击“清除并打开”操作 操作 click notification_action erase_open 标签*

(*) tabs 是一个 JSON 映射,包含当前选定标签的位置和打开标签的总数

{
  "selected": "2"  // Currently selected tab (Zero-based numbering; -1 if no tab is selected)
  "total": "5"     // Total number of open tabs
}

页面加载时间直方图

事件 类别 方法 对象 extras
前台会话页面加载时间的直方图 histogram 前台 浏览器 histogram*

(*) 此事件附加了 200 个 extras,每个 extras 都是一个 100 毫秒的存储桶,键为存储桶中的最小值,值为存储桶中相应的事件数。超过 20,000 的任何内容都放在最后一个存储桶中。例如

{”0":"2"}
{“100”:"3"}
...
{"19900", "4"}

URI 计数

事件 类别 方法 对象 extra
会话恢复后,访问的总非唯一 http(s) URI 计数,包括页面重新加载,但不包括后台页面请求以及嵌入页面或隐私浏览中的 URI。 操作 open 浏览器 {"total_uri_count": num }
会话恢复后,访问的唯一域的计数。顶级域下的子域在第一级之后进行聚合(即 test.example.com 和 other.example.com 仅计算一次)。这不包括后台页面请求以及嵌入页面或隐私浏览中的域。 操作 open 浏览器 {"unique_domains_count": num }

下载

事件 类别 方法 对象
点击“下载” 操作 click download_dialog download
点击“取消” 操作 click download_dialog cancel

从图标打开 Focus

事件 类别 方法 对象
从图标启动 Focus 操作 click app_icon open
从图标恢复 Focus 操作 click app_icon resume

添加到主屏幕

事件 类别 方法 对象
在对话框中点击“添加到主屏幕” 操作 click add_to_homescreen_dialog add_to_homescreen
在对话框中点击“取消” 操作 click add_to_homescreen_dialog cancel
从主屏幕快捷方式打开 Focus 操作 click homescreen_shortcut open

分享到 Focus 事件

事件 类别 方法 对象
将 URL 分享到 Focus 操作 share_intent 应用 url
将搜索词分享到 Focus 操作 share_intent 应用 search

设置

事件 类别 方法 对象 extras
设置已更改 操作 change setting { "to": <value> }
添加自动填充域 操作 save autocomplete_domain { "source": <value> }
移除自动填充域 操作 remove autocomplete_domain { "total": 5 }
重新排序自动填充域 操作 reorder autocomplete_domain options*
打开例外设置 操作 open allowlist
移除例外域 操作 remove allowlist { "total": 5 }
移除所有例外域 操作 remove_all allowlist
点击默认搜索引擎 操作 open search_engine_setting
更改默认搜索引擎 操作 save search_engine_setting {"source": src* }
选择“移除”引擎屏幕 操作 remove search_engine_setting
删除搜索引擎 remove remove remove_search_engines {"selected": num* }
恢复捆绑引擎 操作 restore search_engine_setting
选择“添加其他引擎” 操作 show custom_search_engine
保存自定义搜索引擎 操作 save custom_search_engine {"success": bool* }
点击“添加搜索引擎”ℹ️ 操作 click search_engine_learn_more
使用默认浏览器打开提示 操作 show make_default_browser_open_with
设置默认浏览器提示 操作 show make_default_browser_settings

(*) options 包含

{
  "from": 5
  "to":   2
}

(*) src 可以是 bundledcustom

(*) num 选择要删除的引擎数

(*) bool 如果成功保存,则为 true,如果验证错误,则为 false

首次运行

事件 类别 方法 对象
显示首次运行页面 操作 show firstrun page*
按下跳过按钮 操作 click firstrun skip
按下完成按钮 操作 click firstrun finish

(*) 页面编号从 0 开始。最初,当显示首次运行教程时,会触发第一个页面 (0) 的事件。

多任务/标签

事件 类别 方法 对象 extras
上下文菜单:在新标签页中打开链接 操作 open browser_contextmenu tab 标签*
打开标签栏 操作 show tabs_tray
关闭标签栏(后退/点击外部) 操作 hide tabs_tray
切换到标签栏中的标签 操作 click tabs_tray tab 标签*
在标签栏中清除历史记录 操作 click tabs_tray erase 标签*

(*) tabs 是一个 JSON 映射,包含当前选定标签的位置和打开标签的总数

{
  "selected": "2"  // Currently selected tab (Zero-based numbering; -1 if no tab is selected)
  "total": "5"     // Total number of open tabs
}

主屏幕提示

事件 类别 方法 对象
显示在新标签页中打开提示 操作 show tip open_in_new_tab_tip
显示添加到主屏幕提示 操作 show tip add_to_homescreen_tip
显示禁用跟踪保护提示 操作 show tip disable_tracking_protection_tip
显示禁用主屏幕提示提示 操作 show tip disable_tips_tip
显示设置默认浏览器提示 操作 show tip default_browser_tip
显示自动填充 URL 提示 操作 show tip add_autocomplete_url_tip
点击在新标签页中打开提示 操作 click tip open_in_new_tab_tip
点击添加到主屏幕提示 操作 click tip add_to_homescreen_tip
点击禁用提示提示 操作 click tip disable_tips_tip
点击设置默认浏览器提示 操作 click tip default_browser_tip
点击自动填充 URL 提示 操作 click tip add_autocomplete_url_tip
启用/禁用主屏幕提示 操作 click tip add_to_homescreen_tip
显示调查提示 操作 show tip survey_tip
点击调查提示 操作 click tip survey_tip
显示调查(es)提示 操作 show tip survey_tip_es
点击调查(es)提示 操作 click tip survey_tip_es
显示调查(fr)提示 操作 show tip survey_tip_fr
点击调查(fr)提示 操作 click tip survey_tip_fr

SSL 错误

事件 类别 方法 对象 extras
页面 SSL 错误 error page 浏览器 error*
资源 SSL 错误 error resource 浏览器 error*

(*)error 是一个 JSON 映射,包含主要 SSL 错误

{
  "error_code": "SSL_DATE_INVALID"  // Primary SSL Error
}
可能的错误代码
SSL_DATE_INVALID
SSL_EXPIRED
SSL_IDMISMATCH
SSL_NOTYETVALID
SSL_UNTRUSTED
SSL_INVALID
未定义的 SSL 错误

限制

  • 一个事件 Ping 将包含最多但不超过 500 个事件。

  • 每个类型(核心/事件)最多存储 40 个 Ping 在磁盘上,以便稍后上传。

  • 每天发送的 Ping 不超过 100 个。

实现说明

  • 每当主活动的 onStop() 回调被触发时,就会生成(并存储在磁盘上)事件 Ping。这发生在应用程序的主屏幕不再可见时(应用程序处于后台或另一个屏幕显示在应用程序之上)。

  • 每当我们存储 Ping 时,我们也会安排上传。我们为此使用 Android 的 JobScheduler API。这允许系统在方便的时候并且满足某些条件时运行后台任务。我们指定的唯一条件是我们需要一个活动的网络连接。在大多数情况下,此作业在应用程序进入后台后立即执行。

  • 每当上传失败时,我们都会安排重试。第一次重试将在 30 秒后发生(如果此时没有活动的网络连接,则稍后发生)。对于后续重试,使用指数退避策略:[30 秒] * 2 ^ (num_failures - 1)

  • 每当应用程序进入前台并再次发送到后台时,可能会发生较早的上传重试(先前计划的作业被重置,我们重新开始)。