Einrichtung eines F-Droid-App-Repos

F-Droid.org ist die Standardpaketquelle (Repository, Repo) im F-Droid-Client, aber es ist nicht die einzig mögliche. Jeder kann sein eigenes Repo erstellen, und Anwender können steuern, welche Repos ihr Client verwendet, sogar inklusive der Deaktivierung des Standardrepos von f-droid.org. Dieses Modell ist an die Distribution Debian GNU/Linux angelehnt. Wie in Debian und Ubuntu kannst du auch eigene Repos einrichten, die jeder nutzen kann. Benutzerdefinierte Repos müssen nicht einmal die APKs erstellen, sie können nur „einfache Binärdatei-Repos“ beliebiger APKs sein.

Übersicht

Wenn du ein einfaches Binärdatei-Repository mit APKs und Paketen unterhalten möchtest, die du anderweitig bezogen hast, ist der Vorgang recht einfach:

  1. Server-Tools einrichten
  2. Ein Verzeichnis mit dem Namen fdroid erstellen, dann fdroid init in diesem Verzeichnis ausführen um den Signierschlüssel zu erzeugen der dein Repository eindeutig identifiziert.
  3. Optional kannst du die Datei config.yml nach deinen Vorlieben bearbeiten, detaillierte Beispiele findest du in examples/config.yml
  4. In fdroid ein Verzeichnis namens repo erstellen und APK-Dateien darin ablegen.
  5. fdroid update ausführen.
  6. Bei Meldungen zu fehlenden Metadatendateien kannst du sie im Verzeichnis metadata erstellen und den Vorgang wiederholen.
  7. Um das Erstellen von Metadatendateien zu vereinfachen, führe fdroid update mit der Option -c aus. Dadurch werden fehlende ‘skeleton’-Metadatendateien erstellt, die du dann einfach bearbeiten und mit den Details füllen kannst.
  8. Hast du Änderungen vorgenommen, führe anschließend erneut fdroid update aus.
  9. Das Ausführen von fdroid update fügt ein icons-Verzeichnis zum Repo-Verzeichnis hinzu und erstellt auch die Repository-Indexdateien (index.xml, index.jar, usw.) HINWEIS: Um diesen Vorgang sicher durchzuführen, lies bitte den Abschnitt Reales Setup weiter unten!
  10. Veröffentliche den resultierenden Inhalt des Verzeichnisses repo auf deinem Webserver (oder setze serverwebroot in deiner config.yml und verwende dann fdroid deploy)

Durch die oben beschriebenen Schritte wird ein repo-Verzeichnis erstellt, das du einfach auf einen beliebigen HTTP- (oder vorzugsweise HTTPS-)Server verschieben musst, um es zugänglich zu machen.

Während einige Informationen über die Anwendungen (und deren Versionen) direkt aus den APK-Dateien abgerufen werden, stammen die meisten aus der entsprechenden Datei im Verzeichnis metadata/. Die Metadatendatei, die ALLE Versionen einer bestimmten Anwendung abdeckt, heißt package.id.yml, wobei package.id die eindeutige Kennung für dieses Paket ist. Alle Build-Metadatenfelder sind für binäre APKs relevant, mit Ausnahme von Builds:-Einträgen, die weggelassen werden sollten.

HOWTO für ein lokales Demo-Repo

Dies ist eine vollständige Anleitung zum Einrichten deines eigenen Repository, wo immer du es hosten möchtest. Es ist etwas technisch, du wirst das Terminal benutzen, aber musst kein Terminal-Experte sein, um mitzumachen. Zunächst führt dich diese Anleitung durch die Einrichtung eines nicht sehr sicheren Test-Repos. Anschließend wird die Einrichtung eines Repositorys für den realen Einsatz beschrieben, wobei sich der Signierschlüssel auf einem anderen Rechner als dem öffentlichen Webserver befindet. Bevor du beginnst, benötigst du die fdroidserver-Tools und einen Webserver. Für den Webserver wird in dieser Anleitung nginx verwendet, da es sehr schlank ist, aber du kannst auch jeden anderen Webserver verwenden, den du bereits betreibst.

