Nutzung der F-Droid-Bibliotheken, am Beispiel CalyxOS

Als wir die neue Generation der F-Droid-App entwarfen, schrieben wir unseren Code neu, sodass er in wiederverwertbare Bibliotheken passt, damit andere Projekte mit minimalem Aufwand Nutzen aus F-Droids Technologie ziehen können.

Die Bibliotheken

Bislang haben wir drei Bibliotheken veröffentlicht. Zwei von ihnen sind im plattformübergreifenden Kotlin geschrieben, somit können sie auch außerhalb von Android verwendet werden. Zum Beispiel kann man sie dazu nutzen, ein Kommandozeilen- oder sogar ein iOS-Programm zu schreiben.

Mehr darüber, wie sie in euer Projekt integriert werden können in deren README.

Download-Bibliothek

Diese Bibliothek beinhaltet alles, was ihr für den Download der F-Droid-Repositorys und der darin enthaltenen APKs und Images braucht. Sie beschäftigt sich mit der Wiederaufnahme von Downloads, Repository-Spiegelserver und berücksichtigt spezielle HTTP-Fälle, auf die ein F-Droid-Client stoßen kann.

Die Android-Version der Bibliothek sorgt auch dafür TLS-Versionen älter als 1.2 ebenso wie eine schwache Verschlüsselung abzulehnen. Sie verhindert DNS-Lecks bei Verwendung von Tor als Proxy und nutzt eine kurzlebige TLS-Sitzung, um Tracking und die Wiederverwendung von Schlüsseln zu vermeiden. Wenn ihr Glide als Image Loader verwendet, bringt sie auch einen speziellen ModelLoader mit, der mit Glide verwendet werden soll.

Einzelheiten dazu findet ihr in der API-Dokumentation. Und hier ein Beispiel wie F-Droid zur Download-Bibliothek wechselte.

Index-Bibliothek

Die plattformübergreifende Index-Bibliothek versorgt einen mit allem, was für den Umgang mit Indizes eines F-Droid-Repositorys nötig ist. Natürlich gibt es einen Parser, um die Indizes intern zu lesen und wiederzugeben. Für Version-1-Indizes gibt es auch einen Ersteller, der F-Droid nutzt, um seine eigenen Tausch-Repositorys für das Umfeld zu erstellen. Beide Versionen besitzen einen Signatur-Prüfer, sodass man immer sicherstellen kann, dass das Repository korrekt signiert ist, bevor man mit seinen Daten arbeitet.

Abgesehen von diesen Grundlagen besitzt die Bibliothek viele nützliche Klassen, die dabei helfen, die auf der Sprache des Anwenders beruhende, beste Übersetzung auszuwählen, zu prüfen, ob eine App mit dem aktuellen Gerät kompatibel ist, und zu prüfen, ob für die App ein Update im Repository-Index zur Verfügung steht. Es gibt Klassen zur Bearbeitung der Übertragung von Indexdaten, sodass man nicht den kompletten Index in den Speicher laden muss, was bei Geräten mit wenig RAM ein Problem sein kann. Wenn man intern nur mit dem Version-2-Format arbeiten möchte, stellt die Bibliothek einen Index-Konverter bereit, der das Format von Version 1 in Version 2 umwandeln kann.

F-Droid-Clients, die Delta-Updates der Version 2 nutzen möchten, finden dafür ebenfalls hilfreiche Klassen und müssen so nicht selbst das Rad neu erfinden.

Einzelheiten dazu findet ihr in der API-Dokumentation. Und hier ein Beispiel wie F-Droid zur Index-Bibliothek wechselte.

Datenbank-Bibliothek

Falls es nötig ist, dass Informationen zum F-Droid-Repository in eurer Android-App bestehen bleiben, ist das die Bibliothek für euch. Sie bewahrt F-Droid-bezogene Informationen wie Repositorys, Apps und deren Versionen auf. Sodann erlaubt sie nach ihnen zu suchen bzw. sie abzufragen. Unter der Haube nutzt sie eine Room-Datenbank, die wiederum SQLite verwendet.

Neben den datenbankbezogenen Klassen beinhaltet diese Bibliothek aktuell auch Klassen in Bezug auf Aktualisierungen der Repositorys, sodass (mittels der Downloader-Bibliothek) aus dem Internet geholte Informationen direkt in die Datenbank eingespeist werden können.

Einzelheiten hierzu in der API-Dokumentation. Und noch ein Beispiel wie F-Droid zur Datenbank-Bibliothek wechselte.

CalyxOS

Der erste bekannte Nutzer dieser neuen Bibliotheken ist CalyxOS, das sie bereits in zwei seiner Apps verwendet. Dank der Bibliotheken können die Entwickler ihre Bemühungen auf die Apps selbst konzentrieren und müssen die F-Droid-abhängigen Bits nicht neuimplementieren.

Die erste App wird als Teil ihres Einrichtungsassistenten verwendet, der nach Erstinstallation erscheint. Er ermöglicht den Anwendern auf einer Opt-In-Basis die Installation zusätzlicher Apps, sodass sie diese nicht als nicht-entfernbare System-Apps ausliefern müssen. Der Vorteil für CalyxOS ist, dass sie diese Apps aus einem F-Droid-Repository im Internet laden können, ohne APKs als Teil ihres ROMs ausliefern zu müssen, und so dessen Größe kleinstmöglich zu halten.

Dies ist ihre Methode, eine Index-Darstellung aus einer Datei zu erhalten, bei der von der Index-Bibliothek Gebrauch gemacht wird:

fun getIndex(file: File): IndexV2 = file.inputStream().use { inputStream ->
    IndexParser.parseV2(inputStream)
}

Die zweite App verwendet F-Droid, um seine eigenen grundlegenden Apps auf dem neusten Stand zu halten. Mit der kleinstmöglichen Oberfläche ist ihr Hauptzweck, regelmäßig nach Aktualisierungen zu suchen und diese im Hintergrund zu installieren, sobald welche vorhanden sind.

Die App nutzt den UpdateChecker der Index-Bibliothek, um zu prüfen, ob Aktualisierungen abrufbar sind:

private fun getUpdate(packageName: String, packageVersions: List<PackageVersionV2>): PackageVersionV2? {
    val packageInfo = packageManager.getPackageInfo(packageName, GET_SIGNATURES)
    return updateChecker.getUpdate(packageVersions, packageInfo)
}

(Komplettes Code-Beispiel)

Diese beiden Apps brauchen keine persistenten Daten, solange sie nur die Download- und die Index-Bibliothek nutzen.

Die Arbeiten an den Bibliotheken wurde durch einen FFDW-DVD-Zuschuss gefördert