Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

After enable R8 full mode getting ParameterizedType error #3751

Closed
NG-Gaurav opened this issue Jul 8, 2022 · 56 comments
Closed

After enable R8 full mode getting ParameterizedType error #3751

NG-Gaurav opened this issue Jul 8, 2022 · 56 comments

Comments

@NG-Gaurav
Copy link

Accessing hidden method Ljava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V (greylist, reflection, allowed)
16:09:29.013 W java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
16:09:29.014 W at retrofit2.HttpServiceMethod.parseAnnotations(SourceFile:46)
16:09:29.014 W at retrofit2.ServiceMethod.parseAnnotations(SourceFile:39)
16:09:29.014 W at retrofit2.Retrofit.loadServiceMethod(SourceFile:202)
16:09:29.014 W at retrofit2.Retrofit$1.invoke(SourceFile:160)
16:09:29.014 W at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
16:09:29.014 W at $Proxy6.generateAnonymousAuthTokenAsyn(Unknown Source)

@marcoscostaanddev
Copy link

I'm facing a very similar issue. When i fire up the request with proguard enabled in R8 fullmode this exception raises:

java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at retrofit2.HttpServiceMethod.parseAnnotations(SourceFile:46)
at retrofit2.ServiceMethod.parseAnnotations(SourceFile:39)
at retrofit2.Retrofit.loadServiceMethod(SourceFile:202)
at retrofit2.Retrofit$1.invoke(SourceFile:160)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)

I believe that probably is a bug with R8 fullmode enabled. I'm using retrofit 2.9.0 + okHttp3 4.2.0 + square-gson-converter 2.6.1 + kotlin coroutines.

@Goooler
Copy link
Contributor

Goooler commented Jul 22, 2022

New proguard rules added but not published yet, you can add these rules to your proguard-rules files.

# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

See #3579 & #3598.


EDIT: Now you can just simplify use these

# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
# R8 full mode strips generic signatures from return types if not kept.
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>
# With R8 full mode generic signatures are stripped for classes that are not kept.
-keep,allowobfuscation,allowshrinking class retrofit2.Response

@svenjacobs
Copy link

Now that Android Studio Flamingo with AGP 8.0 enabled R8 full mode by default, I'm facing the same issue.

Could you please release a new version of Retrofit with the updated consumer rules?

@Goooler
Copy link
Contributor

Goooler commented Apr 14, 2023

You can just copy-paste the rules #3751 (comment) into your project.

@svenjacobs
Copy link

You can just copy-paste the rules #3751 (comment) into your project.

I know, but not having to maintain R8 rules for third-party libraries is much nicer 😉

@proninyaroslav
Copy link

proninyaroslav commented Apr 16, 2023

@Goooler
It doesn't actually work, at least for me with AGP 8.0. After adding this proguard lines I get a slightly different error. Perhaps the reason is in the sandwich library, but I'm not sure:

 java.lang.IllegalArgumentException: Unable to create call adapter for retrofit2.Call<com.skydoves.sandwich.ApiResponse>
                     for method ComicVineService.issues
                 	at retrofit2.Utils.methodError(SourceFile:47)
                 	at retrofit2.HttpServiceMethod.parseAnnotations(SourceFile:394)
                 	at retrofit2.Retrofit.loadServiceMethod(SourceFile:31)
                 	at retrofit2.Retrofit$1.invoke(SourceFile:45)
                 	at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
                 	at $Proxy9.issues(Unknown Source)
                        ...
Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
                 	at com.skydoves.sandwich.adapters.ApiResponseCallAdapterFactory.get(SourceFile:53)
                 	at retrofit2.Retrofit.callAdapter(SourceFile:33)
                 	at retrofit2.HttpServiceMethod.parseAnnotations(SourceFile:375)
                 	... 41 more
 @GET("issues?format=$FORMAT&field_list=${Fields.Issues}")
    @JvmSuppressWildcards
    suspend fun issues(
        @Query("api_key") apiKey: String,
        @Query("offset") offset: Int,
        @Query("limit") limit: Int,
        @Query("sort", encoded = true) sort: ComicVineSort?,
        @Query("filter[]", encoded = true) filter: List<ComicVineFilter>?,
    ): ApiResponse<IssuesResponse>