sudo apt-get install nginx

In diesem HOWTO werden wir ein „einfaches Binärdateien-Repository“ einrichten, um eine Sammlung von APKs zu hosten. Das Repo wird im empfohlenen Unterverzeichnis fdroid/ eingerichtet. Dies gibt dem fdroid-Tool ein eigenes Verzeichnis zum Arbeiten und kennzeichnet die Repo-URL eindeutig als F-Droid-Repo. Außerdem sucht der F-Droid-Client automatisch nach einem Repository im Pfad /fdroid/repo, wenn der Benutzer nur den Server (z. B. „https://f-droid.org“) benutzt. Geben wir unserem normalen Benutzer die Kontrolle über dieses Unterverzeichnis im Web-Root, sodass wir die F-Droid-Tools nicht als root ausführen müssen (bei nginx ist das Webroot /usr/share/nginx/www, bei anderen Webservern ist es anders):

sudo mkdir /usr/share/nginx/www/fdroid
sudo chown -R $USER /usr/share/nginx/www/fdroid
cd /usr/share/nginx/www/fdroid
fdroid init

Lege nun deine APK-Dateien in /usr/share/nginx/www/fdroid/repo ab, und schon kannst du die Befehle zum Erstellen des Repositorys ausführen (wenn fdroid init dein Android-SDK in /opt/android-sdk oder $ANDROID_HOME nicht finden kann, wirst du zur Eingabe des Pfads aufgefordert):

cd /usr/share/nginx/www/fdroid
cp /pfad/zum/\*.apk /usr/share/nginx/www/fdroid/repo/
fdroid update --create-metadata

Fertig! Jetzt hast du ein funktionierendes F-Droid-Repo! Denke daran, dass dies nur ein Test-Setup ist. Fahre danach mit dem Realen Setup fort! Füge dein neues Repo zu einem F-Droid-Client auf deinem Android-Gerät hinzu, um es zu testen. Dies geschieht über das Untermenü Paketquellen verwalten in den Optionen. Die URL deines Repos ist der Hostname oder die IP-Adresse deines Rechners mit /fdroid/repo/ am Ende, also https://mysecureserver.com/fdroid/repo/ oder http://192.168.2.53/fdroid/repo/. Du kannst die offiziellen Repos vorübergehend deaktivieren, um zu sehen, was F-Droid in deinem neuen Repo gefunden hat.

Du kannst das Repository zwar unter einer beliebigen URL bereitstellen, es ist jedoch üblich, es unter einer URL verfügbar zu machen, die mit /fdroid/repo/ endet. Ein guter Grund dafür ist, dass der F-Droid-Client einen Intent-Filter einrichtet und sich selbst für solche URLs registriert. Wenn ein Nutzer, der die F-Droid-App installiert hat, eine solche wohlgeformte URL öffnet, wird auf seinem Gerät F-Droid geöffnet und er wird direkt zum Hinzufügen des Repositorys geführt.

Anpassung

Du kannst dein Repo auch anpassen, indem du die Konfigurationsdatei bearbeitst. Stelle sicher, dass du einen Programmiertext-Editor wie editor /usr/share/nginx/wwww/fdroid/config.yml verwendest. In der Konfigurationsdatei kannst du den Namen des Repos, die Beschreibung, das Symbol, die Pfade zu bestimmten Versionen der Build-Tools, Links zu einem verwandten Wiki und ob Statistiken gespeichert werden sollen, festlegen. Hier ist die grundlegende Repo-Beschreibung:

repo_url = "http://guardianproject.info/fdroid/repo"
repo_name = "My Local Repo"
repo_icon = "GP_Logo_hires.png"
repo_description = """
Ein lokales Test-Repository von Hans-Christoph Steiner <hans@guardianproject.info>.
Es handelt sich um ein Repository mit Guardian-Project-Apps. """

Um dein Symbol in dein Repo einzufügen, wähle ein PNG-Bild, das du in dein Repo einfügen möchtest. Das PNG-Bild wird in /usr/share/nginx/www/fdroid/ abgelegt, die Datei kann beliebig benannt werden (standardmäßig lautet der Name fdroid-icon.png). Wenn du den Standardnamen änderst, musst du repo_icon und archive_icon in /usr/share/nginx/www/fdroid/config.yml aktualisieren.

Ein letzter Hinweis zur Sicherheit: dieses Setup ist kein gutes Setup für ein echtes öffentliches Repo, sondern eine schnelle und einfache Möglichkeit, F-Droid zu testen. Stelle zumindest bei der Generierung des Repos sicher, dass config.yml nicht über das Web erreichbar ist, da es Passwörter enthält. Wenn die Dateiberechtigungen korrekt sind (z. B. chmod 0600 config.yml), dann ist config.yml für den Webserver nicht lesbar.

App-Metadaten

Du kannst viele Aspekte der Darstellung einer App in deinem Repo steuern, indem du die Metadaten der App bearbeitest. Das Ausführen von fdroid update --create-metadata erzeugt Stub-Dateien für dich, um ein funktionierendes Repo zu erhalten. Du kannst dann diese Dateien bearbeiten, um eine Beschreibung, Spenden-Links, Bug-Tracker, Lizenz, Homepage, usw. hinzuzufügen. Weitere Informationen zu allen Optionen findest du unter Build-Metadatenreferenz.

CurrentVersionCode bietet eine praktische Möglichkeit, Beta-Versionen im selben Stream wie deine Vollversionen zu verteilen. Du kannst CurrentVersionCode auf deine aktuelle stabile Version setzen und dann APKs zu deinem Repo hinzufügen. Benutzer werden nur automatisch auf den von dir angegebenen Versionscode aktualisiert. Alle APKs für eine bestimmte Anwendung in deinem Repo, die einen neueren Versionscode haben, werden nicht automatisch installiert. Stattdessen kann der Benutzer sie in der App-Detailansicht im Client sehen und manuell installieren.

Reales Setup

Jetzt, da du ein funktionierendes Repo hast, ist es ganz einfach, eine reale Konfiguration zu erstellen. Das Erstellen eines Repositorys wie oben beschrieben ist sehr einfach, weshalb diese Anleitung damit begonnen hat, aber es ist nicht so sicher, wie es sein sollte, wenn dein Repo dein Hauptverteilungspunkt werden soll. Beispielsweise sollten sich die Repo-Signierschlüssel niemals auf einem öffentlichen Server befinden.

Um diese Situation zu verbessern, erstelle das Repository auf einem nicht öffentlichen Rechner wie deinem Laptop und bewahre config.yml und den Schlüsselspeicher nur auf diesem Rechner auf (denken daran, Backups zu erstellen!). Verwende dann fdroid deploy, um die Änderungen an deinem Repo über ssh auf einem separaten Server zu veröffentlichen. Starte also ein neues Repository von Grund auf auf deinem nicht öffentlichen Rechner:

mkdir ~/fdroid
cd ~/fdroid
fdroid init
cp /pfad/zum/\*.apk ~/fdroid/repo/
fdroid update --create-metadata
emacs config.yml # Serverwebroot usw. ergänzen
fdroid deploy -v

Bearbeite nun config.yml, um serverwebroot zu setzen, es hat die Form eines Standard-SCP-Dateiziels. Dann wird fdroid deploy die Veröffentlichung über rsync über ssh durchführen. Beide Computer müssen also ssh und rsync installiert und eingerichtet haben. Du kannst auch deinen eigenen vorhandenen Signierschlüssel verwenden, anstatt den von fdroid init erzeugten, bearbeite einfach repo_keyalias, keystore, keystorepass, keypass und keydname in ~/fdroid/config.yml.

Wenn dein Repo über ein Archiv verfügt, solltest du zusätzlich eine Rewrite-Regel von repo/ nach archive/ auf deinem Webserver einrichten. Dies stellt sicher, dass alte Links weiterhin funktionieren, wenn ein APK vom Repository ins Archiv verschoben wird. Siehe dieses Beispiel mit Apache.