Skip to content

Commit 2b81a77

Browse files
Fix NoClassDefFoundError for DefaultJsonSerializer$LazyHolder by adding ProGuard/R8 keep rules
Agent-Logs-Url: https://github.com/optimizely/android-sdk/sessions/b3341336-5cfc-4bda-a258-73558bcf3d85 Co-authored-by: muzahidul-opti <129880873+muzahidul-opti@users.noreply.github.com>
1 parent bb99641 commit 2b81a77

1 file changed

Lines changed: 11 additions & 0 deletions

File tree

proguard-rules.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@
3232
# Keep Payload classes that get sent to Optimizely's backend
3333
-keep class com.optimizely.ab.event.internal.payload.** { *; }
3434

35+
# Keep the DefaultJsonSerializer and its LazyHolder inner class.
36+
# LogEvent.getBody() calls DefaultJsonSerializer.getInstance() which accesses
37+
# LazyHolder.INSTANCE via the initialization-on-demand holder pattern.
38+
# Without this rule, R8/ProGuard strips LazyHolder and causes:
39+
# NoClassDefFoundError: com.optimizely.ab.event.internal.serializer.DefaultJsonSerializer$LazyHolder
40+
-keep class com.optimizely.ab.event.internal.serializer.DefaultJsonSerializer { *; }
41+
-keep class com.optimizely.ab.event.internal.serializer.DefaultJsonSerializer$LazyHolder { *; }
42+
# GsonSerializer is the serializer selected at runtime on Android (Gson is bundled; Jackson is not).
43+
# Keeping it ensures R8 does not strip the implementation that DefaultJsonSerializer.create() returns.
44+
-keep class com.optimizely.ab.event.internal.serializer.GsonSerializer { *; }
45+
3546
# Keep these for logging purposes
3647
-keep class com.optimizely.ab.bucketing.DecisionService { *; }
3748
-keep class com.optimizely.ab.Optimizely { *; }

0 commit comments

Comments
 (0)