如何像 CalyxOS 一样使用 F-Droid 库
Posted on 2023-05-02 by
当我们构建下一代 F-Droid 客户端时,我们将代码重写为可重用的库,因此其他项目可以轻松使用 F-Droid 技术。
库
到目前为止,我们已经发布了三个库。其中两个是用 Kotlin 多平台编写的,因此它们也可以在 Android 之外使用。例如,你可以使用它们编写命令行甚至 iOS 客户端。
查看它们的自述文件了解如何将它们包含在你的项目中。
下载库
该库包含下载 F-Droid 存储库以及其中包含的 APK 和图像所需的一切。它处理下载恢复、存储库镜像并处理 F-Droid 客户端可能遇到的特殊 HTTP 情况。
该库的 Android 版本还负责拒绝早于 1.2 的 TLS 以及弱密码。它在使用 Tor 作为代理时防止 DNS 泄漏,并使用短 TLS
会话超时来防止跟踪和密钥重用。如果你使用 Glide 作为图像加载器,它还附带一个特殊的 ModelLoader
以与 Glide 一起使用。
有关详细信息,请参阅 API 文档。查看F-Droid 如何切换到下载库的示例。
索引库
多平台索引库为你提供处理 F-Droid 存储库索引所需的一切。当然,有一个用于在内部读取和表示索引的解析器。对于版本 1 索引,还有一个创建器,F-Droid 使用它来创建自己的本地交换存储库。两个版本都有一个签名验证器,因此你始终可以确保在使用其数据之前对存储库进行了正确签名。
除了这些基础功能之外,该库还有许多有用的类,可帮助你根据用户的语言环境选择最佳翻译,检查应用是否与当前设备兼容,以及检查存储库索引中应用是否有更新可用。有用于处理索引数据流的类,因此你不需要将整个索引加载到内存中,以免在 RAM 很小的设备上导致问题。如果你更喜欢在内部只使用版本 2 格式,该库具有一个索引转换器,可以将版本 1 格式转换为版本 2。
希望使用版本 2 增量更新的 F-Droid 客户端也可以找到有用的类,因此他们不必自己重新发明轮子。
有关详细信息,请参阅 API 文档。查看 F-Droid 如何切换到索引库的示例。
数据库库
如果你需要在你的 Android 应用中保留 F-Droid 存储库信息,这个库适合你。它存储 F-Droid 相关信息,例如存储库、应用及其版本。然后允许你查询和搜索它们。在内部,它使用 Room 数据库,而 Room 数据库又使用 sqlite。
除了与数据库相关的类之外,该库目前还包括与更新存储库相关的类,以便从互联网(使用下载器库)获取的信息可以直接流式传输到数据库中。
有关详细信息,请参阅 API 文档。查看 F-Droid 如何切换到数据库库的示例。
CalyxOS
这些新库的第一个已知用户是 CalyxOS,它已经在两个应用中使用它们。多亏了这些库,他们可以将开发工作集中在应用本身上,而不需要重新实现与 F-Droid 相关的部分。
第一个应用用作其设置向导的一部分,该向导会在初始安装后显示。它允许用户在选择加入的基础上安装额外的应用,因此它们不需要作为不可移除的系统应用发布。 CalyxOS 的好处是他们可以从互联网上的 F-Droid 存储库加载这些应用,而无需将 APK 作为其 ROM 的一部分发送,从而保持其最小大小。
这是他们利用索引库获取一个来自文件的索引表示的方法:
fun getIndex(file: File): IndexV2 = file.inputStream().use { inputStream ->
IndexParser.parseV2(inputStream)
}
第二个应用使用 F-Droid 来保持它自己的基本应用是最新的。使用最小的 UI,其主要目的是定期检查更新并在后台安装更新(一旦可用)。
该应用使用索引库的 UpdateChecker
检查更新是否可用:
private fun getUpdate(packageName: String, packageVersions: List<PackageVersionV2>): PackageVersionV2? {
val packageInfo = packageManager.getPackageInfo(packageName, GET_SIGNATURES)
return updateChecker.getUpdate(packageVersions, packageInfo)
}
(完整代码示例)
这两个应用都不需要持久化任何数据,所以它们只使用下载和索引库。
库的相关工作由 FFDW-DVD 资助资助