我尝试使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。