React Native Apps in F-Droid ergänzen
Posted on Oct 14, 2020 by
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:
- React-Native-Apps haben zwei Managementsysteme für Build und Abhängigkeiten (das von React Native und das von Android).
- React-Native-Apps benötigen eine aktuellere NodeJS-Umgebung als sie F-Droid bereitstellt.
- 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.