将 React Native 应用添加到 F-Droid

React Native 是一个流行的开源应用开发框架,可以使用平台的原生 UI 组件轻松构建跨平台应用。这使其成为为所有平台构建应用的开发人员的理想选择。

这就是我们在开始开发新的 EteSync Notes 应用时选择它的原因。它使我们能够在很短的时间内构建一个应用,100% 重用 Android、iOS、Web 上的代码,一旦我们发布桌面客户端,也是如此。

作为一个开源项目,以及 F-Droid 的长期(非常快乐的)用户,我们在构建应用之前的主要关注点之一是:react-native 应用可以在 F-Droid 上构建吗?我们上网查了一下,但没找到明确的答案。然后,我们查看了 fdroiddata 存储库,我们看到了一些地方提到了 react-native,将我们引向 F-Droid 上可用的 react native 应用。所以我们知道了这是可以做到的,我们只是不知道该如何做。

本文的其余部分假设你熟悉 F-Droid 元数据文件以及如何构建普通的 Android 应用

在 F-Droid 上构建 React Native 应用存在一些主要挑战:

  1. React Native 应用有两个构建和依赖管理系统(React Native 的和 Android 的)。
  2. React Native 应用需要比 F-Droid 上可用的 NodeJS 环境版本更新的版本。
  3. React Native 应用具有使用 JavaScript 依赖管理系统交付的预构建依赖项,我们需要告诉 F-Droid 这些组件实际上是 FLOSS 并且与 F-Droid 兼容。

在我们继续解释重要的组件以及它们如何协同工作之前,这里是有效的 EteSync Notes 规范文件供你参考。

你需要注意的第一件事是 subdir 指令。React Native 应用的 android 构建系统位于 repo 的子目录中,而不是根目录中。通常是 android/app,但在你的设置中可能会有所不同。

我们需要的下一件事(在你的情况下可能不需要)是获得足够新的 nodeyarn 版本。F-Droid 使用 Debian Stretch 构建系统,它甚至在 backports 中都没有足够新的 node 版本。因此,获取节点的最简单方法是使用预构建的二进制文件,并验证其校验和,然后使用 npm 安装 yarn。具体如下:

    sudo:
      - curl -Lo node.tar.xz https://nodejs.org/dist/v10.18.1/node-v10.18.1-linux-x64.tar.xz
      - echo "8cc40f45c2c62529b15e83a6bbe0ac1febf57af3c5720df68067c96c0fddbbdf node.tar.xz"
        | sha256sum -c -
      - tar xJf node.tar.xz
      - cp -a node-v10.18.1-linux-x64/. /usr/local/
      - npm -g install yarn

下一步是安装所有 JavaScript 依赖项,这可以使用 init 指令完成,如下所示:init: yarn install

现在,我们应该有了构建 React Native 应用所需的一切,然而构建仍然会失败。这是因为 F-Droid 会自动检测构建中潜在的非自由依赖项,并且如果找到,则不会让构建继续进行。因此,我们应该做的下一件事是告诉它自动去除由我们的JavaScript 依赖引入的所有非自由依赖关系,如下所示:

    scandelete:
      - node_modules/

现在我们正在取得进展,所有潜在的非自由依赖项都被删除了。然而构建仍然会失败,因为实际上我们需要其中一些依赖项!现在,我们需要找到这些依赖并确认我们需要它们并且它们确实是 FLOSS 并且和 F-Droid 兼容。最常见的错误是关于指向 ../node_modules/... 的“无法识别的 maven 存储库”。假设你的所有 JavaScript 依赖项确实都是 FLOSS,这些可以安全地忽略,因为它们只是意味着依赖项来自 JavaScript 依赖项而不是通过 Maven(再次,非常常见)。我们稍后会处理这些。第二个更严重的问题是 .jar.aar.so 文件被删除。在这里,您需要格外小心,以确保这些文件确实是 FLOSS,来自受信任的来源,并且只是为了便于分发而进行了预编译。一旦你找出了所有上述两种错误,你可以告诉 F-Droid 忽略它们。例如,这是我们在 EteSync Notes 中的内容:

    scanignore:
      - android/build.gradle
      - node_modules/jsc-android
      - node_modules/react-native/android/com/facebook/react/react-native/*/
      - node_modules/react-native-appearance/android/build.gradle
      - node_modules/react-native-reanimated/android/build.gradle
      - node_modules/react-native-safe-area-context/android/build.gradle
      - node_modules/react-native-screens/android/build.gradle
      - node_modules/react-native-sodium/libsodium/*/lib/libsodium.so
      - node_modules/react-native-vector-icons/android/build.gradle
      - node_modules/@react-native-community/async-storage/android/build.gradle
      - node_modules/@react-native-community/masked-view/android/build.gradle
      - node_modules/@react-native-community/netinfo/android/build.gradle

所有 React Native 应用都需要前三行。它们就是主要的 React Native 依赖并且确实是 FLOSS。其余部分应根据你自己的依赖项添加,如上所述。请注意,某些 Expo 模块依赖于非自由组件,因此它们可能与 F-Droid 不兼容。

就是这样,你的应用现在应该可以对 F-Droid 构建了。请务必认真检查贡献指南以确保一切正常。

结束语

如你所见,一旦你知道如何在 F-Droid 上构建 React Native 应用是相当容易的。但是,F-Droid 可以进行一些改进,以简化该过程。如果 F-Droid 构建机器将包含一个最新的 Node,并且可能包含一个自动包含上述某些步骤的指令,那就太好了。

以上是我们为了让 EteSync Notes 在 F-Droid 上正确构建所需做的一切。在 EteSync,我们正在努力让构建 FLOSS、端到端加密和尊重隐私的应用变得更容易,这就是我们最近发布 Etebase 的原因。如果你与我们具有相同的保护用户自由和隐私的热情,请来加入我们的社区