@@ -142,7 +142,7 @@ export SOURCE_DATE_EPOCH="$(./scripts/derive-sde.sh)"
142142# container paths:
143143# * Host build: if no `KEYSTORE_FILE` is exported and no `storeFile` is
144144# resolved by `app/build.gradle.kts`, Gradle falls back to the debug
145- # signing key and still writes `app-release.apk`.
145+ # signing key and still writes the per-ABI `app-<abi>- release.apk` files .
146146# * Container build (Section 4): `Dockerfile.reproducible` intentionally
147147# generates a throwaway keystore per build when `KEYSTORE_FILE` is unset,
148148# so the APK is always release-signed. This enforces a deterministic
@@ -153,7 +153,8 @@ export SOURCE_DATE_EPOCH="$(./scripts/derive-sde.sh)"
153153./gradlew assembleRelease --no-daemon
154154```
155155
156- Output: ` app/build/outputs/apk/release/app-release.apk ` .
156+ Output: per-ABI APKs in ` app/build/outputs/apk/release/ ` , namely
157+ ` app-arm64-v8a-release.apk ` and ` app-x86_64-release.apk ` .
157158
158159If you want to reproduce the exact byte layout of the published APK, you must
159160sign with the same release key; otherwise the APK payload is identical but the
@@ -187,7 +188,7 @@ DOCKER_BUILDKIT=1 docker build \
187188 -f Dockerfile.reproducible \
188189 .
189190
190- ls out/ # app-release.apk
191+ ls out/ # app-arm64-v8a-release.apk app-x86_64- release.apk
191192```
192193
193194The container:
@@ -198,7 +199,7 @@ The container:
1981993 . Copies the keep-android sources in and clones ` keep ` at the pinned SHA.
1992004 . Runs ` build-rust.sh ` and ` ./gradlew assembleRelease ` with
200201 ` SOURCE_DATE_EPOCH ` set.
201- 5 . Exports the signed release APK to ` ./out/ ` (signed with a per-build
202+ 5 . Exports the signed per-ABI release APKs to ` ./out/ ` (signed with a per-build
202203 throwaway keystore unless a keystore is supplied; see § 4.1).
203204
204205### 4.1 Optional build-args
@@ -257,7 +258,7 @@ sha256sum -c SHA256SUMS
257258sudo apt-get install -y diffoscope
258259diffoscope --html diffoscope.html --text diffoscope.txt \
259260 keep-android-v0.5.2.apk \
260- app/build/outputs/apk/release/app-release.apk
261+ app/build/outputs/apk/release/app-arm64-v8a- release.apk
261262```
262263
263264A reproducible build produces a ` diffoscope ` report in which:
@@ -288,18 +289,19 @@ is removed explicitly so the sibling cargo target dir is purged even when
288289rm -rf app/src/main/jniLibs app/src/main/kotlin/io/privkey/keep/uniffi " $KEEP_REPO /keep-mobile/target"
289290./build-rust.sh
290291./gradlew assembleRelease --no-daemon
291- cp app/build/outputs/apk/release/app-release.apk /tmp/build1.apk
292+ cp app/build/outputs/apk/release/app-arm64-v8a- release.apk /tmp/build1.apk
292293
293294./gradlew clean --no-daemon
294295rm -rf app/src/main/jniLibs app/src/main/kotlin/io/privkey/keep/uniffi " $KEEP_REPO /keep-mobile/target"
295296./build-rust.sh
296297./gradlew assembleRelease --no-daemon
297- cp app/build/outputs/apk/release/app-release.apk /tmp/build2.apk
298+ cp app/build/outputs/apk/release/app-arm64-v8a- release.apk /tmp/build2.apk
298299
299300sha256sum /tmp/build1.apk /tmp/build2.apk
300301```
301302
302- The two SHA-256 hashes MUST be identical.
303+ The two SHA-256 hashes MUST be identical. Repeat the comparison for
304+ ` app-x86_64-release.apk ` ; each per-ABI APK must reproduce independently.
303305
304306## 6. Troubleshooting
305307
0 commit comments