1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
rsend reproducible builds
=========================
How rsend stays reproducible and what F-Droid needs to build it.
Pinning
-------
Every tool and source version lives in ./versions: the rsync source and its
sha256, the Go version, the Android NDK, SDK platform, build-tools, Gradle, the
Android Gradle Plugin, and Kotlin. The build never floats a version.
Determinism
-----------
- rsh (Go): built with the NDK clang, -trimpath, -ldflags "-s -w -buildid=",
and CGO_CFLAGS=-ffile-prefix-map to drop build paths.
- rsync (C): cross-compiled with -ffile-prefix-map and stripped; optional
dependencies are disabled and zlib and popt come from rsync's bundled copies,
so the binary needs nothing outside Bionic.
- APK: no code shrinking (minifyEnabled false), the Google dependency-metadata
block is dropped (dependenciesInfo off), and native libs use legacy packaging.
Verify locally by building twice and diffing the native libs:
make verify-repro
F-Droid
-------
The build recipe lives in fdroiddata, not in this repo. F-Droid supplies the
NDK named by the recipe's ndk field and exports ANDROID_NDK_HOME. It pins Go
through the go srclib (the official Go source) and builds it with make.bash,
and installs make and g++ for rsync. The native lib*.so are then built in the
recipe's build step, which runs after F-Droid's source scanner and calls
rsync/build.sh and rsh/build.sh; Gradle then assembles the APK. The release
build is unsigned unless a local keystore.properties is present, so F-Droid
signs the published APK with its own key.
All-files access
----------------
rsend requests MANAGE_EXTERNAL_STORAGE. It is required: backup targets such as
OEM call-recording directories and app-specific media folders live outside the
scoped-media buckets, and rsync needs real filesystem paths rather than SAF
content URIs. The app makes no network access other than the SSH connection to
the host the user configures.
|