@Goooler
Copy link
Contributor

Goooler commented Apr 18, 2023

Things about Sandwich will be fixed in skydoves/sandwich#103.

@jafar-alrashid
Copy link

New proguard rules added but not published yet, you can add these rules to your proguard-rules files.

# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

See #3579 & #3598.

Hi
I have added these rules to my project and still getting the same error, did this work for anyone?

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:46)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
at retrofit2.Retrofit$1.invoke(Retrofit.java:160)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)

@G00fY2
Copy link

G00fY2 commented Apr 20, 2023

The R8 FAQ states the following:

Attributes (such as Signature) and annotations are only kept for classes, methods and fields which are matched by keep rules even when -keepattributes is specified. The weakest rule that will keep annotations and attributes is -keep[classmembers],allowshrinking,allowoptimization,allowobfuscation,allowaccessmodification class-specification Additionally, for attributes describing a relationship such as InnerClass and EnclosingMethod, non-compat mode requires both endpoints being kept.

Does anyone know why the rules in retrofit only contain keep,allowobfuscation,allowshrinking but missing allowoptimization and allowaccessmodification?

The ProGuard documentation states that allowaccessmodification should probably not be used for libraries:

Counter-indication: you probably shouldn't use this option when processing code that is to be used as a library, since classes and class members that weren't designed to be public in the API may become public.

But what about the allowoptimization?

@chiragthummar
Copy link

Now that Android Studio Flamingo with AGP 8.0 enabled R8 full mode by default, I'm facing the same issue.

Could you please release a new version of Retrofit with the updated consumer rules?

Did you able to solve it?

@svenjacobs
Copy link

svenjacobs commented Apr 21, 2023

Did you able to solve it?

@chiragthummar I just copied these rules into my project but I would still prefer a new Retrofit release 🙏🏼

@chiragthummar
Copy link

Thanks you for your answer @svenjacobs

@DarkAbhi
Copy link

DarkAbhi commented Apr 27, 2023

Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).

-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response

With R8 full mode generic signatures are stripped for classes that are not

kept. Suspend functions are wrapped in continuations where the type argument

is used.

-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

Same, have you found the issue?
This is my exact issue if it helps - https://stackoverflow.com/questions/76118721/r8-full-mode-throws-class-cast-exception-agp-8-0

@DarkAbhi
Copy link

ChatGPT gave me this as the answer

The java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType error can occur with Retrofit and Moshi when using R8 full mode because R8 removes the generic type information during the code optimization process. Here's how you can fix this issue:

Add the following Proguard/R8 rule to your proguard-rules.pro file to keep the generic type information:

-keepattributes Signature

If you're using Moshi, add the following Proguard/R8 rule to your proguard-rules.pro file to keep the classes that are used for JSON serialization and deserialization:

-keepclassmembers class com.example.MyClass {
  @com.squareup.moshi.FromJson *;
  @com.squareup.moshi.ToJson *;
}

Replace com.example.MyClass with the name of your class.

If you're using Kotlin, add the following Proguard/R8 rule to your proguard-rules.pro file to keep the Kotlin metadata:

-keepclassmembers class com.example.MyClass {
  kotlin.Metadata <fields>;
}

Replace com.example.MyClass with the name of your class.

If you're still experiencing the issue, you can try using the TypeToken class from the Gson library instead of the ParameterizedType class. To use TypeToken, replace the following code:

Type type = new TypeToken<List<MyClass>>(){}.getType();

with:

Type type = Types.newParameterizedType(List.class, MyClass.class);

Note that you'll need to add the following dependency to your build.gradle file:

implementation 'com.google.code.gson:gson:2.8.9'

Finally, if you're using a custom Moshi JsonAdapter, you can try adding the @JsonClass(generateAdapter = true) annotation to your data class to generate the adapter at compile-time. This can help to avoid issues with R8. For example:

@JsonClass(generateAdapter = true)
data class MyClass(val name: String)

These steps should help you to resolve the java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType error when using Retrofit and Moshi with R8 full mode.

@eury-fsl
Copy link

eury-fsl commented Apr 27, 2023

