- 如何让我的应用被收录?
- 如何修改描述和添加元信息如屏幕截图?
- 我如何许可我的应用?
- 捐赠是如何处理的?
- 我的应用将从源代码开始构建吗?
- 版本控制呢?
- 我更新时需要告诉你吗?
- 我已经发布了一个新版本。为什么它不在存储库中?
- 签名呢?
- 由我的密钥签署的 APK 能否被包括在内?
- 可重复构建是必需的吗?
- How can I handle “fsck error in packed object” for my app?
- 我可以运行我自己的 F-Droid 软件包存储库吗?
- 我可以看到谁在安装我的应用吗?
- 我可以从我的应用中跟踪用户吗?
- 我可以包括广告吗?
- 哪些库和依赖可以使用?
- Google 的 SDK 和库不是自由开源软件吗?
- 使用哪种构建系统?
- 如何让我的应用被删除?
- 如何让我的应用被删除?
- 我看到一些大商店里的应用是公然的复制。我将我的应用闭源更好不是吗?
- F-Droid 客户端的 git 工作流是如何构成的?
如何让我的应用被收录?
请检查收录政策,以确保你的应用适合收录在官方 F-Droid 存储库中。最快的方法是按照这些说明向 fdroiddata 提出合并请求,使应用被收录。还有一个提交给 F-Droid 的快速入门指南。打包请求可以在打包请求跟踪器中发布。
你也可以建立你自己的存储库并在 F-Droid.org 存储库之外自己发布应用。
如何修改描述和添加元信息如屏幕截图?
我们从三个地方提取元数据:
- 上游应用存储库,遵循 fastlane 或 Triple-T play plugin 结构
- F-Droid 自己的元数据存储库
- F-Droid 自己发布在公开的 F-Droid 服务器上的
repo
暂存区
虽然你不能编辑最后一条,但我们非常欢迎对元数据存储库的合并请求,以更新描述。另一方面,截图目前只能从上游仓库使用。
我们希望在未来直接从上游拉入更多的东西(比如更新日志),让应用开发者对他们的应用如何在 F-Droid 中显示有更多的控制。然而,我们将始终保持我们自己的最小的、权威的元数据存储库。
我如何许可我的应用?
大体上有两类:copyleft 和宽松许可,GPLv3 和 Apache 2.0 分别是其中最流行的。如果你坚持要求衍生产品拥有相同的许可,请选择前者;如果你允许任何形式的重复使用,请选择后者。
整体许可证必须与组件的许可证兼容。然而,当涉及到资产和资源时,我们会给予一定的灵活性;因此,如果你有,例如,一些使用知识共享非商业许可(即非自由许可)的音乐,那么我们会接受它。重要的是,在文件头和/或 README 中包括资产和源代码的版权信息。在存储库的根路径下有一份许可证的副本是很有意义的(LICENSE 或 COPYING 文件)。也要注意与外部资源或程序有关的版权和许可证,如果它确实连接到一个自由服务,考虑使用 Affero GPL。更多信息请参见收录政策。
捐赠是如何处理的?
在网站和 F-Droid 客户端中,我们提供捐赠给你项目的链接。理想情况下,你应该有一个专门的页面,解释如何以及为什么捐赠你的项目,以便我们可以直接链接到它。请记住,大多数用户可能会直接从 Android 设备上的 F-Droid 客户端访问它。你还应该使此信息可以从应用中访问。
我们的元数据中有比特币、莱特币、Flattr 和 Liberapay 捐款的字段。如果其中任何一个有变化,或者你停止接受它们,请务必联系我们;如果你接受新的方法,你也可以联系我们。
如果你的应用在我们的存储库中,但我们缺少上述任何信息,请确保我们知道它。
我的应用将从源代码开始构建吗?
是的,除了极少数情况(由于技术或历史原因),我们直接从源代码中构建所有应用。这保证了人们所安装的版本的源代码是可用的。虽然我们并不是说你的源代码不完整、没有发布或已经过时,但是这种情况经常发生。
版本控制呢?
Android 知道两个版本信息,versionName(面向用户的字符串)和 versionCode(一个整数,用于进行比较以确定什么是更新)。有关其他信息,请参阅 Android 开发人员文档。 请确保没有相互矛盾的信息(例如,不匹配的 AndroidManifest.xml 和 build.gradle)。
我们尽量只建立你认为是发布版本的东西。这些版本应该有相匹配的版本名称,更重要的是,与你自己构建的版本代码相匹配,并且是由相同的代码构建的。显然,如果你的源代码历史是清晰的,这项工作就更容易了
- 例如,如果发布版本被标记或以其他方式标记。如果你对发布版本进行了标记,请确保你保持相同的标记方案,例如,如果你开始使用 “v” 前缀,请一直使用。
我们尽量不从一个随机的存储库 head 版本进行构建。
我更新时需要告诉你吗?
我们将检测应用的新版本并相应地更新我们的元数据,这将使我们检查代码并向系统添加新版本。标记对添加新版本有很大帮助,但请记住每次都要将标记推送到源存储库。当然,如果你将源代码移动到其他网站,则应告诉我们。目前,当 AndroidManifest.xml 移动时,检测新版本存在一些问题,因此,如果有紧急情况,你可以告知我们是否会发生这种情况。
一些应用开发者在发布时向我们提交合并请求,并附上所有相关的构建数据。你不需要这样做,但它可以加快事情的进展。从历史上看,作为一个小型社区项目,我们处理更新的速度比我们希望的要慢,但这种情况一直在改善。
我们的更新检查是愚蠢的,只是抓取构建文件:我们不运行任何构建代码,所以不使用基于时间的版本管理或任何其他类型的在构建时计算你的版本(例如,将它们移动到多个子版本,在构建时被串联起来,甚至有复杂的函数调用来做这个)。
我已经发布了一个新版本。为什么它不在存储库中?
当我们检测到新版本时,可能需要几天时间它才能进入存储库,因为构建过程分几步,且每天只运行一次。在构建完成之前,您应用的监控页面将在 F-Droid Monitor - Need updating 中列出它。只要 版本 下注明”当前(推荐)版本为 xxx(版本代码 yyy)”的文本显示与你的最新版本对应的版本号,我们检测到它,APK 应该很快就会发布。只要给它一些时间。
另一个原因可能是应用构建失败。你可以在 F-Droid Monitor - Running 中查看构建过程,在 Build 中查看前一周期。
签名呢?
由 F-Droid 构建的软件包由 F-Droid 签名,因此官方 F-Droid 存储库中的所有应用都由 F-Droid 密钥签名。F-Droid 将为每个包含的应用生成一个新的密钥。所有由不同版本的应用构建的不同 APK 将由同一个应用密钥签署。但是请注意:如果一个应用也由开发者签名的 APK 发布,比如在 Google Play 商店,那么 F-Droid APK 将有不同的签名。
Android 操作系统要求,一个应用要想在原地升级,它的签名必须与当前安装的版本相同。这可以防止无意中安装一个不受信任或不想要的升级,也可以保护应用的私有数据,这些数据只能由该应用(或被授予根权限的应用)访问。
这种情况会给想要从一方签名的版本切换到另一方签名的版本的用户带来一些不便。例如,如果用户正在运行他们通过 F-Droid 安装的版本,并且稍后希望切换到你签名并通过另一个渠道自行分发的版本,则他们必须执行卸载并重新安装该应用的额外步骤。就其本身而言,这甚至不足以构成轻微的不便
- 但是,卸载的后果是该应用的私人数据被删除(再次,这是为了安全起见),因此用户可能希望首先导出它,然后重新导入它。
我们还支持可重复构建,因此我们可以从源代码构建版本,并对比你的官方版本进行检查。如果它们匹配(忽略签名),我们可以发布你的官方 APK,并使用你的签名。这是一项繁琐的任务,因为我们必须对构建参数和工具进行标准化,但从长远来看,这应该是值得的。我们还尝试验证我们自己的构建并得到了很多二进制差异,请参阅我们的验证服务器结果。 但是,随着时间的推移,情况会有所改善。
由我的密钥签署的 APK 能否被包括在内?
是的,对于可重复构建,在验证过它们的确可重复构建后,F-Droid会将你签过名的 APK 文件包含在官方 F-Droid 存储库中。如果失败了(比如你的应用不能以可重复的方式进行构建或者当你想要分发带闭源部件或 API 密钥等东西的应用时),你可以在你自己的”F-Droid 二进制文件存储库“中放置任意 APK 文件,想获得你的 APK 的人可以将你的存储库添加到 F-Droid 客户端中。
可重复构建是必需的吗?
不。但我们认为它们是最佳实践并希望你会考虑试着让你的应用可重构。参阅我们的 inclusion how-to 了解更多信息。
How can I handle “fsck error in packed object” for my app?
In order to ensure that our buildserver gets the exact same commits as you
put into git, git
fsck
is enabled by
default whenever new commits are fetched. Enabling git fsck
ensures
that the commits match
their SHA1 checksum. Sometimes, git repos have corrupt but usable commits
in them that cannot be changed since the whole history is based on the
corrupt commit. For those cases, we have the
skipList
functionality in
fdroiddata
我可以运行我自己的 F-Droid 软件包存储库吗?
是的!你也可以设置并运行你自己的 F-Droid 应用和其他软件包的仓库。如果你也通过其他应用商店发布你自己的应用,比如 Google Play,我们建议你也将这些发布的应用包含在你自己的二进制版本中,因为除其他原因外,这将为可重复构建提供一个 APK 来源。这个仓库可以是一个“简单的二进制存储库”,它不使用 fdroidserver 构建系统,你也可以托管你自己的完整 F-Droid.org 存储库镜像。
我可以看到谁在安装我的应用吗?
不行。虽然有关安装的信息和指标对你来说是有趣和有用的,但这也需要我们跟踪和监测我们的用户,而我们不会这么做的。我们没有任何关于人们安装什么应用或版本,他们是否保持安装,他们正在运行什么其他软件或操作系统版本的信息,或者其他任何信息,所以我们不能将这些信息传递给你。
我可以从我的应用中跟踪用户吗?
你可以,但如果你在你的应用中包含任何类型的跟踪或分析(甚至是发送崩溃报告),这必须是用户明确选择同意的东西 - 即你在第一次运行时询问他们,在发送任何东西之前,或有一个偏好设置,默认为关闭。在所有其他情况下,我们仍然可能包括该应用,但它将被标记为我们的“跟踪”负面特征,这意味着用户只有在选择查看此类应用时才会看到该应用。
此外,请注意,专有软件的第三方分析库(例如,Google Analytics 或 Flurry)在此不被接受。
我可以包括广告吗?
可以,但是:
- 许多用户不喜欢广告,认为它们具有干扰性。我们对包含广告的应用进行标记,因此人们知道他们将得到什么。他们可以选择是否向他们显示这些应用。
- 将广告纳入一个应用通常是通过包括二进制库(jar 文件)形式的专有软件来完成的。显然,这将使你的应用无法被收录。
哪些库和依赖可以使用?
要做到 FLOSS,你的整个应用都必须是 FLOSS,包括依赖项。如果你使用非自由/专有库,我们无法构建你的应用,因此它不能包含在我们的主存储库中(在这种情况下,请参阅”我可以运行自己的应用存储库吗?”)。不幸的是,这排除了 SDK 管理器中属于 “Google repository” 的任何库(例如 play-services, fabric, firebase) - 只允许使用 “Android support repository”。
对于外部资源,请约束自己使用“众所周知的存储库”,例如 mavenCentral 或 JCenter(请参阅构建元数据参考的 “srclib” 部分中的完整列表)。请注意,例如 Bintray 不仅提供 JCenter,还提供用户存储库。这些不是受信任的存储库列表的一部分。
如果你需要的依赖项不能通过这些存储库获得,请不要直接使用二进制 jar 文件,而是提供一种简单的方法从源代码构建它们:例如,提供一个 “pre-build” 脚本,将它们纳入你的实际构建过程(gradle 任务),或在你的项目中包括库源代码(硬包含或通过子模块)。
已知的 “usual suspects” 的替代品:
请注意,以下这些只是基于流行度的主观建议;可能有其他 FOSS 项目更适合你的需要。
- Crittercism, BugSense — ACRA
- Google Analytics — Piwik
- Google Maps — OpenStreetMap, e.g. 通过 mapsforge or osmdroid
Google 的 SDK 和库不是自由开源软件吗?
虽然 Android 大部分是自由开源软件,但也有很多部分根本不是。Android SDK 的二进制文件是由 Google 在专有许可证下提供的,但几乎所有 Android SDK 的源代码都是在 Apache 许可证下提供的。用于构建使用 Google Services(如 Maps, GCM 等)的应用的 Google API 是自由的,只要该库预装在设备上。几乎所有的 Google 库,如 Play Services, Google Admob 和GCM,都是专有的,不能包含在 F-Droid 主存储库中。
使用哪种构建系统?
我们对基于 “ant” 和 “gradle” 的构建有很好的支持,而 “maven” 只在短时间内使用,并且用于依赖关系。对于其他构建系统,你可能需要向我们提供一些有关如何处理此问题的详细信息,以便我们可以正确设置应用,甚至可以将它们合并到我们的服务器工具中。
关于 Cordova/Phonegap/HTML-Apps 的特别说明:
我们无法直接构建 cordova 应用,但最新版本允许你导出特定于平台的代码,这些代码可以使用 “gradle” 独立构建。因此,现在我们要求此代码在源代码存储库中存在并且是最新的。
如何让我的应用被删除?
作为最佳实践,我们的打包团队在将应用添加到官方的 f-droid.org 存储库之前,通常会确保已经获得上游开发人员的同意。 如果您出于任何原因希望我们从官方的 f-droid.org 存储库中删除您的应用,请直接向我们的打包团队提出要求。让您的请求得到最快处理的方式可能是在我们的 data 问题跟踪器上新开一个问题。您也可以通过我们的其他沟通渠道与我们的团队取得联系。
如何让我的应用被删除?
任何违反我们收录政策的应用更改将使你的应用被删除或存档。 例如,你可以为未来的版本使用一个许可证,禁止任何人分发它,或者你可以在你的源代码中引入专有的二进制文件。这两件事都能确保那些未来的版本不会出现在我们的存储库中,但这离我们把你的应用从存储库中删除还远不够(如以前的版本有严重的安全缺陷,再加上未公布的源代码和不合作的态度)。
在一些罕见的情况下,我们还必须依照我们的其他政策遵守下架请求。 一般来说,我们建议避开商标和版权侵权。
我看到一些大商店里的应用是公然的复制。我将我的应用闭源更好不是吗?
首先,这取决于许可证:除非你应用了像 GPLv3 这样的自由复制许可证,否则其他人可以随意使用源代码(尽管他们可能被要求重新命名)。如果你的应用是 GPLv3,而剽窃者没有公布源代码;他们的版本显然包括专有的广告库,或者任何你的作者的标志被简单地删除,这些副本是违法的,你应该要求谷歌从他们的应用商店删除它们。如果你愿意,你可以用 DMCA 或其他当地法律威胁他们。如果所有其他方法都失败了,在进行专有化之前,请平衡一下自由应用的用户和维护者的损失和混乱与你看到那些非法克隆的人失去他们本来可以得到的几美分广告收入而获得的正义感。从长远来看,我们希望改进通过 F-Droid 捐赠,这样你就可以得到经济上的支持,我们已经支持比特币、莱特币、OpenCollective、Flattr 和 Liberapay 以及其他任何你可以通过网站建议的支付方式。
F-Droid 客户端的 git 工作流是如何构成的?
git
允许人们在工作流程上有很大的灵活性,所以明确定义这个社区的工作流程是很重要的,这样人们就知道该期待什么。F-Droid 客户端应用使用的
git
工作流程相对简单,基于由 github.com、gitlab.com 和其他类似网站建立的非常常见的工作流程。这是对这一工作流程的详细解释:
- 所有的开发工作都在
master
分支中进行 - 代码通过合并请求 (MR) 提交
- 发布在每个主要版本的短期稳定发布分支(例如,
stable-0.95
,stable-0.96
,stable-0.97
,等等)中进行 - 进入稳定发布分支的工作必须十分集中,并尽可能小,以保持尽可能短的发布周期
master
分支绝不能与任何稳定发布分支合并- 稳定发布分支决不能与
master
分支合并 - 稳定发布分支的合并请求可以包括来自
master
的提交 - 并非所有包含在稳定发布分支中的提交都需要包含在
master
中 - 你在你的 git 复刻中做什么由你决定,但最终的合并请求不应该包含合并提交
以下是我们在会议上的讨论,在讨论中我们把这个问题确定下来:https://web.archive.org/web/20171220230923/https://botbot.me/freenode/fdroid-dev/2015-08-04/?msg=46407489&page=1
这篇文章包括对”特性分支”与”发布分支”以及短期与长期分支的良好讨论:http://blogs.atlassian.com/2013/11/the-essence-of-branch-based-workflows/