构建元数据参考
fdroid update
用于编译公共索引的信息来自多个来源:
- repo 子目录中的 APK、媒体等文件
- metadata 子目录中每个包的“元数据”文件
- metadata 子目录下可本地化的文本和图片
- 嵌入在应用源代码中的可本地化的文本和图片
这些元数据文件是简单且易于编辑的文本文件,文件名通常为“包名称”加文件类型。有大量可用字段可用于添加信息以描述包和/或应用。适用于包或应用的所有发布版本的所有字段,如 AuthorName,都使用以一个大写字母开头的大驼峰式,形如 CamelCase。包括每个构建字段,本地化字段等在内的所有其他字段都使用一个小写字母开头的小驼峰式,形如 camelCase。
请注意,尽管元数据文件被设计为便于人类读取和写入,但它们也可以通过各种脚本进行处理和写入。必要时可自动格式化。结构和注释将正确保留,但字段顺序将标准化。(如果格式化后字段顺序与原文件中的不同,则注释被视为附加到其后面的字段中)。事实上,你可以通过运行以下命令,在不改变功能内容的情况下,使用单个命令标准化存储库中的所有包:
fdroid rewritemeta
或对特定应用,运行:
fdroid rewritemeta org.adaway
标记和数据格式
F-Droid 元数据用 YAML 写成,文件扩展名为 .yml
。 最上面的数据结构是”地图“或”目录“,由 key/value 对组成。 所有的 key 均为字符串。 有一些用于 value 的内部数据类型:
TYPE_BOOL
- 要么true
,要么false
。TYPE_BUILD
- 构建条目列表,条目是 key/value 对的映射。TYPE_INT
- 十进制格式的整数。TYPE_LIST
- 字符串列表。TYPE_MULTILINE
- 多行文本的区块。TYPE_SCRIPT
- 将作为 bash 脚本执行的字符串或字符串列表。TYPE_STRING
- 一条字符串。TYPE_STRINGMAP
- 地图的地图,内部键是 BCP 47 区域设置,值是人类可读的文本。
标准格式是 YAML 1.2。 读取元数据文件的过程容忍度更高,并且在能够提供可靠转换的情况下会执行一些自动类型转换。 fdroid rewritemeta
将输出 YAML 1.2,因此如果原始值已被转换,则不会保留写入的原始值。
字段
以下部分描述了文件中可识别的字段。
- Categories (分类)
- AuthorName (作者名)
- AuthorEmail (作者电子邮箱)
- AuthorWebSite (作者网站)
- License (许可证)
- AutoName (自动命名)
- Name (应用名称)
- WebSite (网站)
- SourceCode (源代码)
- IssueTracker (问题跟踪器)
- Translation (翻译)
- Changelog (更新日志)
- Donate (捐赠)
- FlattrID
- Liberapay
- OpenCollective
- Bitcoin (比特币)
- Litecoin (莱特币)
- Summary (概要)
- Description (描述)
- MaintainerNotes (维护者注解)
- RepoType (存储库类型)
- Repo (存储库)
- Binaries (二进制文件)
- Builds (构建)
- Builds.versionName (版本名)
- Builds.versionCode (版本代码)
- Builds.commit(提交)
- Builds.disable (禁用)
- Builds.subdir (子文件夹)
- Builds.submodules (子模块)
- Builds.sudo
- Builds.timeout (超时)
- Builds.init
- Builds.oldsdkloc
- Builds.target
- Builds.androidupdate
- Builds.encoding
- Builds.forceversion
- Builds.forcevercode
- Builds.rm
- Builds.extlibs
- Builds.srclibs
- Builds.patch
- Builds.prebuild
- Builds.scanignore
- Builds.scandelete
- Builds.build
- Builds.buildjni
- Builds.ndk
- Builds.gradle
- Builds.maven
- Builds.preassemble
- Builds.gradleprops
- Builds.antcommands
- Builds.output (输出)
- Builds.postbuild
- Builds.novcheck
- Builds.antifeatures (负面特征)
- AllowedAPKSigningKeys(允许的 APK 签名密钥)
- AntiFeatures(负面特征)
- Disabled (已禁用)
- RequiresRoot (需要根权限)
- ArchivePolicy (存档策略)
- UpdateCheckMode (更新检查模式)
- UpdateCheckIgnore (更新检查忽略)
- VercodeOperation (版本代码操作)
- UpdateCheckName (更新检查名称)
- UpdateCheckData (更新检查数据)
- AutoUpdateMode (自动更新模式)
- CurrentVersion (当前版本)
- CurrentVersionCode (当前版本代码)
- NoSourceSince (源代码不可用日期)
Categories (类别)
要将应用置入的任意数量的类别。没有固定的类别列表 - 客户端和网站都会自动显示任何应用中存在的任何类别。但是,如果元数据用于 F-Droid 主存储库,则应该使用现有的类别之一(连接
、开发
、游戏
、图像
、互联网
、金融
、多媒体
、导航
、手机 & 短信
、阅读
、科学&教育
、安全
、体育&健康
、系统
、主题
、时间
、写作
)或讨论提案以增加一个新类别。Categories 必须是一个项目列表,即使只有一个项目。
在 XML 文件(index.xml)中,该字段将被转换为 (<categories>
)。
AuthorName (作者姓名)
作者名字可为全名、缩写或别名。如果存在,它应该等同于上游发布的名称,例如在其版权或作者文件中。该部分可省略(或留空)。
警告:这会覆盖应用源代码中设置的所有 AuthorName 项。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<author>
)。
AuthorEmail (作者的电子邮箱)
作者的电子邮箱地址。可省略(或留白)。
警告:这会覆盖所有的 AuthorEmail 条目在应用的源代码中设置。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<email>
)。
AuthorWebSite (作者网站)
作者网站的链接。可省略(或留空)。
警告:这会覆盖所有的 AuthorWebSite 条目在应用的源代码中设置。
License (许可证)
在用户可以安装的二进制文件意义上的应用的总体许可证。值应对应于 SPDX 许可证列表的短标识符。这里只能列出一个许可证。如果有多个适用于源代码的许可证,那么这个字段应该包含整个应用可以使用的限制性最小的许可证。当多个许可证结合时,通常意味着限制性最强的许可证获胜。
这个字段不能表示适用于部分应用的许可证的复杂性,或者整体在一个以上的许可证下发布的应用。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<license>
) 。
AutoName (自动命名的应用名)
应用的名称可以最好地从源代码中检索出来。这样做是为了让 fdroid checkupdates
能够在发现应用的新更新时,在创建的提交描述中放入一个熟悉的名字。AutoName 条目在 fdroid checkupdates
运行时自动生成,并且只用于 fdroid checkupdates
生成的提交消息。
Name(名称)
应用的标题,可选描述性短语。这个字段将覆盖所有其他来源的应用名称,包括从 APK 和本地化元数据中抓取的名称。一般不需要设置 Name,因为应用的正确名称是从 APK 文件中检索出来的。然而,在 APK 包含一个坏的或缺失的应用名称的情况下,可以用这个来覆盖它。请注意,这只覆盖客户端显示的应用列表中的名称;它并不改变源代码中的名称或应用标签。
50 个字符限制
警告:这会覆盖所有的 Name / title 条目在应用的源代码中设置。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<name>
)。
WebSite (网站)
该应用的网站 URL。如果没有相关的网站,可以省略(或留空)。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<web>
)。
SourceCode (源代码)
用于查看或获取应用源代码的 URL。这应该是人类友好的页面。机器可读的源代码在由 Repo 字段涵盖。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<source>
)。
IssueTracker (问题追踪器)
应用的问题跟踪器 URL。可选,因为不是所有的应用都有。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<tracker>
)。
Translation (翻译)
应用的翻译门户或至少是一个指南的 URL。可选,因为不是所有的应用都有。
在 JSON 文件中 (index.json),该字段将被转换为 (翻译
)。
Changelog (变更日志)
应用的更新日志 URL。可选,因为不是所有的应用都有。
在XML 文件 (index.xml) 中,该字段将被转换为 (<changelog>
)。
Donate (捐赠)
用于捐赠项目的 URL。这应该是项目的捐赠页面,如果有的话。
在这里使用直接的 PayPal 链接是可能的,如果这是仅有的。然而,请记住,开发者可能不知道这个直接链接,如果他们后来改用了一个不同的 PayPal 账户,或者 PayPal 链接的格式改变了,就可能出错。最好是使用开发者明确公开的链接,而不是使用自动生成的“按钮代码”。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<donate>
)。
FlattrID
项目的 Flattr (https://flattr.com) ID,如果有的话。这应该是一个数字 ID,使(例如)https://flattr.com/thing/xxxx 直接指向为该项目捐款的页面。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<flattr>
)。
Liberapay
项目的 Liberapay (https://liberapay.com) 用户或组名,如果有的话。这应该是一个由字母数字组成的名字,使(例如)https://liberapay.com/xxxxx 可以重定向到你的账户页面。这曾经是 LiberapayID,通过在你的团队页面后面添加 /public.json 从 Liberapay 网站获取的一个数字 ID。
在 XML 文件 (index.xml)中,该字段将被转换为 (<liberapay>
)。
OpenCollective
项目的 OpenCollective (https://opencollective.com) 用户或组名,如果有的话。这应该是一个字母数字组成的名称,使(例如)https://opencollective.com/xxxxx 指向你的账户页面。
Bitcoin (比特币)
一个用于捐赠项目的比特币地址。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<bitcoin>
) 。
Litecoin (莱特币)
一个用于捐赠给项目的莱特币地址。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<litecoin>
)。
Summary (概要)
关于该应用是什么的简介。Summary 用于 F-Droid 客户端的应用列表和磁贴视图中,并作为其他一些视图的副标题。
80 个字符限制
警告:这会覆盖所有的 Summary ,即”short description”条目 在应用的源代码中设置。
在 XML 文件(index.xml) 中,该字段将被转换为 (<summary>
)。
Description (描述)
对应用最新版本的完整描述。这可以跨越多行(每行应保持在 80 个字符以内),并以包含一个单 ‘.’ 的行作为结束。
描述的格式遵循许多应用商店的既定惯例:
- 可以使用基本的 HTML 格式化。
- 换行将被保留。
- f-droid.org 上的其他软件包的链接将在网站上显示为可点击链接,其他链接将显示为纯文本。
与从更早版本更新有关的注释信息是很有帮助的;应用是否包含任何由上游开发者预构建内容,或者是否移除了非自由元素;应用是否处于快速开发阶段,或者最新版本是否落后于当前版本;应用是否支持多种架构,或者是否有指定的最大 SDK(此类信息未被记录在索引中)。
4000 个字符限制
警告:这会覆盖所有的 Description ,即“full description”条目 在应用的源代码中设置。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<desc>
)。
MaintainerNotes (维护者注解)
这是一个多行字段,使用与描述相同的规则和语法。它用于记录 F-Droid 维护者的注意事项,以协助维护和更新仓库中的应用。
这些信息也会发布到维基上。
RepoType (存储库类别)
存储库类型 - 用于从源代码自动构建。如果不指定这个,这个应用的自动构建将被禁用。可能的值为:
- ‘git’
- ‘svn’
- ‘git-svn’
- ‘hg’
- ‘bzr’
- ‘srclib’
Repo (存储库)
存储库的位置。通常是 git: 或 svn: URL。
git-svn 选项连接到一个 SVN 仓库,你以完全相同的方式指定 URL,但 git 被用作后端。出于性能方面的考虑,这样做比较好,而且还因为在上游仓库消失的情况下,可以在本地拷贝整个历史。(这种情况时有发生!)为了将 Tags 作为 UpdateCheckMode 用于该 VCS 类型,URL 必须设置 tags= 特殊参数。同样,如果你打算使用 RepoManifest/branch 方案,你也要指定 branch=。最后,还可以加上 trunk=。所有这些特殊参数将依次传递给 “git svn”,其值必须是 svn repo 根目录的相对路径。下面是一个复杂的 git-svn Repo URL 的例子:http://svn.code.sf.net/p/project/code/svn;trunk=trunk;tags=tags;branch=branches
如果 RepoType 是 srclib
,那么你必须指定相应的 srclib .yml 文件的名称。例如,如果存在 srclibs/FooBar.yml
并且你想使用这个 srclib,那么你必须将 Repo 设置为 FooBar
。
Binaries (二进制文件)
验证过程中使用的二进制文件的位置。
如果指定了,F-Droid 将验证输出的 APK 文件和指定的文件。你可以使用 %v 和 %c 来指向当前构建的版本名称和版本代码。为了验证 F-Droid 客户端本身,你可以使用:Binaries: https://f-droid.org/repo/org.fdroid.fdroid_%c.apk
如果验证成功,F-Droid 将使用上游的二进制文件。
Builds (版本)
可以有任何数量的子条目,每个条目都指定了一个从源代码自动构建的版本。例如:
Builds:
- versionName: '1.2'
versionCode: 12
commit: v1.2
- versionName: '1.3'
versionCode: 13
commit: v1.3-fdroid
:指定构建版本 xxx,该版本的代码为 yyy。
:commit 参数指定了在源代码库中构建它的标签、提交或修订号。
除了上述三个始终需要的参数外,还可以添加更多的参数(以 name: value
的格式)来对构建进行进一步配置。这些参数是(大致按应用顺序排列):
这个功能的目的是让不可编译的版本(比如说源代码没有发布)被标记出来,
这样脚本就不会产生关于它们的重复信息。
(同时也是为了记录这些信息以便日后查阅)。
如果一个 APK 已经被构建了,
禁用会导致它在 `fdroid update` 运行后被删除;
这是的确需要替换一个版本时所需的步骤。
:如果项目(仅 git)有子模块,则使用 - 使得 git submodule update --init --recursive
将在源代码被克隆后执行。子模块在构建前和主应用存储库本身一样被重置和清理。
:指定一个使用 sudo bash -x -c "xxxx"
在 buildserver VM guest 中运行的脚本。这个脚本是以完全的 root 权限运行的,但在每次构建后,其状态将被重置。绝大多数的应用都是使用标准的 Debian/stable 基本环境来构建的。这对于设置需要非常特殊东西的复杂的构建服务器是很有用的。 而这些东西不适合在所有的构建中安装或者与其他构建冲突。
:该构建的时间限制(以秒为单位)。到时间之后,buildserver VM 会被强制终止。默认是 7200(2小时);0 表示没有限制。
限制只适用于服务器模式,即当 `fdroid build` 被使用 `--server` 选项调用时。
init: xxxx
与 ‘prebuild’ 类似,但在任何其他处理发生之前 在源代码上运行。
你可以使用 $$SDK$$ 和 $$NDK$$ 分别替换 Android SDK 和 NDK 目录路径。以下 不同构建的变量同样可用:$$VERSION$$、 $$VERCODE$$ 和 $$COMMIT$$。
设置后,这运行于
subdir:
。oldsdkloc: true
存储库中的 sdk 位置是旧格式,或者 build.xml 期望如此。 新格式是 sdk.dir ,而非常旧的 格式是 sdk-location。通常而言,如果当你试图 构建时,得到 “com.android.ant.SetupTask cannot be found” 消息,请尝试启用此选项。
:指定一个特定的 SDK 目标进行编译,覆盖代码中由上游定义的值。取决于所使用的构建系统具有不同的作用 - 这个标志目前只影响 Ant,Maven 和 Gradle 项目。请注意,这并不改变 AndroidManifest.xml 中的目标 SDK,它决定了可以包含在构建中的功能的级别。
对于 Ant 项目,
它修改应用和可能的子项目的 _project.properties_。
这可能会导致整个 _build.xml_ 被重写,
如果它是一个“标准”的 Android 文件或不存在就没有问题,
但如果它是高度自定义的文件可能会导致问题。
androidupdate: <auto/dirs>
By default, ‘android update’ is used in Ant builds to generate or update the project and all its referenced projects. Specifying
androidupdate: no
bypasses that. Note that this is useless in builds that don’t use Ant.默认值是 ‘
auto
‘, 它以递归的方式地使用 project.properties 中的路径找到所有要更新的子项目。除此之外,这个值可以是目录组成的列表,目录名之间用英文逗号隔开。 在这些目录中相对于应用程序目录运行 ‘android update’。
encoding: xxxx
用给定的值添加一个 java.encoding 属性到 local.properties 。这个值的编码通常会是 ‘utf-8’。这是由 SDK 的 ant 规则挑选的,并强迫 Java 编译器用这个编码 解释源文本。如果你在编译期间收到 有关字符编码的警告,你可能需要这个。
:如果指定,AndroidManifest.xml 中的软件包版本将被替换为元数据中指定的构建版本名称。
这在一些情况下有用:上游存储库未更新其特定 tag 中的版本;建立一个任意的修订版;构建一个任意的 revision;明显地显示出此版本与上游版本有很大的不同;或者明确表示 APK 被设计用于哪个架构或平台上运行。
:如果指定,AndroidManifest.xml 中的软件包版本代码将被替换为构建的版本代码。另参见 forceversion。
二进制文件: URL
此构建验证过程中所使用的二进制文件的位置。
如果指定了,F-Droid 将验证输出的 APK 文件和指定的文件。 你可以使用 %v 和 %c 来指向当前构建的版本名称和版本代码。 为了验证 F-Droid 客户端本身, 你可以使用:
binaries: https://f-droid.org/repo/org.fdroid.fdroid_%c.apk
如果验证成功,F-Droid 将使用上游的二进制文件。
rm: <path1>[,<path2>,...]
Specifies the relative paths of files or directories to delete before the build is started. The paths are relative to the base of the build directory - i.e. the root of the directory structure checked out from the source respository - not necessarily the directory that contains AndroidManifest.xml.
可以指定多个文件/目录,方法是用 ‘,’ 分隔它们。目录将以递归的方式被删除。
:逗号分隔的 build/extlib
中外部库(jar 文件)的列表,将被放置在项目的 libs
文件夹下。
:逗号分隔的源代码库或 Android 项目列表。每个条目为 name@rev 的形式,其中 name 是预定义的源代码库名称,rev 是在各自版本控制中使用的 revision 或标签。
For Ant projects, you can optionally append a number with a colon at
the beginning of a srclib item to automatically place it in
_project.properties_ as a library under the specified number. For
example, if you specify `1:somelib@1.0`, F-Droid will automatically
do the equivalent of the legacy practice
`prebuild: echo "android.library.reference.1=$$somelib$$" >> project.properties`.
每个 srclib 有一个元数据文件,
位于存储库目录中的 srclibs/ 下,
源代码存储在 build/srclib/ 中。_
RepoType_ 和 _Repo_ 指定方式和应用相同;
Subdir:目录被上游重命名时,可以是英文逗号分割的列表;
Update Project:更新工作目录以及下一级目录中的项目;
Prepare:可用于任何类型的准备,
如果你需要指定目录进行更新,
你也可以在 init/prebuild/build 命令中
使用 `$$name$$`来替换库目录的绝对路径。
目前 srclib 只在上游使用 jar 文件或从不受信任的存储库中提取依赖关系时使用。
因为 srclibs 不能自动更新,
git 子模块是一个更好的选择。
patch: x
应用一个或多个补丁。 ‘x’ 指定一个 (或多个 - 用英文逗号分隔) metadata 下方目录中的文件,文件名与 metadata 文件相同,区别是没有 扩展名。这些补丁中的每一个 都被依次应用到代码中。
:指定一个 shell 命令(或几个命令 - 用 && 连接)在构建前运行。反斜线可以作为转义字符来插入逗号,或者在行尾连接该行和下一行。在其他情况下,它没有特殊含义;特别是,字面的反斜线不应该被转义。
该命令使用 bash 运行。
请注意,在此预构建阶段不应构建任何内容 -
比如,扫描代码和构建 source tarball 在
这之后发生。对于实际执行构建或生成二进制文件的自定义操作,
请使用 'build'。
可以使用 \$\$name\$\$ 将路径替换为引用的 srclib - 有关详细信息,请参阅 `srclib` 目录。
你可以使用 \$\$SDK\$\$ 和 \$\$NDK\$\$ 分别替换
Android SDK 和 NDK 目录路径。比如,当你
需要显式运行 `android update project` 时。此外,下列
不同构建的变量也可用: \$\$VERSION\$\$、
\$\$VERCODE\$\$ 和 \$\$COMMIT\$\$。
设置后,这运行于 [`subdir:`](#build_subdir)。
scanignore: <path1>[,<path2>,...]
:允许从扫描过程中排除一个或多个文件/路径。这应该只在有很好的理由的情况下使用,并且或许可以附加一条评论,解释为什么这是必要的。
扫描源代码树中的问题时,相对路径以此处给出的任何路径开始的相应文件将被忽略。
scandelete: <path1>[,<path2>,...]
:运行扫描过程时,任何触发错误的文件 - 如二进制文件 - 将被删除。它与 scanignore 行为一样,但是它不会忽略这些文件,而是删除它们。
用于当源代码存储库包含二进制文件或其他构建不需要的文件。相比于通过 _rm_ 手动删除它们,使用 _scandelete_ 更容易。
build: xxxx
类似 ‘prebuild’,但在实际构建阶段期间运行 (不过在主 Ant/Maven 构建前)。 请只对进行实际构建的操作使用它。 任何的源码准备都应使用 ‘init’ 或 ‘prebuild’ 来完成。
在 build 之前发生的任何构建都将被忽略,因为在运行 build(或最终构建)之前 Ant、mvn 或 gradle 将被执行以清理构建环境。
你可以使用 $$SDK$$ 和 $$NDK$$ 分别替换 Android SDK 和 NDK 目录路径。下列不同构建 的变量同样可用: $$VERSION$$,、$$VERCODE$$ 和 $$COMMIT$$。
设置后,这运行于
subdir:
。buildjni: [yes|no|<dir list>]
执行主 Ant 构建前,通过 ndk-build 脚本启用本地代码的构建。 值可以是由相对于主应用程序的多个目录组成的列表, 在这些目录中运行 ndk-build 命令,或者是 对应于 ‘.’ 的 ‘yes’。 使用明确的列表对构建多组件项目很有用。
The build and scan processes will complain (refuse to build) if this parameter is not defined, but there is a
jni
directory present. If the native code is being built by other means like a Gradle task, you can specifyno
here to avoid that. However, if the native code is actually not required or used, remove the directory instead (usingrm: jni
for example). Usingbuildjni: no
when the jni code isn’t used nor built will result in an error saying that native libraries were expected in the resulting package.
:在本次构建中使用的 NDK 版本。该值是 NDK 的版本,是一个字符串,支持两种官方版本方案,例如 r21e 或 21.4.7075529 。支持 NDK r10e 或更高版本。这也可以是一个版本字符串列表,所有列出的版本都会被安装。ANDROID_SDK_ROOT
环境变量将被设置为列表中的第一个版本。
gradle: <flavour1>[,<flavour2>,...]
:用 Gradle 而不是 Ant 进行构建,指定要使用的 flavour。Flavour 是区分大小写的,因为输出 APK 的路径是也是如此。
如果只给定一种 flavour 而且是 'yes' 的话,则没有 flavour 会被
使用。请注意,对于有 flavours 的项目,你必须指定至少
一种有效的 flavour, 因为 'yes' 会分别
构建所有的 flavor。
:用 Maven 而不是 Ant 构建。一个额外的 @<dir> 告诉 F-Droid 在该相对子文件夹下运行 Maven。有时需要使用 @… 才能正确地进行构建。
preassemble: <task1>[,<task2>,...]
:在 Gradle 项目构建中,在 assemble 任务之前要运行的 Gradle 任务列表。
gradleprops: <prop1>[,<prop2>,...]
:要通过命令行传递给 Gradle 的 Gradle 属性列表。属性可以是 foo
的形式或 key=value
的形式。
比如说:`gradleprops=enableFoo,someSetting=bar` 将产生 `gradle -PenableFoo -PsomeSetting=bar`。
antcommands: <target1>[,<target2>,...]
指定另一套 Ant 命令 (target) 而非 默认的 ‘release’。它不能被赋予任何标记, 比如 build.xml 的路径。
output: glob/to/output.apk
Specify a glob path where the resulting unsigned release APK from the build should be. This can be used in combination with build methods like
gradle: yes
ormaven: yes
, but if no build method is specified, the build is manual. You should run your build commands, such asmake
, in build.设置后,这运行于
subdir:
。postbuild: xxxx
类似 ‘prebuild’,但在实际构建阶段之后运行 (主 Ant/Maven 构建)。 仅将此用于对构建输出执行某些后处理的操作。
可以使用
$$name$$
将路径替换为引用的 srclib - 有关详细信息,请参阅srclib
目录。你可以使用
SDK
和$$NDK$$
分别替换 Android SDK 和 NDK 目录路径。以下 不同构建的变量同样可用:$$VERSION$$
、$$VERCODE$$
和$$COMMIT$$
。使用
$$OUT$$
设置输出 APK 文件的路径。设置后,这运行于
subdir:
。novcheck: true
不要通过查看构建输出来检查生成的 APK 的版本名和代码是否正确
- 假设元数据是正确的 。这样的做法剥夺了有用级别的 sanity 检查, 应该只有在无法提取数值的情况下才这么做。
antifeatures: <antifeature1>[,<antifeature2>,...]
:这个特定构建的负面特征列表。它们在 AntiFeatures 中有描述。
AllowedAPKSigningKeys
当用 fdroid update
生成自动二进制存储库时,通常很容易找出所收集的 APK 的预期签名密钥。AllowedAPKSigningKeys
让仓库管理员设置预期的签名密钥,然后 fdroid update
将检查 APK 是否由这些密钥之一签署。如果不是,不匹配的 APK 将不被包含在存储库中。如果 fdroid update --delete-unknown
被指定,不匹配的 APK 将被删除。然后,可以使用一个自动程序将较新的 APK 下载到存储库中,只有当它们有一个已知的良好签名时才会被包含在内。该值是签名证书的 SHA-256 指纹的小写十六进制值。这可以通过以下方式获取:
apksigner verify --print-certs example.apk | grep SHA-256
AntiFeatures
这是可选的 - 如果存在,它包含一个以逗号分隔的列表,其中包括以下任何一个值,描述应用的负面特征。最好在描述中说明具有(这些)负面特征的原因:
- ‘Ads’ - 该应用包含广告。
- ‘Tracking’ - 默认情况下,用户或活动数据被追踪或泄露。如果应用或某一功能在不收集和分享这些数据或向数据收集网络服务(不管该服务是否基于免费软件)提出请求的情况下无法使用,则为真。例如,基于活动的天气数据、地图、头像等的下载(数据托管和交付服务),或上传崩溃日志等。
- ‘NonFreeNet’ - 应用包含推广或依赖非自由网络服务的功能,且该功能不可能或难以被替换。替换需要对应用或服务进行修改。如果有一个简单的配置选项允许将应用指向另一个公开可用的、可自我托管的、自由软件服务解决方案的运行实例,那么就不适用这个负面特征。
- ‘NonFreeAdd’ - 该应用推广非自由插件,因此该应用实际上是其他非自由软件的广告。
- ‘NonFreeDep’ - 应用依赖于一个非自由应用(例如谷歌地图)- 也就是说,它需要在设备上安装它,但不包含它。
- ‘NSFW’ - 应用包含用户可能不希望随处公开或可见的内容,来自网络术语“Not safe for work”。
- ‘UpstreamNonFree’ - 该应用是或依赖于非自由软件。这并不意味着非自由软件包含在该应用中:最有可能的是,它已经以某种方式打了补丁以移除非自由代码。然而,部分功能可能会缺失。
- ‘NonFreeAssets’ - 应用包含并使用非自由资产。最常见情况是应用中使用了在限制商用或进行衍生创作的许可证下授权的艺术作品像是图片、声音、音乐等(比如,任何带 “Non-Commercial” (NC) 或 “No Derivatives” (ND) 限制的 Creative Commons 许可证)。
- ‘KnownVuln’ - 该应用具有已知的安全漏洞。
- ‘ApplicationDebuggable’ - APK 文件是为调试 (
application-debuggable
) 而编译的,这通常使得它不适合普通用户和用例。 - ‘NoSourceSince’ - 这个应用的上游源代码不再可用。要么是该应用已经商业化,要么是存储库被放弃,要么是它已经移到了一个我们目前不知道的地方。这通常意味着不会有进一步的更新,除非源代码重新出现。
在 XML 文件(index.xml) 中,该字段将被转换为 (<antifeatures>
)。
Disabled
如果这个字段存在,该应用不会被放入公开索引。这允许在一个应用被暂时禁止发布时保留元数据。该值应该是对应用被禁用原因的描述。没有 APK 或源代码档案会被删除:要清除APK,请参见 Build Version 部分,或者对开发者构建的 APK 进行手动删除。因此,这个字段是在一个应用已经过期的情况下使用的,因为源代码压缩包被保留。
RequiresRoot
如果应用需要 root 权限才能使用,请将此可选字段设置为 true
。如果用户愿意,可以让客户端过滤掉它。无论是否需要 root 权限,最好在描述中给出一段可能要求 root 权限的条件及其原因。
在 XML 文件 (index.xml)中,该字段将被转换为 (<requirements>
)。
ArchivePolicy(存档政策)
如果配置了一个归档存储库的话,这决定了将应用的旧版本转移到归档存储库的策略。配置设置了一个默认的在主存储库中保留的最大版本数,之后旧版本会被移到归档存储库中。这个特定于应用的策略设置可以覆盖它。
在决定将哪些版本放入存档时,通过 CurrentVersionCode
指定的版本始终被视为最新版本。这意味着当 ArchivePolicy
设置为 1
时,只保留 CVC 对应的 APK,而不一定是版本号最高的那个。
n
是当前唯一受支持的格式, n
是要保留的版本数。 默认值为 3
。 对于有VercodeOperation列表的应用,默认计算方法为3 x 操作数
,例如。 对于有两个操作的应用,对于两个 ABI,将保留 6 个版本。
UpdateCheckMode(更新检查模式)
这决定了用于确定何时有新版本 - 换句话说,由 fdroid checkupdates
进程更新元数据中 CurrentVersion 和 CurrentVersionCode 字段 - 的方法。
有效模式是:
None
- 不进行检查,因为没有适当的自动化方法。应手动检查更新。例如,在部署不稳定或打补丁的版本时;当构建在与 AndroidManifest.xml 不同的目录中完成时;如果开发人员使用 Gradle 构建系统并将版本信息存储在单独的文件中;如果开发人员为每个版本创建一个新分支并且不添加 tag;或者,如果你已更改包名称或版本代码逻辑,请使用此选项。Static
- 不做任何检查 - 要么开发已经停止,要么不需要新版本。这种方法也用于没有其他检查方法的情况下,并且上游的开发者会向我们发布新的版本。RepoManifest
- 在最近一次提交中,在最近一次构建时发现的目录中寻找 AndroidManifest.xml 和 build.gradle 文件。这种方法是否合适,取决于应用的开发者所使用的开发过程。你不应该指定这种方法除非你确定它是合适的。例如,有些开发者在开始开发时而不是在发布时提高版本。如果 AndroidManifest.xml 被移到了不同的目录,或者包的名称发生了变化,它将返回一个错误。它给出的当前版本可能不准确,因为不是所有的版本都适合发布。因此,在构建之前,通常有必要检查当前版本是否已经被上游开发者发布在某个地方,可以通过检查他们发布的 APK 或者源代码存储库中的标签。目前,它在不同程度上适用于除了 srclib 存储库类型以外的每种存储库类型。 对于 git,git-svn 和 hg 存储库类型, 你可以用 “RepoManifest/yourbranch” 作为 UpdateCheckMode, 这样 “yourbranch” 就会被用来代替默认分支。 git 的默认值是 “master”,hg 的默认值是 “default”, git-svn 的默认值是 none(它保持在同一分支)。 另一方面,分支支持还没有在 bzr 和 svn 中实现, 但_RepoManifest_ 仍然可以在没有它的情况下使用。
RepoTrunk
- 对于 svn 和 git-svn 仓库,特别是那些没有附带 AndroidManifest.xml 文件的仓库,Tags 和 RepoManifest 检查将无法工作,因为没有版本信息可以获取。但是,对于那些用 HEAD 指向的提交注释自动化构建过程的应用,RepoTrunk 将把 CurrentVersion 和 CurrentVersionCode 设为该数字。Tags
- 检查源代码存储库中所有被标记的 revision 中的 AndroidManifest.xml 和 build.gradle 文件,寻找最高版本代码。这种方法是否合适,取决于应用的开发者所使用的开发过程。你不应该指定这种方法,除非你确定它是合适的。如果开发者喜欢标记不稳定的版本,或已知忘记标记发布版本,就不应该使用这种方法。像 RepoManifest 一样,如果包含 AndroidManifest.xml 的目录已经移动,它将不会返回正确的值。尽管有这些注意事项,它往往是最受欢迎的 UpdateCheckMode。目前它只适用于 git,hg,bzr 和 git-svn 存储库。在后者的情况下,存储库的 URL 必须包含通往 trunk 和标签的路径,否则将找不到标签。
要只检查匹配特定正则表达式的标签, 只需在末尾添加相应的正则模式即可, 不同模式间用空格隔开 。 这在应用标签为非发布版本(如 X.X-alpha)时非常有用, 你可以用
.*[0-9]$
这样的正则表达式来筛掉不是以数字结尾的标签名。 示例:UpdateCheckMode: Tags .*[0-9]$
可以指定
UpdateCheckData
以从你指定的存储库文件(而不是依靠默认值,在大多数情况下是build.gradle
或AndroidManifest.xml
)中提取版本代码和名称。HTTP
- HTTP 请求被用来确定当前的版本代码和版本名称。这由 UpdateCheckData 字段控制,它的形式是urlcode|excode|urlver|exver
。首先,如果
urlcode
不为空,则获取该 URL 中的文档,并与正则表达式excode
匹配,以其中第一个匹配组作为版本代码。其次,如果
urlver
不是空的, 则获取该 URL 中的文档, 并与正则表达式exver
进行匹配,其中第一组成为版本名。urlver
字段可以简单设置为 ‘.’, 表示和版本代码使用同一文件而不是获取另一个。
VercodeOperation(版本代码操作)
对通过定义的 UpdateCheckMode 获得的版本代码进行操作。%c
将被实际的版本代码替换,整个字符串将被传递给 python 的 eval
函数。
对于我们想为不同的 ABI 编译,但其代码并不总是有尾部零的应用特别有用。例如,将 VercodeOperation 设置为 %c*10+4
,我们将能够跟踪更新,并为每个上游版本构建最多四个不同的版本。
UpdateCheckIgnore(更新检查忽略)
当检查更新时(通过 UpdateCheckMode),这可以用来指定一个正则表达式,如果与版本名称相匹配,将导致该版本被忽略。例如,可以指定 “beta” 以忽略包含该文本的版本名称。
只在 UpdateCheckMode HTTP
中可用。
UpdateCheckName
当检查更新时(通过 UpdateCheckMode),这可以用来指定要搜索的软件包名称。当应用有一个静态的包名但在某些 flavor 中以编程方式改变它,例如在包名的末尾加上 “.open” 或 “.free” 时很有用。
你也可以使用 Ignore
来忽略包名搜索。这只应在某些特殊情况下使用,例如,应用的 build.gradle 文件不包含包名。
UpdateCheckData(更新检查数据)
与 UpdateCheckMode Tags
或 HTTP
一起使用。
UpdateCheckData: <vercode-location>|<RegEx-for-versionCode>|<versionName-location>|<RegEx-for-versionName>
vercode-location
- URL(使用UpdateCheckMode: HTTP
时)或相对于存储库根的路径/文件,留空则检查标签名称(使用UpdateCheckMode: Tags
时)。RegEx-for-versionCode
- 匹配 versionCode 的正则表达式。versionName-location
- 与 vercode-location 相同,只是针对 versionName。.
表示使用 vercode-location,留空则检查标签名称(仅适用于UpdateCheckMode: Tags
)。RegEx-for-versionName
- 与 RegEx-for-versionCode 类似,只是针对 versionName。- 目前还不支持正则表达式管道操作符。
UpdateCheckMode: Tags
例子:
- 代码库根目录中带
pubspec.yaml
的 Flutter 应用:pubspec.yaml|version:\s.+\+(\d+)|.|version:\s(.+)\+
- 使用 git 标签作为版本名:
app/build.gradle|versionCode\s(\d+)||
- 可指定从标签中提取版本名的正则表达式(可选):
app/build.gradle|versionCode\s(\d+)||Android-([\d.]+)
- 如未指定版本代码文件,可从标签中提取代码和名称:
'|\+(\d+)||Android-([\d.]+)'
- 注意:如果你把
vercode-location
留空,一定要在整个值周围使用单引号:UpdateCheckData: '|\+(\d+)||Android-([\d.]+)'
UpdateCheckMode: HTTP
示例:
https://foo/version.json|"version_code":.*"(.*)"|.|"version_name":.*\"(.*)\",
https://foo/version_fdroid.txt|versionCode=(.*)|.|versionName=(.*)
AutoUpdateMode(自动更新模式)
这决定了在有新版本时自动生成新构建的方法 - 换句话说,在元数据中添加新的构建版本行。这与 UpdateCheckMode 功能共同进行 - 也就是说,当一个更新被检测到时,它也会被此功能处理。
有效模式是:
None
- 自动更新被禁用Version
- 已启用自动更新。如
UpdateCheckMode
设为Tags
,那么这个应设为Version
,不带任何正则模式。 勾选的标签被直接使用。如
UpdateCheckMode
设为HTTP
, 那么应在Version
之后添加一个模式。 该模式用来生成一个用于新构建块的commit:
属性的值(标签名)。 它是简单的文本, 其中%v
和%c
分别被替换成所需的版本名称和版本代码。 产生的字符串必须与应用存储库中的现有标签相匹配, 然后 F-Droid 将使用该标签来构建相应的版本。例如,如果一个应用总是有一个标签
2.7.2
对应于 2.7.2 版本, 你可以简单地指定Version %v
。 如果一个应用总是有一个标签ver_1234
表示版本代码为 1234 的版本, 你可以指定Version ver_%c
。继续上面的第一个例子, 你可以将其指定为
Version +-fdroid %v
--fdroid
是 F-Droid 将在构建 APK 时 附加到例如在build.gradle
中指定的versionName
的后缀。此外,在这个阶段, 可以在版本名称中添加一个后缀, 以区分 F-Droid 的构建和原始版本。 继续上面的第一个例子,你可以将其指定为
Version +-fdroid %v
--fdroid
为后缀。
CurrentVersion(当前版本)
推荐的版本的名称。应用可能会有更新的版本(例如不稳定的版本),而且几乎肯定会有更老的版本。这应该是被推荐用于一般用途的版本。如果当前版本没有源代码,或者使用的是非自由库,那么最好是仍然自由的最新版本,尽管保留自动更新检查可能仍是权宜之计
- 参见 No Source Since。
这个字段通常会自动更新 - 参见 UpdateCheckMode。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<marketversion>
)。
CurrentVersion(当前版本代码)
与 CurrentVersion 字段相对应的版本代码。这两个字段都必须是正确和匹配的,尽管只有当前版本代码被 Android 用来确定版本顺序以及被 F-Droid 客户端用来确定应该推荐哪个版本。
这个字段通常是自动更新的 - 见 UpdateCheckMode。
如果未设置,客户端将推荐它们能推荐的最高版本,如同 CurrentVersionCode 是无限的。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<marketversion>
)。
NoSourceSince
如果我们缺少上游报告的 CurrentVersion 的源代码,或者非自由元素已经被引入,这里定义了开始缺少源代码的第一个版本。这里不考虑那些只缺少一个或几个版本的源代码,但提供较新版本的源代码的应用 - 这个字段旨在说明哪些应用目前没有分发源代码,以及它们从什么时候开始这样做。
已废弃或删除的字段
Provides
此应用提供的应用的 ID 的逗号分隔列表。这个字段只是一个存根,从未用于任何事情。 index-v1.json 和 _ .yml_ 元数据文件中从未支持过它。
在 XML 文件 (index.xml) 中,该字段将被转换为 (<provides>
)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论