Fix reproduction of app #135

Closed
opened 12 months ago by fynngodau · 4 comments
Owner

The app unfortunately no longer build reproducible. The latest version that F-Droid successfully compiled was version 2.0.5.0.

When running our rebuilding docker container (as explained by the document rebuilding.md), the APK file also doesn't exactly match the one that @Bubu built on their machine.

For reference, here's how I'm extracting the compiled APK from the docker container:

docker ps -a # list all docker containers
docker cp $ID:build/de.corona.tracing/Corona-Warn-App/build/outputs/apk/device/release/Corona-Warn-App-device-release-unsigned.apk ~ # insert ID of last build attempt as $ID

As we also saw as a result from the official F-Droid build server, the file classes2.dex is not identical in my build. Using diffoscope, I am receiving this output as a difference between my compiled version (source) and the one on https://bubu1.eu/fdroid (target):

$ diffoscope source/classes2.dex target/classes2.dex
--- source/classes2.dex
+++ target/classes2.dex
├── classes2.jar
│ ├── zipinfo {}
│ │ @@ -1,8 +1,8 @@
│ │ -Zip file size: 19141854 bytes, number of entries: 9171
│ │ +Zip file size: 19146014 bytes, number of entries: 9171
│ │  ?rwxrwxr-x  2.0 unx      308 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmac.class
│ │  ?rwxrwxr-x  2.0 unx     1215 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacKey$1.class
│ │  ?rwxrwxr-x  2.0 unx     1221 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacKeyFormat$1.class
│ │  ?rwxrwxr-x  2.0 unx     1218 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacParams$1.class
│ │  ?rwxrwxr-x  2.0 unx      311 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacPrf.class
│ │  ?rwxrwxr-x  2.0 unx     1218 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacPrfKey$1.class
│ │  ?rwxrwxr-x  2.0 unx     1224 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacPrfKeyFormat$1.class
│ │ @@ -1735,15 +1735,15 @@
│ │  ?rwxrwxr-x  2.0 unx      428 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_AutoCheckOutTrigger$Corona_Warn_App_deviceRelease.class
│ │  ?rwxrwxr-x  2.0 unx      441 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_ExposureUpdateReceiver$Corona_Warn_App_deviceRelease.class
│ │  ?rwxrwxr-x  2.0 unx      430 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_NotificationReceiver$Corona_Warn_App_deviceRelease.class
│ │  ?rwxrwxr-x  2.0 unx      462 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_PrivateExposureUpdateReceiver$Corona_Warn_App_deviceRelease.class
│ │  ?rwxrwxr-x  2.0 unx      748 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragment$onViewCreated$$inlined$apply$lambda$1.class
│ │  ?rwxrwxr-x  2.0 unx      748 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragment$onViewCreated$$inlined$apply$lambda$2.class
│ │  ?rwxrwxr-x  2.0 unx      898 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentArgs$Companion.class
│ │ -?rwxrwxr-x  2.0 unx      535 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections$Companion.class
│ │ +?rwxrwxr-x  2.0 unx     2647 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections$Companion.class
│ │  ?rwxrwxr-x  2.0 unx      472 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections.class
│ │  ?rwxrwxr-x  2.0 unx      331 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentModule.class
│ │  ?rwxrwxr-x  2.0 unx      159 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoItem.class
│ │  ?rwxrwxr-x  2.0 unx      262 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoNavigationEvents.class
│ │  ?rwxrwxr-x  2.0 unx     1513 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoViewModel_Factory.class
│ │  ?rwxrwxr-x  2.0 unx     1840 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/risk/CombinedEwPtDayRisk.class
│ │  ?rwxrwxr-x  2.0 unx      891 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/risk/CombinedEwPtRiskKt.class
│ │ @@ -2324,15 +2324,15 @@
│ │  ?rwxrwxr-x  2.0 unx      862 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$1.class
│ │  ?rwxrwxr-x  2.0 unx      857 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$2.class
│ │  ?rwxrwxr-x  2.0 unx      728 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$3.class
│ │  ?rwxrwxr-x  2.0 unx     1392 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$4.class
│ │  ?rwxrwxr-x  2.0 unx     1387 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$5.class
│ │  ?rwxrwxr-x  2.0 unx     1388 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$6.class
│ │  ?rwxrwxr-x  2.0 unx     1072 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$7.class
│ │ -?rwxrwxr-x  2.0 unx     1173 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections$Companion.class
│ │ +?rwxrwxr-x  2.0 unx     3221 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections$Companion.class
│ │  ?rwxrwxr-x  2.0 unx      520 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections.class
│ │  ?rwxrwxr-x  2.0 unx      473 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsModule.class
│ │  ?rwxrwxr-x  2.0 unx      444 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsModule_AnalyticsOnBoardingDeltaScreen.class
│ │  ?rwxrwxr-x  2.0 unx      899 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragment$onViewCreated$2.class
│ │  ?rwxrwxr-x  2.0 unx      899 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragment$onViewCreated$3.class
│ │  ?rwxrwxr-x  2.0 unx     2478 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentDirections$Companion.class
│ │  ?rwxrwxr-x  2.0 unx      541 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentDirections.class
│ │ @@ -9166,8 +9166,8 @@
│ │  ?rwxrwxr-x  2.0 unx      871 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanFragment$showInvalidScanDialog$invalidScanDialogInstance$2.class
│ │  ?rwxrwxr-x  2.0 unx      741 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment$buildErrorDialog$1.class
│ │  ?rwxrwxr-x  2.0 unx      741 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment$buildErrorDialog$2.class
│ │  ?rwxrwxr-x  2.0 unx      741 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment$buildErrorDialog$3.class
│ │  ?rwxrwxr-x  2.0 unx      872 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/testresult/pending/SubmissionTestResultPendingFragment$genericErrorDialog$1.class
│ │  ?rwxrwxr-x  2.0 unx      872 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/testresult/pending/SubmissionTestResultPendingFragment$networkErrorDialog$1.class
│ │  ?rwxrwxr-x  2.0 unx      871 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/util/CWADebug$isLogging$1.class
│ │ -9171 files, 19518622 bytes uncompressed, 16903080 bytes compressed:  13.4%
│ │ +9171 files, 19522782 bytes uncompressed, 16907240 bytes compressed:  13.4%
│ ├── de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections$Companion.class
│ │ ├── procyon -ec {}
│ │ │ @@ -1,16 +1,39 @@
│ │ │  
│ │ │  package de.rki.coronawarnapp.release;
│ │ │  
│ │ │ +import kotlin.jvm.internal.Intrinsics;
│ │ │ +import de.rki.coronawarnapp.NavGraphDirections;
│ │ │  import androidx.navigation.ActionOnlyNavDirections;
│ │ │ +import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN;
│ │ │ +import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode;
│ │ │ +import de.rki.coronawarnapp.coronatest.type.CoronaTest$Type;
│ │ │  import androidx.navigation.NavDirections;
│ │ │  import kotlin.jvm.internal.DefaultConstructorMarker;
│ │ │  
│ │ │  public final class NewReleaseInfoFragmentDirections$Companion
│ │ │  {
│ │ │      private NewReleaseInfoFragmentDirections$Companion() {
│ │ │      }
│ │ │      
│ │ │      public final NavDirections actionNewReleaseInfoFragmentToOnboardingDeltaAnalyticsFragment() {
│ │ │          return (NavDirections)new ActionOnlyNavDirections(2131361912);
│ │ │      }
│ │ │ +    
│ │ │ +    public final NavDirections actionSubmissionConsentFragment(final String s) {
│ │ │ +        return NavGraphDirections.Companion.actionSubmissionConsentFragment(s);
│ │ │ +    }
│ │ │ +    
│ │ │ +    public final NavDirections actionSubmissionTestResultPendingFragment(final boolean b, final CoronaTest$Type coronaTest$Type) {
│ │ │ +        Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType");
│ │ │ +        return NavGraphDirections.Companion.actionSubmissionTestResultPendingFragment(b, coronaTest$Type);
│ │ │ +    }
│ │ │ +    
│ │ │ +    public final NavDirections actionToSubmissionDeletionWarningFragment(final boolean b, final CoronaTestQRCode coronaTestQRCode, final CoronaTestTAN coronaTestTAN) {
│ │ │ +        return NavGraphDirections.Companion.actionToSubmissionDeletionWarningFragment(b, coronaTestQRCode, coronaTestTAN);
│ │ │ +    }
│ │ │ +    
│ │ │ +    public final NavDirections actionToSubmissionTestResultAvailableFragment(final CoronaTest$Type coronaTest$Type) {
│ │ │ +        Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType");
│ │ │ +        return NavGraphDirections.Companion.actionToSubmissionTestResultAvailableFragment(coronaTest$Type);
│ │ │ +    }
│ │ │  }
│ ├── de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections$Companion.class
│ │ ├── procyon -ec {}
│ │ │ @@ -1,14 +1,18 @@
│ │ │  
│ │ │  package de.rki.coronawarnapp.ui.onboarding;
│ │ │  
│ │ │ +import de.rki.coronawarnapp.NavGraphDirections;
│ │ │  import androidx.navigation.ActionOnlyNavDirections;
│ │ │  import kotlin.jvm.internal.Intrinsics;
│ │ │ -import androidx.navigation.NavDirections;
│ │ │  import de.rki.coronawarnapp.datadonation.analytics.ui.input.AnalyticsUserInputFragment$InputType;
│ │ │ +import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN;
│ │ │ +import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode;
│ │ │ +import de.rki.coronawarnapp.coronatest.type.CoronaTest$Type;
│ │ │ +import androidx.navigation.NavDirections;
│ │ │  import kotlin.jvm.internal.DefaultConstructorMarker;
│ │ │  
│ │ │  public final class OnboardingDeltaAnalyticsFragmentDirections$Companion
│ │ │  {
│ │ │      private OnboardingDeltaAnalyticsFragmentDirections$Companion() {
│ │ │      }
│ │ │      
│ │ │ @@ -16,8 +20,26 @@
│ │ │          Intrinsics.checkNotNullParameter((Object)analyticsUserInputFragment$InputType, "type");
│ │ │          return (NavDirections)new OnboardingDeltaAnalyticsFragmentDirections$ActionOnboardingDeltaAnalyticsFragmentToAnalyticsUserInputFragment(analyticsUserInputFragment$InputType);
│ │ │      }
│ │ │      
│ │ │      public final NavDirections actionOnboardingDeltaAnalyticsFragmentToPpaMoreInfoFragment() {
│ │ │          return (NavDirections)new ActionOnlyNavDirections(2131361916);
│ │ │      }
│ │ │ +    
│ │ │ +    public final NavDirections actionSubmissionConsentFragment(final String s) {
│ │ │ +        return NavGraphDirections.Companion.actionSubmissionConsentFragment(s);
│ │ │ +    }
│ │ │ +    
│ │ │ +    public final NavDirections actionSubmissionTestResultPendingFragment(final boolean b, final CoronaTest$Type coronaTest$Type) {
│ │ │ +        Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType");
│ │ │ +        return NavGraphDirections.Companion.actionSubmissionTestResultPendingFragment(b, coronaTest$Type);
│ │ │ +    }
│ │ │ +    
│ │ │ +    public final NavDirections actionToSubmissionDeletionWarningFragment(final boolean b, final CoronaTestQRCode coronaTestQRCode, final CoronaTestTAN coronaTestTAN) {
│ │ │ +        return NavGraphDirections.Companion.actionToSubmissionDeletionWarningFragment(b, coronaTestQRCode, coronaTestTAN);
│ │ │ +    }
│ │ │ +    
│ │ │ +    public final NavDirections actionToSubmissionTestResultAvailableFragment(final CoronaTest$Type coronaTest$Type) {
│ │ │ +        Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType");
│ │ │ +        return NavGraphDirections.Companion.actionToSubmissionTestResultAvailableFragment(coronaTest$Type);
│ │ │ +    }
│ │ │  }

