架构决策¶
这是一个“架构上重要”决策记录的集合。 为什么?
观察状态 (LiveData)¶
ADR-3
状态:已接受
受影响版本:2.0+
上下文¶
在重构 Focus for Android 以支持多任务处理期间,我们发现基于回调的方法不再足够。之前,当前浏览器状态仅用于更新 UI。现在,随着多个并发会话的出现,当用户在选项卡之间切换时,需要保留和恢复此状态。除此之外,我们希望根据当前状态(部分)更新多个 UI 组件,而单个回调实现很快就变得非常复杂。
对少量数据使用观察者和“反应式风格”似乎是一种更好的方法。已经有许多库提供了此功能,即:RxJava、事件总线(例如 Otto 和 EventBus)、架构组件 (LiveData)、Agera 等。
决策¶
来自 Android 架构组件库的 LiveData 对象用于包装异步更新的数据。依赖此数据的 UI 组件可以获取当前状态或订阅以在数据更改时获取更新。
原因
架构组件库由 Google 的核心 Android 团队编写和维护(-> 高质量和可见性)
库的部分内容将由支持库使用。因此,它们迟早都会被包含到 Focus for Android 中。
该库非常小。
该库处理 Activity/Fragment 生命周期(避免常见错误)。
后果¶
LiveData 旨在与
ViewModel
实例一起使用。到目前为止,我们没有使用ViewModel
,并且还在观察来自非 UI 组件的 LiveData 对象。这并不成问题,但可能会在库的未来版本中导致问题 - 尽管不太可能。
浏览器引擎:GeckoView 与 WebView¶
ADR-2
状态:已接受
受影响的应用程序版本:1.0+
上下文¶
为了渲染网页内容,Firefox Focus 需要使用“网页浏览器引擎”。到目前为止,Mozilla 的所有浏览器,尤其是 Firefox for Android,都使用 Gecko 引擎。
Android 自身附带了一个 WebView 组件,该组件(在新版 Android 中)基于 Chromium/Chrome (Blink 引擎)。
许多现有的 Android 浏览器(例如 Opera、Brave)构建在 Blink 渲染引擎之上或直接派生自 Chromium。
决策¶
Firefox Focus 将构建在 Android 的 WebView 之上。
使用 WebView 的原因
在撰写本文时,GeckoView 已经存在,但它还无法可靠地用于 Firefox for Android 之外。除此之外,还没有提供 WebView 功能集的稳定 API。
APK 大小一直是 Firefox for Android 团队长期关注的问题。较大的 APK 大小对合作伙伴关系协议和带宽有限或昂贵的国家/地区的发布造成了问题。GeckoView 的大小约为 30 MB,而 WebView 是 Android 系统的一部分,基本上是“免费”的。基于 WebView 的 Focus for Android 原型构建的大小不到 3 MB。
除此之外,还将有一个使用 GeckoView 的构建配置。GeckoView 版本将保证能够编译;但保持功能一致性或保持构建无错误不是团队的目标。目前,GeckoView 版本只是一个技术演示,仅用于探索其未来的潜力。
在原型阶段,派生 Chromium(或使用 Blink)被认为是一项过大的投入。
后果¶
WebView 具有复杂的 API。尽管如此,它不允许我们进行我们拥有网页浏览器引擎(例如 GeckoView)时可以进行的繁重的底层自定义。我们还需要观察此限制是否会以某种方式阻止功能开发,从而迫使我们在 Focus for Android 中附带浏览器引擎。
最低支持的 Android 版本:5.0+ (API 21+)¶
ADR-1
状态:已接受
受影响的应用程序版本:1.0+
上下文¶
每个应用程序都需要定义一个最低支持的 SDK 版本。这通常是在可以覆盖的用户数量 (Android 版本分布) 和应用程序需要支持的平台功能 (Android API 级别概述) 之间进行权衡。
决策¶
Focus 将支持 Android 5 及更高版本(API 21+)。此决策主要受以下平台功能驱动,这些功能在早期版本的 Android 上不可用
WebView.shouldInterceptRequest():我们的内容拦截内容使用回调的实现,使我们能够检查请求对象。此实现仅在 Android 21+ 上可用。
UI 功能(如
elevation
)使我们能够构建和原型化“材质”UI,而无需回传功能。
后果¶
在撰写此 ADR 时,此决策将覆盖 73.4% 的 Android 市场 (*)。
Android 4.4 (KitKat) 仍然覆盖了 17.1%。这些用户无法安装和使用 Focus。虽然 UI 功能可以回传,但扩展的 WebView API 无法回传。只有基于 GeckoView 的 Focus 版本才能支持 Android 4.4 或更低版本。