If any of you are using a custom sealed class to represent your API calls state, make sure you include that, as done in the sandwich.pro file in this PR. Your final rules can look like:

# https://github.com/square/okhttp/blob/339732e3a1b78be5d792860109047f68a011b5eb/okhttp/src/jvmMain/resources/META-INF/proguard/okhttp3.pro#L11-L14
-dontwarn okhttp3.internal.platform.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**

# TODO: Waiting for new retrofit release to remove these rules
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

-keep,allowobfuscation,allowshrinking class com.your.company.YourCustomSealedClass

@DarkAbhi
Copy link

@eury-fsl will try this and get back.

@chiragthummar
Copy link

My Working Solutions

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}


-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type


# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

##---------------End: proguard configuration for Gson  ----------

@StylianosGakis
Copy link

If any of you are using a custom sealed class to represent your API calls state, make sure you include that, as done in the sandwich.pro file in this PR. Your final rules can look like:

# https://github.com/square/okhttp/blob/339732e3a1b78be5d792860109047f68a011b5eb/okhttp/src/jvmMain/resources/META-INF/proguard/okhttp3.pro#L11-L14
-dontwarn okhttp3.internal.platform.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**

# TODO: Waiting for new retrofit release to remove these rules
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

-keep,allowobfuscation,allowshrinking class com.your.company.YourCustomSealedClass

Yup, when using https://github.com/arrow-kt/arrow-integrations/tree/main/arrow-integrations-retrofit-adapter arrow adapter which turns the response into and arrow.core.Either<>

I had to add exactly what was said above +
-keep,allowobfuscation,allowshrinking class arrow.core.Either and it now works

@DarkAbhi
Copy link

DarkAbhi commented Apr 27, 2023

@eury-fsl will try this and get back.

Okay this doesn't work I'm convinced I've got something to deal with Moshi.

This is my issue if anyone has a clue, thanks

Github issue - #3751 (comment)
Stackoverflow - https://stackoverflow.com/questions/76118721/r8-full-mode-throws-class-cast-exception-agp-8-0

@eury-fsl
Copy link

@DarkAbhi Can you show me your rules and code for one of your APIs (the interface).

@DarkAbhi
Copy link

@eury-fsl here, this is my proguard

-keep class  com.iku.community_chat.data.room.entity.** { *; }
-keep class androidx.appcompat.widget.** { *; }
#Jsoup
-keep public class org.jsoup.** {
public *;
}
-keepnames class com.iku.user.profile.data.room.models.** { *; }
-keepnames class com.iku.community_courses.data.room.entity.** { *; }
-keeppackagenames org.jsoup.nodes

# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response

# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
-keep,allowobfuscation,allowshrinking class com.squareup.moshi.JsonAdapter

My ApiService

