一个不存在的功能,好过一个有 Bug 的实现。
Droidspaces 运行在两种截然不同的平台上——Android(硬件范围从古老的厂商冻结 3.10 内核到现代 GKI 设备,涵盖数十种 SoC 和 OEM)以及 Linux 桌面环境。一个在你 的环境上能正常工作、却在别人的环境上会出问题的补丁,不是贡献——是倒退。每一个 被合入核心的改动,都必须毫无例外地遵守这份契约。
Droidspaces 核心必须同时在 Android 和 Linux 上正确工作。这两个环境不可互换, 必须作为独立的目标平台对待。
代码库提供 is_android() 用于运行时平台检测:
int is_android(void) {
static int cached_result = -1;
if (cached_result != -1)
return cached_result;
/* 优先级 1:检查是否处于 Recovery(如 TWRP) */
if (access("/system/bin/recovery", F_OK) == 0) {
cached_result = 0;
}
/* 优先级 2:检查核心 Android 系统标记 */
else if (access("/system/build.prop", F_OK) == 0 ||
access("/system/bin/app_process", F_OK) == 0) {
cached_result = 1;
}
/* 回退:非标准 Android 环境 */
else {
cached_result = 0;
}
return cached_result;
}任何 Android 独有的功能或行为必须用 is_android() 进行防护。
任何 Linux 桌面独有的功能或行为同样必须进行防护。
不要假设运行时环境。不要让 Android 专用代码在 Linux 上执行,反之亦然。未做 平台守卫假设将导致 PR 被拒绝。
最低支持内核:3.10
这是一个硬性底线,不是建议。如果你的实现依赖某个不存在于 3.10 内核的 syscall、
/proc 接口、namespace 特性或内核配置,它将不会被合入主线。
- 不要使用
openat2(2)——5.6 版本之前不可用。 - 不要排他性地依赖 cgroup v2——cgroup v1 必须保持可用。
- 不要假设
clone3(2)、pidfd_*或任何被限制在 5.x 以上版本的 API。 - 如果存在回退路径,请实现它。如果不存在,该功能就不适合放在主线中。
这同时适用于 Android 和 Linux 平台。现代桌面内核并不能免除你的补丁 在此要求上的义务。
请在运行老内核的真实硬件上测试你的更改。模拟器和现代原厂内核不足以作为 验证手段。
Droidspaces 运行在高通、猎户座、联发科和紫光展锐芯片上,这些芯片搭载的 OEM 内核与主线存在显著偏差。你的补丁在提交前,必须经过具有代表性的设备 测试。
在 PR 中明确说明你在哪些设备和内核版本上进行过测试。未经测试的兼容性声明 将被视为未测试。
针对特定 SoC 系列或 OEM 内核特有问题的补丁,仅当 Droidspaces 能在运行时 通过检测、条件代码路径或优雅降级的方式自适应此问题,且不会在不受影响的 硬件上引入回归时,才会被接受。如果修复无法以这种方式进行泛化,它应该 放在下游 fork 中,而不是主线里。
App 的最低要求是 Android 8 (API 26)。对 Android App 的更改不得引入任何 会导致在 Android 8 上崩溃的依赖、API 调用或行为。
在发起 PR 之前,请在 Android 8 上进行测试。仅在较新的 Android 版本上测试 是不够的。
每个功能 PR 必须包含:
-
对要解决的真实存在问题的清晰描述。 "我就想要这个"不是一个有效的问题 陈述。请解释在真实硬件上对真实用户来说,什么会出问题、什么会失败或缺少什么。
-
截图或终端输出,展示功能按预期运行。
-
明确的已测试环境列表。 对于 Android:设备名称、SoC、内核版本以及 OEM /Android 版本。对于 Linux:发行版、内核版本以及架构。
-
无冲突。 在你的更改上运行现有行为。如果之前能正常工作的功能现在不行了, 在发起 PR 之前修复它。
如果你的功能被合入,你从此就要对它负责。
当新的内核版本、新的 SoC 特有行为或平台行为变更导致你的贡献出问题时,你应当 负责解决。如果你提交的功能开始引发问题,而你无法联系到或不愿维护它,该功能 将被移除。
用户不知道是谁写的某个功能。当事情出问题时,他们只会责怪项目。在提交代码之前, 请确保你理解你的代码在做什么。如果你无法解释为什么要做某个特定的实现选择, 那么这个选择就不应该进入生产环境。
- 解决真实问题、能在内核 3.10+ 上工作、正确做了平台守卫、并在多种环境下 得到验证的功能。
- 有清晰复现用例和已验证解决方案的 Bug 修复。
- 安全改进。这种永远欢迎。
- 有可衡量、无冲突的性能改进。
- 文档修正。
- 仅能在内核 5.x+ 上工作且无回退方案的补丁。
- 解决的问题没有真实用户报告过,或无法在狭隘的硬件或平台配置之外复现。
- 未用
is_android()守卫的 Android 专用或 Linux 专用代码。 - 作者在审查中无法解释或辩护的代码。
- 破坏 Android 8 兼容性的 App 更改。
- 任何引入回归的改动,无论新行为多么有用。
如果贡献者提交了多个 PR,由于同样的原因被拒绝——功能解决不了真实存在问题、 不满足通用性要求或给代码库增加不必要的复杂性——他们将被禁止继续贡献。
没有固定的次数限制。判定标准是模式识别:如果很明显一个贡献者不阅读反馈、 不进行适当测试或故意在代码库中填充内容,禁止的决定权在维护者手中,且为最终决定。
永远欢迎安全修复和加固补丁,它们将被优先审查。
如果你发现了一个漏洞——特别是可在非硬件访问模式下、不使用特权标志就可以 复现的容器逃逸——请不要公开提交 issue。
请私下提交:
- 电子邮件: droidcasts@protonmail.com
- Telegram: t.me/ravindu
请在报告中包含复现用例、受影响的配置以及内核/SoC 详细信息(如果相关)。 在修复可用之前,不应进行公开披露。
- Fork 此仓库并在独立分支中工作。
- 根据上述要求的信息,向
main分支发起 PR。 - 在审查期间保持响应。无人回应的 PR 将被关闭。
- 直接处理审查反馈。不要为同一个修改发起新的 PR。
没有正式的 CLA。提交 PR 即表示你同意你的贡献可以按项目现有许可证进行分发。