These *Direction classes (and their $Companion Kotlin companion objects) appear to be automatically generated by an androix nav tool. However, the versions of these tools hasn't changed since 2.0.5.0 (it is still 2.3.3 for the app libraries and 2.2.2 for the build dependencies).

As such, we don't know what causes this reproduction failure at the moment. Among other questions, it is not clear whether this is exactly the difference that F-Droid's build server also encounters, why it is not working now while it was working until 2.0.5.0, and of course, what we can do to fix this.

The app unfortunately no longer build reproducible. The latest version that F-Droid successfully compiled was version 2.0.5.0. When running our rebuilding docker container (as explained by the document [rebuilding.md](https://codeberg.org/corona-contact-tracing-germany/cwa-android/src/branch/main/docs/rebuilding.md)), the APK file also doesn't exactly match the one that @Bubu built on their machine. For reference, here's how I'm extracting the compiled APK from the docker container: docker ps -a # list all docker containers docker cp $ID:build/de.corona.tracing/Corona-Warn-App/build/outputs/apk/device/release/Corona-Warn-App-device-release-unsigned.apk ~ # insert ID of last build attempt as $ID As we also saw as a result from the official F-Droid build server, the file `classes2.dex` is not identical in my build. Using diffoscope, I am receiving this output as a difference between my compiled version (`source`) and the one on https://bubu1.eu/fdroid (`target`): ``` $ diffoscope source/classes2.dex target/classes2.dex --- source/classes2.dex +++ target/classes2.dex ├── classes2.jar │ ├── zipinfo {} │ │ @@ -1,8 +1,8 @@ │ │ -Zip file size: 19141854 bytes, number of entries: 9171 │ │ +Zip file size: 19146014 bytes, number of entries: 9171 │ │ ?rwxrwxr-x 2.0 unx 308 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmac.class │ │ ?rwxrwxr-x 2.0 unx 1215 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacKey$1.class │ │ ?rwxrwxr-x 2.0 unx 1221 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacKeyFormat$1.class │ │ ?rwxrwxr-x 2.0 unx 1218 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacParams$1.class │ │ ?rwxrwxr-x 2.0 unx 311 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacPrf.class │ │ ?rwxrwxr-x 2.0 unx 1218 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacPrfKey$1.class │ │ ?rwxrwxr-x 2.0 unx 1224 b- stor 80-Jan-01 00:00 com/google/crypto/tink/proto/AesCmacPrfKeyFormat$1.class │ │ @@ -1735,15 +1735,15 @@ │ │ ?rwxrwxr-x 2.0 unx 428 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_AutoCheckOutTrigger$Corona_Warn_App_deviceRelease.class │ │ ?rwxrwxr-x 2.0 unx 441 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_ExposureUpdateReceiver$Corona_Warn_App_deviceRelease.class │ │ ?rwxrwxr-x 2.0 unx 430 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_NotificationReceiver$Corona_Warn_App_deviceRelease.class │ │ ?rwxrwxr-x 2.0 unx 462 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/receiver/ReceiverBinder_PrivateExposureUpdateReceiver$Corona_Warn_App_deviceRelease.class │ │ ?rwxrwxr-x 2.0 unx 748 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragment$onViewCreated$$inlined$apply$lambda$1.class │ │ ?rwxrwxr-x 2.0 unx 748 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragment$onViewCreated$$inlined$apply$lambda$2.class │ │ ?rwxrwxr-x 2.0 unx 898 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentArgs$Companion.class │ │ -?rwxrwxr-x 2.0 unx 535 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections$Companion.class │ │ +?rwxrwxr-x 2.0 unx 2647 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections$Companion.class │ │ ?rwxrwxr-x 2.0 unx 472 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections.class │ │ ?rwxrwxr-x 2.0 unx 331 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoFragmentModule.class │ │ ?rwxrwxr-x 2.0 unx 159 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoItem.class │ │ ?rwxrwxr-x 2.0 unx 262 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoNavigationEvents.class │ │ ?rwxrwxr-x 2.0 unx 1513 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/release/NewReleaseInfoViewModel_Factory.class │ │ ?rwxrwxr-x 2.0 unx 1840 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/risk/CombinedEwPtDayRisk.class │ │ ?rwxrwxr-x 2.0 unx 891 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/risk/CombinedEwPtRiskKt.class │ │ @@ -2324,15 +2324,15 @@ │ │ ?rwxrwxr-x 2.0 unx 862 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$1.class │ │ ?rwxrwxr-x 2.0 unx 857 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$2.class │ │ ?rwxrwxr-x 2.0 unx 728 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$3.class │ │ ?rwxrwxr-x 2.0 unx 1392 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$4.class │ │ ?rwxrwxr-x 2.0 unx 1387 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$5.class │ │ ?rwxrwxr-x 2.0 unx 1388 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$6.class │ │ ?rwxrwxr-x 2.0 unx 1072 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragment$onViewCreated$$inlined$apply$lambda$7.class │ │ -?rwxrwxr-x 2.0 unx 1173 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections$Companion.class │ │ +?rwxrwxr-x 2.0 unx 3221 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections$Companion.class │ │ ?rwxrwxr-x 2.0 unx 520 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections.class │ │ ?rwxrwxr-x 2.0 unx 473 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsModule.class │ │ ?rwxrwxr-x 2.0 unx 444 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsModule_AnalyticsOnBoardingDeltaScreen.class │ │ ?rwxrwxr-x 2.0 unx 899 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragment$onViewCreated$2.class │ │ ?rwxrwxr-x 2.0 unx 899 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragment$onViewCreated$3.class │ │ ?rwxrwxr-x 2.0 unx 2478 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentDirections$Companion.class │ │ ?rwxrwxr-x 2.0 unx 541 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentDirections.class │ │ @@ -9166,8 +9166,8 @@ │ │ ?rwxrwxr-x 2.0 unx 871 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanFragment$showInvalidScanDialog$invalidScanDialogInstance$2.class │ │ ?rwxrwxr-x 2.0 unx 741 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment$buildErrorDialog$1.class │ │ ?rwxrwxr-x 2.0 unx 741 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment$buildErrorDialog$2.class │ │ ?rwxrwxr-x 2.0 unx 741 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment$buildErrorDialog$3.class │ │ ?rwxrwxr-x 2.0 unx 872 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/testresult/pending/SubmissionTestResultPendingFragment$genericErrorDialog$1.class │ │ ?rwxrwxr-x 2.0 unx 872 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/ui/submission/testresult/pending/SubmissionTestResultPendingFragment$networkErrorDialog$1.class │ │ ?rwxrwxr-x 2.0 unx 871 b- stor 80-Jan-01 00:00 de/rki/coronawarnapp/util/CWADebug$isLogging$1.class │ │ -9171 files, 19518622 bytes uncompressed, 16903080 bytes compressed: 13.4% │ │ +9171 files, 19522782 bytes uncompressed, 16907240 bytes compressed: 13.4% │ ├── de/rki/coronawarnapp/release/NewReleaseInfoFragmentDirections$Companion.class │ │ ├── procyon -ec {} │ │ │ @@ -1,16 +1,39 @@ │ │ │ │ │ │ package de.rki.coronawarnapp.release; │ │ │ │ │ │ +import kotlin.jvm.internal.Intrinsics; │ │ │ +import de.rki.coronawarnapp.NavGraphDirections; │ │ │ import androidx.navigation.ActionOnlyNavDirections; │ │ │ +import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN; │ │ │ +import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode; │ │ │ +import de.rki.coronawarnapp.coronatest.type.CoronaTest$Type; │ │ │ import androidx.navigation.NavDirections; │ │ │ import kotlin.jvm.internal.DefaultConstructorMarker; │ │ │ │ │ │ public final class NewReleaseInfoFragmentDirections$Companion │ │ │ { │ │ │ private NewReleaseInfoFragmentDirections$Companion() { │ │ │ } │ │ │ │ │ │ public final NavDirections actionNewReleaseInfoFragmentToOnboardingDeltaAnalyticsFragment() { │ │ │ return (NavDirections)new ActionOnlyNavDirections(2131361912); │ │ │ } │ │ │ + │ │ │ + public final NavDirections actionSubmissionConsentFragment(final String s) { │ │ │ + return NavGraphDirections.Companion.actionSubmissionConsentFragment(s); │ │ │ + } │ │ │ + │ │ │ + public final NavDirections actionSubmissionTestResultPendingFragment(final boolean b, final CoronaTest$Type coronaTest$Type) { │ │ │ + Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType"); │ │ │ + return NavGraphDirections.Companion.actionSubmissionTestResultPendingFragment(b, coronaTest$Type); │ │ │ + } │ │ │ + │ │ │ + public final NavDirections actionToSubmissionDeletionWarningFragment(final boolean b, final CoronaTestQRCode coronaTestQRCode, final CoronaTestTAN coronaTestTAN) { │ │ │ + return NavGraphDirections.Companion.actionToSubmissionDeletionWarningFragment(b, coronaTestQRCode, coronaTestTAN); │ │ │ + } │ │ │ + │ │ │ + public final NavDirections actionToSubmissionTestResultAvailableFragment(final CoronaTest$Type coronaTest$Type) { │ │ │ + Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType"); │ │ │ + return NavGraphDirections.Companion.actionToSubmissionTestResultAvailableFragment(coronaTest$Type); │ │ │ + } │ │ │ } │ ├── de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaAnalyticsFragmentDirections$Companion.class │ │ ├── procyon -ec {} │ │ │ @@ -1,14 +1,18 @@ │ │ │ │ │ │ package de.rki.coronawarnapp.ui.onboarding; │ │ │ │ │ │ +import de.rki.coronawarnapp.NavGraphDirections; │ │ │ import androidx.navigation.ActionOnlyNavDirections; │ │ │ import kotlin.jvm.internal.Intrinsics; │ │ │ -import androidx.navigation.NavDirections; │ │ │ import de.rki.coronawarnapp.datadonation.analytics.ui.input.AnalyticsUserInputFragment$InputType; │ │ │ +import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN; │ │ │ +import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode; │ │ │ +import de.rki.coronawarnapp.coronatest.type.CoronaTest$Type; │ │ │ +import androidx.navigation.NavDirections; │ │ │ import kotlin.jvm.internal.DefaultConstructorMarker; │ │ │ │ │ │ public final class OnboardingDeltaAnalyticsFragmentDirections$Companion │ │ │ { │ │ │ private OnboardingDeltaAnalyticsFragmentDirections$Companion() { │ │ │ } │ │ │ │ │ │ @@ -16,8 +20,26 @@ │ │ │ Intrinsics.checkNotNullParameter((Object)analyticsUserInputFragment$InputType, "type"); │ │ │ return (NavDirections)new OnboardingDeltaAnalyticsFragmentDirections$ActionOnboardingDeltaAnalyticsFragmentToAnalyticsUserInputFragment(analyticsUserInputFragment$InputType); │ │ │ } │ │ │ │ │ │ public final NavDirections actionOnboardingDeltaAnalyticsFragmentToPpaMoreInfoFragment() { │ │ │ return (NavDirections)new ActionOnlyNavDirections(2131361916); │ │ │ } │ │ │ + │ │ │ + public final NavDirections actionSubmissionConsentFragment(final String s) { │ │ │ + return NavGraphDirections.Companion.actionSubmissionConsentFragment(s); │ │ │ + } │ │ │ + │ │ │ + public final NavDirections actionSubmissionTestResultPendingFragment(final boolean b, final CoronaTest$Type coronaTest$Type) { │ │ │ + Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType"); │ │ │ + return NavGraphDirections.Companion.actionSubmissionTestResultPendingFragment(b, coronaTest$Type); │ │ │ + } │ │ │ + │ │ │ + public final NavDirections actionToSubmissionDeletionWarningFragment(final boolean b, final CoronaTestQRCode coronaTestQRCode, final CoronaTestTAN coronaTestTAN) { │ │ │ + return NavGraphDirections.Companion.actionToSubmissionDeletionWarningFragment(b, coronaTestQRCode, coronaTestTAN); │ │ │ + } │ │ │ + │ │ │ + public final NavDirections actionToSubmissionTestResultAvailableFragment(final CoronaTest$Type coronaTest$Type) { │ │ │ + Intrinsics.checkNotNullParameter((Object)coronaTest$Type, "testType"); │ │ │ + return NavGraphDirections.Companion.actionToSubmissionTestResultAvailableFragment(coronaTest$Type); │ │ │ + } │ │ │ } ``` These `*Direction` classes (and their `$Companion` Kotlin companion objects) appear to be automatically generated by an androix nav tool. However, the versions of these tools hasn't changed since 2.0.5.0 (it is still 2.3.3 for the app libraries and 2.2.2 for the build dependencies). As such, we don't know what causes this reproduction failure at the moment. Among other questions, it is not clear whether this is exactly the difference that F-Droid's build server also encounters, why it is not working now while it was working until 2.0.5.0, and of course, what we can do to fix this.
Owner

We did a few changes that were supposed to solve this but now we run into a different(?) kind of non-determinism. Asked for help over at rb-general list:

https://lists.reproducible-builds.org/pipermail/rb-general/2021-May/002264.html

We did a few changes that were supposed to solve this but now we run into a different(?) kind of non-determinism. Asked for help over at rb-general list: https://lists.reproducible-builds.org/pipermail/rb-general/2021-May/002264.html
Owner

Reported to androidx team here: https://issuetracker.google.com/issues/189498001 (requires google login 🙄)

Reported to androidx team here: https://issuetracker.google.com/issues/189498001 (requires google login :roll_eyes:)
Bubu referenced this issue from a commit 12 months ago
Poster
Owner

To summarize the happenings until the above commit happened:

  • We thought that by enabling R8 minification, we could avoid the issue because all builds would remove the unused code.
  • However, the dex file contained some sort of checksum which was based on the source that was used. Therefore, different sources still lead to slightly different files.
    Helpful link from the reproducible-builds mailing list: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/issues/40085
  • We figured out that removing the top-level action elements from the nav graph would probably cause the code to be generated deterministically. @Bubu reported the nondeterministic generation to Google as a bug (see above) and commited a change that implements this (7b0a65c6d5).
  • In our testing setup (like in root post), both @Bubu and I built identical APK files.
  • I opened an upstream PR with the fix: https://github.com/corona-warn-app/cwa-app-android/pull/3325
  • R8 optimizations / minifications are still enabled for our builds, making our APK file smaller :)
  • I merged the changes into our release/2.3.x branch (ae2668161f) and cherry-picked the change for the fullscreen QR code fragment from my upstream PR in b566ffc369. With this, we should also be able to build 2.3 reproducibly.

See also: https://lists.reproducible-builds.org/pipermail/rb-general/2021-May/002267.html

To summarize the happenings until the above commit happened: * We thought that by enabling R8 minification, we could avoid the issue because all builds would remove the unused code. * However, the `dex` file contained some sort of checksum which was based on the source that was used. Therefore, different sources still lead to slightly different files. Helpful link from the reproducible-builds mailing list: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/issues/40085 * We figured out that removing the top-level `action` elements from the nav graph would probably cause the code to be generated deterministically. @Bubu reported the nondeterministic generation to Google as a bug (see above) and commited a change that implements this (7b0a65c6d53bb68e754721ef8e1c410e893480a0). * In our testing setup (like in root post), both @Bubu and I built identical APK files. * I opened an upstream PR with the fix: https://github.com/corona-warn-app/cwa-app-android/pull/3325 * R8 optimizations / minifications are still enabled for our builds, making our APK file smaller :) * I merged the changes into our `release/2.3.x` branch (ae2668161fae23f5bc5e2b23fd15469f5ec00248) and cherry-picked the change for the fullscreen QR code fragment from my upstream PR in b566ffc36929b5ba8cf20de94bcaa3141eabcbab. With this, we should also be able to build 2.3 reproducibly. See also: https://lists.reproducible-builds.org/pipermail/rb-general/2021-May/002267.html
Bubu closed this issue 12 months ago
Poster
Owner
* See https://github.com/corona-warn-app/cwa-app-android/pull/3325#issuecomment-853838715
fynngodau added the
reproducible builds
label 9 months ago
fynngodau referenced this issue from a commit 7 months ago
Sign in to join this conversation.
No Milestone
No Assignees
2 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.