bitwarden / bitwarden/android

[PM-42956] Release APK not reproducible: CI run/branch info baked into classes.dex (2026.8.0)

Open
#7,348 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Kotlin
Stars
9.4k
Forks
1.1k
Avg merge
1d 14h
Merged PRs (30d)
67

Description

## Reproducibility report — Android 2026.8.0 (fdroid APK)

An independent rebuild of the `v2026.8.0-bwpm` tag (commit 8be53c1) with a read:packages token resolving `com.bitwarden:sdk-android:3.0.0-8157-eb825d59` produced an APK that matches the official release APK in **659 of 661 ZIP entries** (identical: `resources.arsc`, `AndroidManifest.xml`, `version-control-info.textproto`, all resources and native libs).

Two entries differ:

1. **`classes.dex`** — the only string-level differences are CI provenance baked into the binary:
- ` build source: bitwarden/android/actions/runs/31214376447/attempts/1`
- ` commit: bitwarden/android/release/2026.8-rc60@8be53c1ae519ab417b64b0d2154f9815adf7c44a`

The variable-length CI-info string shifts subsequent offsets, scattering ~700KB of bytes with zero semantic difference. Providing `ci.properties` (or documenting `ci.info`) for release builds, or making the CI-info injection length-stable, would make this APK byte-for-byte reproducible by third parties.

2. **`assets/dexopt/baseline.prof`** — likely downstream of the same offset shifts.

Note: `appVersionName`/`appVersionCode` in `gradle/libs.versions.toml` are not bumped on the tag, so rebuilders must pin `2026.8.0`/`21819` manually; tagging with the values already set would remove another manual step.

Verdict: **near-reproducible** — only CI provenance metadata blocks byte-identity. Attestation (kind 30301) published; happy to share build details.

Contributor guide

Open the contributing guide

Research direction

Start with the v2026.8.0-bwpm tag and trace how CI provenance is injected into classes.dex, using the reported ci.properties or ci.info inputs. Check gradle/libs.versions.toml for the release version values, then rebuild and compare classes.dex and assets/dexopt/baseline.prof; done means the APK matches the official 661 entries byte-for-byte without manual CI metadata.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, github-actions, kotlin
Domain
build-system, release
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
58/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.