2017-01-23 94 views
3

我正在使用Retrofit來調用API。我添加了一個攔截器來查看被請求的url。在調試版本中,網址被正確翻譯,但簽名版本導致網址不能被翻譯和解析,因爲它應該。一些相關的代碼如下:翻新網址未被正確翻譯

改造服務:

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

調用此方法時,我簡單地傳遞一個整數,以確定發射到請求的數目。在簽名的apk,上述產生以下網址:

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

,而不是

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

正如你所看到的,傳遞到路徑的價值沒有被正確翻譯,而是{number}正在逐字解決。

我也遇到類似的問題今後嘗試後不同的版本:

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' 

我感到奇怪的是運行已簽名的版本APK此問題時,才存在。什麼可能導致這個問題?什麼是修復?

編輯:按照要求,這裏有一些相關的ProGuard規則:

# 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.** 

編輯:我已經建有minifyEnabled集中的釋放false禁用ProGuard的,它工作正常。因此,這個問題必須與我的ProGuard配置相同,儘管我不確定它可能是什麼。

+0

您使用的是progaurd嗎? –

+0

是的。 Retrofit,OkHttp和OkHttp3都添加到我的proguard規則中。 – Orbit

+0

你可以添加你的progaurd規則嗎? –

回答

1

我相信我解決了這個問題。更新有關的依賴,縮小下來到我的ProGuard配置的問題後,我增加了以下規則來我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.** 

此外,一些本地的文件並沒有被保存。包括那些明確的規則或確保您使用通配符來保留所有本地文件應該可以解決問題:

#local 
-keep class example.** { *; } 
+0

你可以接受你自己的答案並獲得一個徽章。 –

+0

有兩天的等待時間才能接受自己的答案。 – Orbit

+0

哎呀,對不起,那麼! –