@@ -163,12 +163,13 @@ public ApplicationExitInfoEventProcessor(
163163 setDevice (event );
164164
165165 final boolean canUseCurrentOptions = isAppNotUpdated (backfillable );
166+ final boolean optionsCacheForCurrentApp = isOptionsCacheForCurrentApp ();
166167
167168 if (!backfillable .shouldEnrich ()) {
168- setRelease (event , canUseCurrentOptions );
169- setEnvironment (event , canUseCurrentOptions );
170- setDist (event , canUseCurrentOptions );
171- setAppVersionAndBuild (event , canUseCurrentOptions );
169+ setRelease (event , canUseCurrentOptions , optionsCacheForCurrentApp );
170+ setEnvironment (event , canUseCurrentOptions , optionsCacheForCurrentApp );
171+ setDist (event , canUseCurrentOptions , optionsCacheForCurrentApp );
172+ setAppVersionAndBuild (event );
172173 options
173174 .getLogger ()
174175 .log (
@@ -179,7 +180,7 @@ public ApplicationExitInfoEventProcessor(
179180
180181 backfillScope (event );
181182
182- backfillOptions (event , canUseCurrentOptions );
183+ backfillOptions (event , canUseCurrentOptions , optionsCacheForCurrentApp );
183184
184185 setStaticValues (event );
185186
@@ -401,17 +402,19 @@ private void setRequest(final @NotNull SentryBaseEvent event) {
401402
402403 // region options persisted values
403404 private void backfillOptions (
404- final @ NotNull SentryEvent event , final boolean canUseCurrentOptions ) {
405- setRelease (event , canUseCurrentOptions );
406- setEnvironment (event , canUseCurrentOptions );
407- setDist (event , canUseCurrentOptions );
405+ final @ NotNull SentryEvent event ,
406+ final boolean canUseCurrentOptions ,
407+ final boolean optionsCacheForCurrentApp ) {
408+ setRelease (event , canUseCurrentOptions , optionsCacheForCurrentApp );
409+ setEnvironment (event , canUseCurrentOptions , optionsCacheForCurrentApp );
410+ setDist (event , canUseCurrentOptions , optionsCacheForCurrentApp );
408411 setDebugMeta (event );
409412 setSdk (event );
410- setApp (event , canUseCurrentOptions );
413+ setApp (event );
411414 setOptionsTags (event );
412415 }
413416
414- private void setApp (final @ NotNull SentryBaseEvent event , final boolean canUseCurrentOptions ) {
417+ private void setApp (final @ NotNull SentryBaseEvent event ) {
415418 App app = event .getContexts ().getApp ();
416419 if (app == null ) {
417420 app = new App ();
@@ -437,18 +440,11 @@ private void setApp(final @NotNull SentryBaseEvent event, final boolean canUseCu
437440 }
438441
439442 event .getContexts ().setApp (app );
440- setAppVersionAndBuild (event , canUseCurrentOptions );
443+ setAppVersionAndBuild (event );
441444 }
442445
443- private void setAppVersionAndBuild (
444- final @ NotNull SentryBaseEvent event , final boolean canUseCurrentOptions ) {
445- String release = event .getRelease ();
446- if (release == null ) {
447- release = PersistingOptionsObserver .read (options , RELEASE_FILENAME , String .class );
448- }
449- if (release == null && canUseCurrentOptions ) {
450- release = options .getRelease ();
451- }
446+ private void setAppVersionAndBuild (final @ NotNull SentryBaseEvent event ) {
447+ final String release = event .getRelease ();
452448 if (release != null ) {
453449 try {
454450 App app = event .getContexts ().getApp ();
@@ -470,25 +466,30 @@ private void setAppVersionAndBuild(
470466 }
471467
472468 private void setRelease (
473- final @ NotNull SentryBaseEvent event , final boolean canUseCurrentOptions ) {
469+ final @ NotNull SentryBaseEvent event ,
470+ final boolean canUseCurrentOptions ,
471+ final boolean optionsCacheForCurrentApp ) {
474472 if (event .getRelease () == null ) {
475- String release = PersistingOptionsObserver .read (options , RELEASE_FILENAME , String .class );
476- if (release == null && canUseCurrentOptions ) {
477- release = options .getRelease ();
478- }
479- event .setRelease (release );
473+ event .setRelease (
474+ getOption (
475+ RELEASE_FILENAME ,
476+ options .getRelease (),
477+ canUseCurrentOptions ,
478+ optionsCacheForCurrentApp ));
480479 }
481480 }
482481
483482 private void setEnvironment (
484- final @ NotNull SentryBaseEvent event , final boolean canUseCurrentOptions ) {
483+ final @ NotNull SentryBaseEvent event ,
484+ final boolean canUseCurrentOptions ,
485+ final boolean optionsCacheForCurrentApp ) {
485486 if (event .getEnvironment () == null ) {
486- final String environment =
487- PersistingOptionsObserver .read (options , ENVIRONMENT_FILENAME , String .class );
488487 event .setEnvironment (
489- environment != null
490- ? environment
491- : canUseCurrentOptions ? options .getEnvironment () : null );
488+ getOption (
489+ ENVIRONMENT_FILENAME ,
490+ options .getEnvironment (),
491+ canUseCurrentOptions ,
492+ optionsCacheForCurrentApp ));
492493 }
493494 }
494495
@@ -516,13 +517,14 @@ private void setDebugMeta(final @NotNull SentryBaseEvent event) {
516517 }
517518 }
518519
519- private void setDist (final @ NotNull SentryBaseEvent event , final boolean canUseCurrentOptions ) {
520+ private void setDist (
521+ final @ NotNull SentryBaseEvent event ,
522+ final boolean canUseCurrentOptions ,
523+ final boolean optionsCacheForCurrentApp ) {
520524 if (event .getDist () == null ) {
521- String dist = PersistingOptionsObserver .read (options , DIST_FILENAME , String .class );
522- if (dist == null && canUseCurrentOptions ) {
523- dist = options .getDist ();
524- }
525- event .setDist (dist );
525+ event .setDist (
526+ getOption (
527+ DIST_FILENAME , options .getDist (), canUseCurrentOptions , optionsCacheForCurrentApp ));
526528 }
527529 // if there's no user-set dist, fall back to versionCode from the release string
528530 if (event .getDist () == null ) {
@@ -540,6 +542,22 @@ private void setDist(final @NotNull SentryBaseEvent event, final boolean canUseC
540542 }
541543 }
542544
545+ private @ Nullable String getOption (
546+ final @ NotNull String fileName ,
547+ final @ Nullable String currentValue ,
548+ final boolean canUseCurrentOptions ,
549+ final boolean optionsCacheForCurrentApp ) {
550+ if (canUseCurrentOptions && !optionsCacheForCurrentApp ) {
551+ return currentValue ;
552+ }
553+ if (!canUseCurrentOptions && optionsCacheForCurrentApp ) {
554+ return null ;
555+ }
556+
557+ final String persistedValue = PersistingOptionsObserver .read (options , fileName , String .class );
558+ return persistedValue != null ? persistedValue : canUseCurrentOptions ? currentValue : null ;
559+ }
560+
543561 private boolean isAppNotUpdated (final @ NotNull Backfillable hint ) {
544562 final @ Nullable Long timestamp ;
545563 if (hint instanceof AbnormalExit ) {
@@ -559,6 +577,15 @@ private boolean isAppNotUpdated(final @NotNull Backfillable hint) {
559577 && packageInfo .lastUpdateTime <= timestamp ;
560578 }
561579
580+ private boolean isOptionsCacheForCurrentApp () {
581+ final Long cachedLastUpdateTime = PersistingOptionsCacheGenerationObserver .read (options );
582+ final PackageInfo packageInfo = ContextUtils .getPackageInfo (context , buildInfoProvider );
583+ return cachedLastUpdateTime != null
584+ && packageInfo != null
585+ && packageInfo .lastUpdateTime > 0
586+ && cachedLastUpdateTime == packageInfo .lastUpdateTime ;
587+ }
588+
562589 private void setSdk (final @ NotNull SentryBaseEvent event ) {
563590 if (event .getSdk () == null ) {
564591 final SdkVersion sdkVersion =
0 commit comments