2017-10-31 16 views
0

を有効にするとき、私は私のプロジェクトでは、ProGuardを有効にしようとしているが、私のクラスは、ProGuardので難読化ばかり続け、私はこのメッセージを得た:私も私のモデルで@SerializedName注釈を使用していGsonエラーProGuardの

Process: com.myapp.myapp, PID: 4313 
                   java.lang.IllegalArgumentException: Unable to create converter for class com.myapp.myapp.data.remote.response.LoginResponse 
                    for method AccountsEndPoint.login 
                    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:752) 
                    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:738) 
                    at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:169) 
                    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170) 
                    at retrofit2.Retrofit$1.invoke(Retrofit.java:147) 
                    at java.lang.reflect.Proxy.invoke(Proxy.java:813) 
                    at $Proxy1.login(Unknown Source) 
                    at com.myapp.myapp.presentation.activities.LoginActivity.a(LoginActivity.java:211) 
                    at com.myapp.myapp.presentation.activities.LoginActivity$1.onClick(LoginActivity.java:97) 
                    at android.view.View.performClick(View.java:5637) 
                    at android.view.View$PerformClick.run(View.java:22429) 
                    at android.os.Handler.handleCallback(Handler.java:751) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6119) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                    Caused by: java.lang.IllegalArgumentException: class com.myapp.myapp.data.b.a.a declares multiple JSON fields named a 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 
                    at com.google.gson.Gson.getAdapter(Gson.java:423) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 
                    at com.google.gson.Gson.getAdapter(Gson.java:423) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) 
                    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 
                    at com.google.gson.Gson.getAdapter(Gson.java:423) 
                    at retrofit2.converter.gson.GsonConverterFactory.responseBodyConverter(GsonConverterFactory.java:64) 
                    at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:330) 
                    at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:313) 
                    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:736) 
                    at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:169)  
                    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)  
                    at retrofit2.Retrofit$1.invoke(Retrofit.java:147)  
                    at java.lang.reflect.Proxy.invoke(Proxy.java:813)  
                    at $Proxy1.login(Unknown Source)  
                    at com.myapp.myapp.presentation.activities.LoginActivity.a(LoginActivity.java:211)  
                    at com.myapp.myapp.presentation.activities.LoginActivity$1.onClick(LoginActivity.java:97)  
                    at android.view.View.performClick(View.java:5637)  
                    at android.view.View$PerformClick.run(View.java:22429)  
                    at android.os.Handler.handleCallback(Handler.java:751)  
                    at android.os.Handler.dispatchMessage(Handler.java:95)  
                    at android.os.Looper.loop(Looper.java:154)  
                    at android.app.ActivityThread.main(ActivityThread.java:6119)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

を私は私のproguard-rules.proに追加している:

-keep class com.myapp.myapp.data.remote.request.** { *;} 
-keep class com.myapp.myapp.data.remote.response.** { *; } 

答えて

0

設定minifyEnabled false場合:

1 - を追加しました@SerializedNameモデルの属性に。

2を(これが本当の名前を見つけることがGSONを助けます) - あなたのProGuardのファイルにこの設定を追加します。すべてのあなたのモデルが@SerializedNameを使用している場合は、このエラーチェックを取得しておく場合は

###GSON 
##---------------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.** { *; } 


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

##---------------End: proguard configuration for Gson ---------- 
-keep class com.myapp.data.remote.request.** { *; } # <--- Add your models package here 

、3-上記のルールに含まれているパッケージ

0

おそらくfollowing linkからgsonためProGuardのを追加する必要があります。それは、これを含んでいます。あなたがして、あなたのクラスのフィールドを維持しようとすることができます

##---------------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.** { *; } 

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

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

UPDATE

-keep class com.myapp.myapp.data.remote.request.** { <fields>; } 
-keep class com.myapp.myapp.data.remote.response.** { <fields>; } 
+0

すでに私のプロガードファイルに追加 –

+0

フィールドを保持する方法を追加して私の答えを更新しました。 –

+0

答えを試してみました。これを使うようにしました:-keepclassmembers class com.myapp.myapp.data.remote.request。** {; } -keepclassmembersクラスcom.myapp.myapp.data.remote.response。** {; } –

0

ProGuardのは、だからあなたのクラス、フィールドやメソッド名を難読化デシリアライズすることはできません。

最初に、モデルクラスのすべてのフィールドに@SerializedNameアノテーションを使用してみてください。

例えば、

@SerializedName("name") 
private String name; 

また、@ישואוהבאותךのように適切なプロガード設定を使用してください。

これらのいずれかで問題を解決できなかった場合、最後の手段はプロガードを無効にすることです。あなたがチェックし、このエラーに遭遇するかどうかファイルbuild.gradle

+0

私は私の質問では、@ SerializedNameもproguardのルールを使用して私のクラスを維持しようとしていると言ったように。 –

関連する問題