New repository format for faster and smaller updates
Posted on Mar 01, 2023 by groteWe just released version 1.16
of the official F-Droid client app for
Android which includes many radical changes under the hood as well as many
bug fixes for long standing issue. Read on for more details.
Growing repository size
As more and more apps make their way into F-Droid, the official repository
index that includes all apps and their metadata also keeps growing.
Currently, the size of the compressed index is 8 MB
which is 33 MB
uncompressed. When updating the repository index, each F-Droid client app
has to download and process those 8MB
again and again. This problematic
trend became apparent a long time
ago.
Updating only what has changed
Our repository index is in JSON format and we decided to make use of RFC
7396 JSON Merge Patch to
create much smaller JSON files that only contain the changes since your
F-Droid app last updated. Technically, this works by downloading a new
entry.json
file instead of the full
index. This entry file points to the full index in case the app had never
updated before and needs all app metadata anyway. But the entry also
contains pointers to various smaller difference files. The app
automatically picks the right diff and only downloads that much smaller file
instead of the full index. This not only saves bandwidth, it also makes
updating the index much faster as only the minimum amount of data needs to
be downloaded, processed and stored. As of writing, the latest diff is 80
KB
compressed which is 241 KB
uncompressed which is only 1%
of the full
index. Version 1.16
of the official F-Droid client app for Android
supports this new repository format.
Other improvements
The new version has a large number of radical changes under the hood. For example, the entire database had to be replaced to support the new difference based repository format. We also used the opportunity to improve various bit and pieces along the way:
- improved mirror support: all files (e.g. images) now get loaded from mirrors reducing the load on the main server
- better support for low RAM devices, because the index now gets streamed into the DB instead of loading all of it into memory
- hash verification: The SHA256 hash of all files is now part of the repository metadata and gets verified while downloading
- stronger digest algorithm for repository signing: We now use SHA256 instead of SHA1 for the index signature
- support for downloading repository files via IPFS
- many bug fixes that came out of modernizing ancient code
The new version went through a series of alpha releases with extended testing to make sure no severe issues make it into the stable release. It is now considered ready for general use.
Information for repository and client maintainers
Owners of third-party F-Droid repositories can enable the new format by upgrading to the latest version of fdroidserver which will automatically publish the new format in addition to the old ones which we keep around to support older client apps.
Developers of third-party F-Droid clients are encouraged to adopt the new format either with their own implementations or by making use of the new libraries we are publishing to make using this technology as easy as possible and to share as much code as possible between different F-Droid implementations.
This work was funded by the FFDW-DVD grant