interface IkuApiService {
/**
     * Check if email exists
     *
     * @param email
     * @param authorization
     * @return
     */
    @FormUrlEncoded
    @POST("emailcheck")
    suspend fun checkIfEmailExists(
        @Field("email") email: String,
        @Tag authorization: AuthorizationType = AuthorizationType.NONE,
    ): EmailCheckModel

I have tried to add various rules to try out, this is what it is for now - https://pastebin.com/zJPcJFYT
Also trying out @keep on my models and apiService.

@eury-fsl
Copy link

@DarkAbhi Do you have a custom CallAdapter set to retrofit?

@DarkAbhi
Copy link

@eury-fsl No.
This is how I provide my retrofit instances

@Provides
    @Singleton
    @Keep
    fun getIkuRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): IkuApiService {
        return Retrofit.Builder()
            .baseUrl(Constants.IKU_BASE_URL)
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .client(okHttpClient)
            .build()
            .create(IkuApiService::class.java)
    }

    @Provides
    @Singleton
    @Keep
    fun getIkuAuthApiRetrofit(
        moshi: Moshi,
        @Named("for_auth") okHttpClient: OkHttpClient,
    ): IkuAuthApiService {
        return Retrofit.Builder()
            .baseUrl(Constants.IKU_BASE_URL)
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .client(okHttpClient)
            .build()
            .create(IkuAuthApiService::class.java)

@VicV
Copy link

VicV commented Aug 4, 2023 via email

@ravibpatel
Copy link

ravibpatel commented Aug 14, 2023

Combining officialy commited proguard rules with @digrec's solution worked for me.

# Keep inherited services.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface * extends <1>

# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

# R8 full mode strips generic signatures from return types if not kept.
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>

# If a class is used in some way by the application, and has fields annotated with @SerializedName
# and a no-args constructor, keep those fields and the constructor
# Based on https://issuetracker.google.com/issues/150189783#comment11
# See also https://github.com/google/gson/pull/2420#discussion_r1241813541 for a more detailed explanation
-if class *
-keepclasseswithmembers,allowobfuscation,allowoptimization class <1> {
  <init>();
  @com.google.gson.annotations.SerializedName <fields>;
}

@Del-S
Copy link

Del-S commented Sep 13, 2023

So fix for me was to use this rule from retrofit2.pro

# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

And remove allowshrinking from it. Not really sure why. I guess it removed the functions because it seen them as unused? It might be becuase the Interface is provided using Hilt. But all of the functions are used in code so I don't know.

Now I have the rule as follow and it works:

# Retain service method parameters when optimizing.
-keep,allowobfuscation,allowoptimization interface * {
    @retrofit2.http.* <methods>;
}

Project is multimodule with Hilt as DI and Moshi as Json convertor. Example of our interface is like this:

internal interface AuthRestApi {

	@POST("main/users/login")
	suspend fun login(
		@Header(NetworkConstant.Header.HEADER_ACCEPT) endpointVersion: String = NetworkConstant.createEndpointVersion(),
		@Body request: LoginUserRequest
	): Response<LoginResponse>
}

@ariefzuhri
Copy link

ariefzuhri commented Sep 22, 2023

If you have tried all the solutions above and still haven't fixed the issue yet, make sure you have defined this line in every buildTypes configuration where minifyEnabled true.

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

I resolved this issue by adding the rule from retrofit2.pro to proguard-rules.pro and defining proguardFiles in my debug build type.

# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod

# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations

# Keep annotation default values (e.g., retrofit2.http.Field.encoded).
-keepattributes AnnotationDefault

# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**

# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit

# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
-dontwarn retrofit2.KotlinExtensions$*

# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy
# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface <1>

# Keep inherited services.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface * extends <1>

# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

# R8 full mode strips generic signatures from return types if not kept.
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>

# With R8 full mode generic signatures are stripped for classes that are not kept.
-keep,allowobfuscation,allowshrinking class retrofit2.Response

Edited:
If you're using Gson (or a third-party library that depends on Gson) and encounter this new issue:
java.lang.IllegalStateException: TypeToken must be created with a type argument: new TypeToken<...>() {}; When using code shrinkers (ProGuard, R8, ...) make sure that generic signatures are preserved.
Try adding this rule:

# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

@svenjacobs
Copy link

Now that Android Studio Flamingo with AGP 8.0 enabled R8 full mode by default, I'm facing the same issue.

Could you please release a new version of Retrofit with the updated consumer rules?

I'm sorry to ask again but is there a reason why no new version of Retrofit has been released in the past three years? Is this project still maintained?

@MalikHamidJaved
Copy link

Thank you everyone proguard rules were effective

@behnawwm
Copy link

I had an issue and I've applied all of the rules in addition to my custom CallAdapterFactory rules but it didn't work. The issue with my project was the deprecated Retrofit Coroutines Adapter which was deprecated. I removed it and it fixed my problem.
Hope it helps!

@Goooler
Copy link
Contributor

Goooler commented Dec 29, 2023

For ones who need this support, you can try out my fork, use io.github.goooler.retrofit2:retrofit:2.10.0, check https://github.com/Goooler/retrofit/releases/tag/2.10.0

@DjuroRad
Copy link

Just a small note:
If you are developing a library/sdk, make sure to have the above-mentioned rules applied inside of consumer-rules.pro.

@JakeWharton
Copy link
Collaborator

Closing since the fix was merged. Will be included in the next release.

@SIVA3161
Copy link

(#3751 (comment))
Thanks @marcoscostaanddev ] , adding these rules into my proguard , helped me fixing this (#3751 (comment)).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests