我启用了Proguard并为我正在使用的所有库添加了正确的proguard规则。
我使用Retrofit进行网络呼叫,使用Jackson转换器来解析响应。
我的Json响应具有根值,使用Jackson解析它我使用设置SerializationFeature.WRAP_ROOT_VALUE
和DeserializationFeature.UNWRAP_ROOT_VALUE
。一切正常,直到我申请了proguard。
在不给出任何解析异常的情况下,字段被解析为空值。
我用于杰克逊的Proguard规则是
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.*
-keepattributes *Annotation*,EnclosingMethod,Signature
-keep class org.codehaus.** { *; }
-keepclassmembers public final enum
org.codehaus.jackson.annotate.JsonAutoDetect$Visibility {
public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *;
}
-keepclasseswithmembers class com.jombay.vger.rx.resources.** {
public protected private <init>(...);
public void set(*);
public ** get*();
}
-keepclasseswithmembers public class com.jombay.vger.retrofit.resources.** {
public protected private <init>(...);
public void set(*);
public ** get*();
}
-keepclasseswithmembers public class com.jombay.vger.utils.** {
public protected private <init>(...);
}
-keepclassmembers class * {
@org.codehaus.jackson.annotate.* *;
}
-keep class com.fasterxml.jackson.databind.ObjectMapper {*;}
-keep class com.fasterxml.jackson.databind.ObjectWriter {*;}
在解决了很多其他问题之后,我已经提出了这个配置。
此处无法调试和了解此问题。
答案 0 :(得分:0)
在保留域类的配置中,您缺少一些通配符。而不是这个
func bridge<T : AnyObject>(obj : T) -> UnsafePointer<Void> {
return UnsafePointer(Unmanaged.passUnretained(obj).toOpaque())
}
func bridge<T : AnyObject>(ptr : UnsafePointer<Void>) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
}
func bridgeRetained<T : AnyObject>(obj : T) -> UnsafePointer<Void> {
return UnsafePointer( Unmanaged.passRetained(obj).toOpaque())}
func bridgeTransfer<T : AnyObject>(ptr : UnsafePointer<Void>) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()}
应该是:
-keepclasseswithmembers class com.jombay.vger.rx.resources.** {
public protected private <init>(...);
public void set(*);
public ** get*();
}