我尝试使用Retrofit 2登录我的用户(基本上是一个GET到具有基本标题的登录URL)它的效果很好,但是一旦我的ProGuard它,标题授权不再发送了. (见日志输出)
示例代码:
用户型号:
public interface UserService { @GET(GET_LOGIN) Observable<User> login(@Header("Authorization") String basic); }
登录活动:
public void onClick(View v) { mRetrofit.create(UserService.class) .login(Credentials.basic(email,password)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(user -> { UserHelper.save(LoginActivity.this,user); },throwable -> Dog.d); }
Proguard文件:
# Retrofit -dontwarn retrofit2.** -dontwarn org.codehaus.mojo.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions -keepattributes *Annotation* -keepclasseswithmembers class * { @retrofit.* <methods>; } -keepclasseswithmembers interface * { @retrofit.* <methods>; }
日志(proguard):
D/OkHttp: --> GET http://passport-supercairos.rhcloud.com/users/login HTTP/1.1 D/OkHttp: User-Agent: VirtualPassport-Client {Android-23} {Aquaris_E5} D/OkHttp: Cache-Control: max-stale=10800 D/OkHttp: --> END GET D/OkHttp: <-- HTTP/1.1 401 Unauthorized (258ms) D/OkHttp: Date: Fri,19 Feb 2016 12:57:19 GMT D/OkHttp: X-Powered-By: Express D/OkHttp: WWW-Authenticate: Basic realm="Users" D/OkHttp: Keep-Alive: timeout=15,max=100 D/OkHttp: Connection: Keep-Alive D/OkHttp: Transfer-Encoding: chunked D/OkHttp: Content-Type: text/plain D/OkHttp: OkHttp-Sent-Millis: 1455886639681 D/OkHttp: OkHttp-Received-Millis: 1455886639787 D/OkHttp: Unauthorized D/OkHttp: <-- END HTTP (12-byte body)
日志(非保固):
D/OkHttp: --> GET http://passport-supercairos.rhcloud.com/users/login HTTP/1.1 D/OkHttp: User-Agent: VirtualPassport-Client {Android-23} {Aquaris_E5} D/OkHttp: Cache-Control: max-stale=10800 D/OkHttp: Authorization: Basic ZG9yb2ZyanVAZ21haWwuY29tOmN2dnZ2dnY= D/OkHttp: --> END GET D/OkHttp: <-- HTTP/1.1 401 Unauthorized (258ms) D/OkHttp: Date: Fri,max=100 D/OkHttp: Connection: Keep-Alive D/OkHttp: Transfer-Encoding: chunked D/OkHttp: Content-Type: text/plain D/OkHttp: OkHttp-Sent-Millis: 1455886639681 D/OkHttp: OkHttp-Received-Millis: 1455886639787 D/OkHttp: Unauthorized D/OkHttp: <-- END HTTP (12-byte body)
完整的代码可以在这里找到:https://github.com/supercairos/virtual-passport
解决方法
我终于设法使其工作.这是关于Retrofit 2的proguard配置
# Retrofit -dontwarn retrofit2.** -dontwarn org.codehaus.mojo.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions -keepattributes *Annotation* -keepattributes RuntimeVisibleAnnotations -keepattributes RuntimeInvisibleAnnotations -keepattributes RuntimeVisibleParameterAnnotations -keepattributes RuntimeInvisibleParameterAnnotations -keepattributes EnclosingMethod -keepclasseswithmembers class * { @retrofit2.* <methods>; } -keepclasseswithmembers interface * { @retrofit2.* <methods>; }
谢谢@ xudshen
UPDATE
主要问题:我用proguard-android-optimize我应该补充说:
-keepclasseswithmembers class * { @retrofit2.http.* <methods>; }
我也切换到正方形提供的常规Retrofit 2 proguard配置:
# Platform calls Class.forName on types which do not exist on Android to determine platform. -dontnote retrofit2.Platform # Platform used when running on RoboVM on iOS. Will not be used at runtime. -dontnote retrofit2.Platform$IOS$MainThreadExecutor # Platform used when running on Java 8 VMs. Will not be used at runtime. -dontwarn retrofit2.Platform$Java8 # Retain generic type information for use by reflection by converters and adapters. -keepattributes Signature # Retain declared checked exceptions for use by a Proxy instance. -keepattributes Exceptions