Skip to content

Latest commit

 

History

History
186 lines (125 loc) · 6.77 KB

File metadata and controls

186 lines (125 loc) · 6.77 KB

参与 Droidspaces 贡献

理念

一个不存在的功能,好过一个有 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 平台。现代桌面内核并不能免除你的补丁 在此要求上的义务。

请在运行老内核的真实硬件上测试你的更改。模拟器和现代原厂内核不足以作为 验证手段。


SoC 和 OEM 覆盖范围(Android)

Droidspaces 运行在高通、猎户座、联发科和紫光展锐芯片上,这些芯片搭载的 OEM 内核与主线存在显著偏差。你的补丁在提交前,必须经过具有代表性的设备 测试。

在 PR 中明确说明你在哪些设备和内核版本上进行过测试。未经测试的兼容性声明 将被视为未测试。

针对特定 SoC 系列或 OEM 内核特有问题的补丁,仅当 Droidspaces 能在运行时 通过检测、条件代码路径或优雅降级的方式自适应此问题,且不会在不受影响的 硬件上引入回归时,才会被接受。如果修复无法以这种方式进行泛化,它应该 放在下游 fork 中,而不是主线里。


Android App 更改

App 的最低要求是 Android 8 (API 26)。对 Android App 的更改不得引入任何 会导致在 Android 8 上崩溃的依赖、API 调用或行为。

在发起 PR 之前,请在 Android 8 上进行测试。仅在较新的 Android 版本上测试 是不够的。


PR 要求

每个功能 PR 必须包含:

  1. 对要解决的真实存在问题的清晰描述。 "我就想要这个"不是一个有效的问题 陈述。请解释在真实硬件上对真实用户来说,什么会出问题、什么会失败或缺少什么。

  2. 截图或终端输出,展示功能按预期运行。

  3. 明确的已测试环境列表。 对于 Android:设备名称、SoC、内核版本以及 OEM /Android 版本。对于 Linux:发行版、内核版本以及架构。

  4. 无冲突。 在你的更改上运行现有行为。如果之前能正常工作的功能现在不行了, 在发起 PR 之前修复它。


代码所有权

如果你的功能被合入,你从此就要对它负责。

当新的内核版本、新的 SoC 特有行为或平台行为变更导致你的贡献出问题时,你应当 负责解决。如果你提交的功能开始引发问题,而你无法联系到或不愿维护它,该功能 将被移除。

用户不知道是谁写的某个功能。当事情出问题时,他们只会责怪项目。在提交代码之前, 请确保你理解你的代码在做什么。如果你无法解释为什么要做某个特定的实现选择, 那么这个选择就不应该进入生产环境。


哪些会被合入

  • 解决真实问题、能在内核 3.10+ 上工作、正确做了平台守卫、并在多种环境下 得到验证的功能。
  • 有清晰复现用例和已验证解决方案的 Bug 修复。
  • 安全改进。这种永远欢迎。
  • 有可衡量、无冲突的性能改进。
  • 文档修正。

哪些会被拒绝

  • 仅能在内核 5.x+ 上工作且无回退方案的补丁。
  • 解决的问题没有真实用户报告过,或无法在狭隘的硬件或平台配置之外复现。
  • 未用 is_android() 守卫的 Android 专用或 Linux 专用代码。
  • 作者在审查中无法解释或辩护的代码。
  • 破坏 Android 8 兼容性的 App 更改。
  • 任何引入回归的改动,无论新行为多么有用。

重复拒绝

如果贡献者提交了多个 PR,由于同样的原因被拒绝——功能解决不了真实存在问题、 不满足通用性要求或给代码库增加不必要的复杂性——他们将被禁止继续贡献。

没有固定的次数限制。判定标准是模式识别:如果很明显一个贡献者不阅读反馈、 不进行适当测试或故意在代码库中填充内容,禁止的决定权在维护者手中,且为最终决定。


安全漏洞

永远欢迎安全修复和加固补丁,它们将被优先审查。

如果你发现了一个漏洞——特别是可在非硬件访问模式下、不使用特权标志就可以 复现的容器逃逸——请不要公开提交 issue。

请私下提交:

请在报告中包含复现用例、受影响的配置以及内核/SoC 详细信息(如果相关)。 在修复可用之前,不应进行公开披露。


流程

  1. Fork 此仓库并在独立分支中工作。
  2. 根据上述要求的信息,向 main 分支发起 PR。
  3. 在审查期间保持响应。无人回应的 PR 将被关闭。
  4. 直接处理审查反馈。不要为同一个修改发起新的 PR。

没有正式的 CLA。提交 PR 即表示你同意你的贡献可以按项目现有许可证进行分发。