React Native Apps in F-Droid ergänzen

React Native ist ein beliebtes Open-Source-App-Entwicklungsframework, das die Herstellung plattformübergreifender Anwendungen vereinfacht, indem plattformeigene UI-Komponenten verwendet werden. Das macht es zur ersten Wahl für Entwickler, die für alle Plattformen programmieren.

Darum wählten wir es, als wir begannen an der neuen App EteSync Notes zu arbeiten. Es ermöglichte uns, eine App in sehr kurzer Zeit herzustellen, indem wir 100% des Codes in Android, iOS, dem Web und, sobald wir die Desktopversion veröffentlichen, auch auf dem PC wiederverwenden.

Nachdem wir selbst ein Open-Source-Projekt und (sehr zufriedene) Langzeitnutzer von F-Droid sind, war eine unserer Hauptfragen vor Erstellung der App: Können React-Native-Anwendungen auf F-Droid gebaut werden? Eine Online-Suche erbrachte keine klare Antwort. Wir warfen dann einen Blick auf das fdroiddata-Repository, wo wir einige Erwähnungen von React-Native fanden, was uns zu React-Native-Apps führte, die auf F-Droid abrufbar sind. Wir wussten also, dass es möglich war, es fehlte nur noch das Wie.

Im Rest dieses Artikels wird vorausgesetzt, dass euch F-Droid-Metadatendateien und der Ablauf der Herstellung normaler Android-Anwendungen vertraut sind.

Es gibt ein paar wichtige Probleme beim Bau von React-Native-Apps auf F-Droid:

  1. React-Native-Apps haben zwei Managementsysteme für Build und Abhängigkeiten (das von React Native und das von Android).
  2. React-Native-Apps benötigen eine aktuellere NodeJS-Umgebung als sie F-Droid bereitstellt.
  3. React-Native-Apps besitzen vorgefertigte Abhängigkeiten, die mittels des JavaScript Dependency Management Systems ausgeliefert werden, und wir müssen F-Droid verständlich machen, dass diese Komponenten tatsächlich FLOSS und mit F-Droid kompatibel sind.

Bevor wir mit den Erklärungen fortfahren, was die wichtigen Komponenten sind und wie sie zusammenspielen, hier die funktionstüchtige Spezifikationsdatei für EteSync Notes als Referenz.

Die erste Sache, auf die ihr achten müsst, ist der subdir-Verweis. React-Native-Anwendungen haben ihr Android-Build-System eher in einem Unterverzeichnis des Repos als im Wurzelverzeichnis. Normalerweise ist es android/app, aber das kann in eurem Setup anders sein.

Das nächste, was wir brauchen, was in eurem Fall nicht erforderlich sein muss, ist es, eine ausreichend aktuelle Version von node und yarn zu beziehen. F-Droid verwendet Debian Stretch für das Build-System, was nicht einmal in Backports eine ausreichend aktuelle node-Version besitzt. Die einfachste Art, an Node zu kommen, war also, eine vorgefertigte Binary zu verwenden, deren Checksum zu verifizieren und dann yarn mittels npm zu installieren. Das sieht dann so aus:

    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

Der nächste Schritt ist die Installation aller JavaScript-Abhängigkeiten, das kann mit der init-Anweisung, wie: init: yarn install, erledigt werden.

Jetzt sollten wir alles haben, was wir für den Build unserer React-Native-App brauchen, auch wenn die Builds immer noch fehlschlagen werden. Der Grund dafür ist, dass F-Droid automatisch potentiell unfreie Abhängigkeiten im Build erkennt und bei einem Fund diesen nicht fortsetzen wird. Deshalb ist die nächste Sache, die wir erledigen sollten, all die proprietären Abhängigkeiten, die wir durch unsere JavaScript Deps bezogen haben, automatisch loszuwerden, z. B. so:

    scandelete:
      - node_modules/

Nun haben wir Fortschritte gemacht und alle der potentiell proprietären Abhängigkeiten sind entfernt worden. Allerdings wird der Build weiterhin fehlschlagen, weil einige dieser Abhängigkeiten eigentlich gebraucht werden! Nun liegt es an uns, die Deps herauszufinden, die wir benötigen, und sicherzustellen, dass sie wahrhaftig FLOSS und mit F-Droid kompatibel sind. Der häufigste Fehler ist ein „unerkanntes Maven-Repository“, das auf ../node_modules/...verweist. Vorausgesetzt all eure JavaScript-Abhängigkeiten sind wirklich FLOSS, dann kann dies bedenkenlos ignoriert werden, da dies einfach bedeutet, dass die Deps aus einer JavaScript-Abhängigkeit stammt anstatt über Maven (wiederum, sehr häufig). Wir werden uns gleich damit beschäftigen. Beim zweiten, ernsteren Problem geht es um entfernte .jar, .aar und .so-Dateien. Hier müsst ihr besondere Sorgfalt darauf verwenden, sicherzustellen, dass diese Dateien wirklich FLOSS sind, aus einer vertrauenswürdigen Quelle stammen und nur vorkompiliert sind, um sie einfacher zu verteilen. Sobald ihr alle Vorkommen der beiden o. g. Probleme aufgespürt habt, könnt ihr F-Droid sagen, sie zu ignorieren. In EteSync Notes haben wir dann beispielsweise Folgendes:

    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

Die ersten drei Zeilen werden bei allen React-Native-Anwendungen gebraucht. Sie sind einfach die wichtigsten React Native Deps, die wirklich FLOSS sind. Der Rest sollte, abhängig von euren eigenen Abhängigkeiten, ergänzt werden wie oben beschrieben. Zu beachten ist, dass einige Expo-Module von proprietären Komponenten abhängen, wodurch sie inkompatibel mit F-Droid sein können.

Das wars, eure App sollte sich nun für F-Droid herstellen lassen. Achtet einfach darauf, die contribution guidelines durchzuziehen, um sicherzustellen, dass alles in Ordnung geht.

Schlussbemerkungen

Wie ihr sehen könnt, ist es ganz einfach, React-Native-Anwendungen auf F-Droid zu bauen, sobald man weiß wie. Allerdings, gäbe es ein paar Verbesserungen, die in F-Droid aufgenommen werden könnten, was den Vorgang vereinfachen würde. Es wäre großartig, wenn die Build-Maschinen von F-Droid ein aktuelles Node bereithielten, und potentiell vielleicht auch eine Anweisung, die einige der o. g. Schritte automatisch beinhaltet.

Das Genannte ist alles, was wir tun mussten, damit EteSync Notes ordnungsgemäß auf F-Droid gebaut wurde. Wir, bei EteSync, versuchen, die Herstellung von FLOSS, End-zu-End-verschlüsselten und die Privatsphäre respektierenden Anwendungen zu vereinfachen, weshalb wir vor kurzem Etebase veröffentlicht haben. Wenn ihr unsere Leidenschaft für den Schutz von Anwenderfreiheiten und -privatsphäre teilt, schaut bei uns rein und schließt euch unserer Community an.