2017-01-23 5 views
3

Ich verwende Retrofit, um Aufrufe an eine API zu tätigen. Ich habe einen Interceptor hinzugefügt, um die angeforderte URL anzuzeigen. In Debug-Releases wird die URL korrekt übersetzt, aber signierte Releases führen dazu, dass die URL nicht wie erwartet übersetzt und analysiert wird. Einige relevante Code ist unten:Retrofit-URL wird nicht korrekt übersetzt

Retrofit Service:

@GET("/1.1/launch/next/{number}") 
Observable<LaunchResponse> getNextXLaunches(@Path("number") int numberOfNextLaunches); 

Wenn Sie diese Methode aufrufen, habe ich einfach in einer ganzen Zahl passieren die Anzahl der Starts zu bestimmen, zu beantragen. In unterzeichnet APKs erzeugt die oben die folgende URL:

..../1.1/launch/next/%7BlaunchNum%7D

statt

..../1.1/launch/next/10

Wie Sie sehen können, wird der Wert in den Weg geleitet nicht richtig übersetzt werden, und statt {number} wird buchstäblich aufgelöst.

Ich habe verschiedene Versionen versucht, nach über ähnliche Probleme kommen:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' 
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' 
compile 'com.squareup.okhttp:okhttp:2.4.0' 
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' 
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1' 

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.squareup.okhttp3:okhttp:3.5.0' 
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' 

Was ich seltsam finde, ist dieses Problem nur dann vorliegt, wenn ein unterzeichnetes Release apk läuft. Was könnte dieses Problem verursachen? Was ist das Problem?

EDIT: Wie gewünscht, hier sind einige relevante proguard Regeln:

# Retrofit 2.X 
-dontwarn retrofit2.** 
-keep class retrofit2.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 

# OkHttp 
-keepattributes Signature 
-keepattributes *Annotation* 
-keep class com.squareup.okhttp.** { *; } 
-keep interface com.squareup.okhttp.** { *; } 
-dontwarn com.squareup.okhttp.** 

# OkHttp3 
-keepattributes Signature 
-keepattributes *Annotation* 
-keep class okhttp3.** { *; } 
-keep interface okhttp3.** { *; } 
-dontwarn okhttp3.** 

EDIT: ich Release mit minifyEnabled Set false gebaut haben ProGuard zu deaktivieren, und es funktionierte richtig. Daher muss das Problem mit meiner ProGuard-Konfiguration zusammenhängen, obwohl ich nicht sicher bin, was es sein könnte.

+0

verwenden Sie progaurd? –

+0

Ja. Retrofit, OkHttp und OkHttp3 werden alle zu meinen Proguard-Regeln hinzugefügt. – Orbit

+0

Können Sie Ihre Regeln hinzufügen? –

Antwort

1

Ich glaube, ich habe das Problem behoben. Nachdem die entsprechenden Abhängigkeiten zu aktualisieren und es auf ein Problem mit meiner ProGuard Konfiguration verengen, habe ich die folgenden Regeln zu meinem proguard-rules.pro:

# Retrofit 2.X 
... 
-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 

# Note: had already been added when updating to OkHttp 3. 
# OkHttp3 
-keepattributes Signature 
-keepattributes *Annotation* 
-keep class okhttp3.** { *; } 
-keep interface okhttp3.** { *; } 
-dontwarn okhttp3.** 

Darüber hinaus wurden mehrere lokale Dateien nicht gehalten werden. Wenn Sie explizit die Regeln in die Regeln aufnehmen oder sicherstellen, dass Sie alle lokalen Dateien mit einem Platzhalter versehen, sollte das Problem behoben werden:

+0

Sie können Ihre eigene Antwort akzeptieren und ein Badge erhalten. –

+0

Es gibt eine Wartezeit von 2 Tagen, bevor Sie die Selbstantworten akzeptieren können. – Orbit

+0

oops, sorry, dann! –

Verwandte Themen