Reproducible Builds
In order to verify that the published source code was actually used to build the apps available for download in the stores, we provide reproducible builds.
Please note that Threema’s reproducible builds are still experimental. If a build cannot be reproduced, please let us know, and we’ll look into it.
Android
Prerequisites: A command line environment including bash
, git
,
curl
, gunzip
and unzip
as well as a
Docker installation.
1. Determine App Version
In the Threema app on your phone, navigate to “Settings > About Threema,” and take note
of the version. Export this information as well as the build variant (either
googleplay
, threemashop
, libre
or hms
) into variables.
For example, if you’re using the Google Play version of Threema 4.54 for Android:
$ export VERSION=4.54 VARIANT=googleplay
2. Extract the APK from Your Device
First, you need to extract the APK file from your phone. The recommended way to do this is by using Android Debug Bridge (adb) on a phone where Developer Mode is enabled. Run the following command:
$ export APP_ID=ch.threema.app $ adb pull $(adb shell pm path $APP_ID | grep "/base.apk" | sed 's/^package://') threema-extracted.apk
(Note: For Threema Libre, the app ID must be ch.threema.app.libre
and for the HMS
version it must be ch.threema.app.hms
.)
This will result in a file named threema-extracted.apk
in your current directory.
There are also other ways to extract an APK file, e.g., by using backup apps or by means of a file manager on a rooted phone. How you obtain the APK is up to you.
Please note: If you use the Threema Shop version of Threema, you can also download the APK directly from the website instead of extracting it from your phone.
3. Load Docker Image
In order to reproduce the build, you need to load the Docker image containing the build environment that was used to generate the published app. The image can be downloaded from the Threema website.
$ cd /tmp $ curl -LO https://oss.threema.ch/android/docker/docker-image-android-$VERSION.tar.gz $ gunzip --stdout docker-image-android-$VERSION.tar.gz | docker image load
You can verify that the image was loaded properly by running
docker image ls threema/android-compile
.
4. Build Threema for Android
Next, you should compile Threema. First, clone the repository:
$ git clone https://github.com/threema-ch/threema-android $ cd threema-android
Check out the tag corresponding to your app version.
$ git checkout $VERSION
Next, build the release APKs.
$ ./scripts/build-release.sh -v $VARIANT -n $VERSION --no-image-export --i-accept-the-android-sdk-license
This will result in an APK file at release/$VERSION/googleplay/
.
5. Verify the Result
You can use the verify-build.sh
script to verify the locally compiled APK
against the extracted APK.
$ ./scripts/verify-build.sh -n $VERSION -v $VARIANT -p threema-extracted.apk ... ==> Comparing releases ==> Success! The APKs match.
If you get “Success” as log output, you have successfully verified that the app you have installed on your device corresponds to the published source code!
In case the verification fails, don’t panic! Please double-check that the version of the extracted APK corresponds to the source-code version you have checked out. If you are positive that this is correct, please send the log to opensource@threema.ch.
iOS
At the moment, reproducible builds are available for Threema’s Android app. Due to restrictions by Apple, it’s no easy task to offer reproducible builds for iOS, but we are currently evaluating possible ways to also support reproducible builds for this platform.