与gson和jackson的Proguard问题



我的项目中没有使用jackson。我只使用gson库,但当我试图构建发布版apk时,proguard显示了很多警告。

以下是警告:-

Warning:org.immutables.gson.adapter.ExpectedSubtypesAdapter$JsonParserReaderSupplier: can't find referenced class com.fasterxml.jackson.databind.util.TokenBuffer
Warning:org.immutables.gson.adapter.FieldNamingTranslator: can't find referenced class sun.reflect.ReflectionFactory
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value$Immutable
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value$Style
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value$Style$ImplementationVisibility
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value$Immutable
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value$Style
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$GsonProviderOptions: can't find referenced class org.immutables.value.Value$Style$ImplementationVisibility
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonFactory
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonGenerator
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonFactory
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonParser$Feature
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonFactory
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonGenerator$Feature
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonFactory
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonGenerator
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonParser$Feature
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonGenerator$Feature
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonFactory
Warning:org.immutables.gson.stream.GsonMessageBodyProvider$JacksonStreamer: can't find referenced class com.fasterxml.jackson.core.JsonGenerator
Warning:org.immutables.gson.stream.JsonGeneratorWriter: can't find referenced class com.fasterxml.jackson.core.JsonGenerator
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.databind.util.TokenBuffer
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.databind.util.TokenBuffer
Warning:org.immutables.gson.stream.JsonParserReader: can't find referenced class com.fasterxml.jackson.core.JsonParser
Warning:org.immutables.gson.stream.JsonParserReader$2: can't find referenced class com.fasterxml.jackson.core.JsonToken
Warning:org.parceler.ParcelAnnotationProcessor: can't find referenced method 'void init(javax.annotation.processing.ProcessingEnvironment)' in program class org.parceler.transfuse.AnnotationProcessorBase
Warning:org.parceler.ParcelAnnotationProcessor: can't find referenced class com.google.auto.service.AutoService
Warning:org.parceler.apache.commons.beanutils.MappedPropertyDescriptor: can't find referenced method 'void setName(java.lang.String)' in program class org.parceler.apache.commons.beanutils.MappedPropertyDescriptor
Warning:org.parceler.apache.commons.logging.impl.AvalonLogger: can't find referenced class org.parceler.apache.avalon.framework.logger.Logger
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Category
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Priority
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Logger
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Category
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Logger
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Priority
Warning:org.parceler.apache.commons.logging.impl.Log4JLogger: can't find referenced class org.parceler.apache.log4j.Logger
Warning:org.parceler.apache.commons.logging.impl.LogKitLogger: can't find referenced class org.parceler.apache.log.Hierarchy
Warning:org.parceler.apache.commons.logging.impl.LogKitLogger: can't find referenced class org.parceler.apache.log.Logger
Warning:org.parceler.codemodel.util.SingleByteEncoder: can't find referenced class sun.nio.cs.Surrogate$Parser
Warning:org.parceler.codemodel.util.SingleByteEncoder: can't find referenced class sun.nio.cs.Surrogate
Warning:org.parceler.codemodel.util.SingleByteEncoder: can't find referenced class sun.nio.cs.Surrogate$Parser
Warning:org.parceler.codemodel.util.SingleByteEncoder: can't find referenced class sun.nio.cs.Surrogate
Warning:org.parceler.codemodel.util.SingleByteEncoder: can't find referenced class sun.nio.cs.Surrogate$Parser
Warning:org.parceler.guava.cache.Striped64: can't find referenced class sun.misc.Unsafe
Warning:org.parceler.guava.cache.Striped64$1: can't find referenced class sun.misc.Unsafe
Warning:org.parceler.guava.cache.Striped64$Cell: can't find referenced class sun.misc.Unsafe
Warning:org.parceler.guava.primitives.UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator: can't find referenced class sun.misc.Unsafe
Warning:org.parceler.guava.primitives.UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator$1: can't find referenced class sun.misc.Unsafe
Warning:org.parceler.transfuse.bootstrap.BootstrapProcessor: can't find referenced field 'javax.annotation.processing.ProcessingEnvironment processingEnv' in program class org.parceler.transfuse.bootstrap.BootstrapProcessor
Warning:org.parceler.transfuse.gen.FilerResourceWriter: can't find referenced class javax.tools.JavaFileManager$Location
Warning:org.parceler.transfuse.gen.FilerResourceWriter: can't find referenced class javax.tools.JavaFileManager
Warning:org.parceler.transfuse.gen.FilerResourceWriter: can't find referenced class javax.tools.StandardLocation
Warning:org.parceler.transfuse.gen.FilerResourceWriter: can't find referenced class javax.tools.FileObject
Warning:org.parceler.transfuse.gen.FilerSourceCodeWriter: can't find referenced class javax.tools.JavaFileObject
Warning:org.parceler.transfuse.util.MessagerLogger: can't find referenced class javax.tools.Diagnostic$Kind
Warning:org.parceler.transfuse.util.MessagerLogger: can't find referenced class javax.tools.Diagnostic
Warning:org.parceler.transfuse.util.MessagerLogger: can't find referenced class javax.tools.Diagnostic$Kind
Warning:org.parceler.transfuse.validation.Validator: can't find referenced class javax.tools.Diagnostic$Kind
Warning:org.parceler.transfuse.validation.Validator: can't find referenced class javax.tools.Diagnostic
Warning:org.parceler.transfuse.validation.Validator: can't find referenced class javax.tools.Diagnostic$Kind
Warning:org.parceler.transfuse.validation.Validator$ValidationBuilder: can't find referenced class javax.tools.Diagnostic$Kind
Warning:org.parceler.transfuse.validation.Validator$ValidationBuilder: can't find referenced class javax.tools.Diagnostic
Warning:org.parceler.transfuse.validation.Validator$ValidationBuilder: can't find referenced class javax.tools.Diagnostic$Kind

这是我完整的proguard文件

# Apache
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-dontwarn android.net.**
# ButterKnife 7
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}
# Crashlytics 1.+
-keep class com.crashlytics.** { *; }
-keepattributes SourceFile,LineNumberTable
# Deeplink dispatch
-keep class com.airbnb.deeplinkdispatch.** { *; }
-keepclasseswithmembers class * { @com.airbnb.deeplinkdispatch.DeepLink <methods>;}
# Configuration for Fabric Twitter Kit
# See: https://dev.twitter.com/twitter-kit/android/integrate
-dontwarn com.squareup.okhttp.**
-dontwarn com.google.appengine.api.urlfetch.**
-dontwarn rx.**
-dontwarn retrofit.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
    @retrofit.http.* *;
}
# Facebook 3.2
-keep class com.facebook.** { *; }
-keepattributes Signature
## Google Play Services 4.3.23 specific rules ##
## https://developer.android.com/google/play-services/setup.html#Proguard ##
-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}
## GSON 2.2.4 specific rules ##
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
-keepattributes EnclosingMethod
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
# MoPub Proguard Config
# NOTE: You should also include the Android Proguard config found with the build tools:
# $ANDROID_HOME/tools/proguard/proguard-android.txt
# Keep public classes and methods.
-keepclassmembers class com.mopub.** { public *; }
-keep public class com.mopub.**
-keep public class android.webkit.JavascriptInterface {}
# Explicitly keep any custom event classes in any package.
-keep class * extends com.mopub.mobileads.CustomEventBanner {}
-keep class * extends com.mopub.mobileads.CustomEventInterstitial {}
-keep class * extends com.mopub.nativeads.CustomEventNative {}
-keep class * extends com.mopub.mobileads.GooglePlayServicesBanner {}
-keep class * extends com.mopub.nativeads.AvocarrotNativeMopub {}
# Support for Android Advertiser ID.
-keep class com.google.android.gms.common.GooglePlayServicesUtil {*;}
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {*;}
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info {*;}
# Simple-fb
-keep class com.sromku.simple.fb.entities.** { *; }
# OkHttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
## Square Otto specific rules ##
## https://square.github.io/otto/ ##
# Otto
-keepattributes *Annotation*
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}
## Square Picasso specific rules ##
## https://square.github.io/picasso/ ##
-dontwarn com.squareup.okhttp.**
# Retrofit 1.X
-keep class com.squareup.okhttp.** { *; }
-keep class retrofit.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
-dontwarn okio.**
-dontwarn retrofit.**
-dontwarn rx.**
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}
# If in your rest service interface you use methods with Callback argument.
-keepattributes Exceptions
# If your rest service methods throw custom exceptions, because you've defined an ErrorHandler.
-keepattributes Signature
# Also you must note that if you are using GSON for conversion from JSON to POJO representation, you must ignore those POJO classes from being obfuscated.
# Here include the POJO's that have you have created for mapping JSON response to POJO for example.
-keep class com.myproject.model.** { *; }
# Android design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
-keep public class android.support.v7.widget.** { *; }
-keep public class android.support.v7.internal.widget.** { *; }
-keep public class android.support.v7.internal.view.menu.** { *; }
-keep public class * extends android.support.v4.view.ActionProvider {
    public <init>(android.content.Context);
}
# app specific
-keepclassmembers class com.myproject.** {
   public *;
}
# Removing logs
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
# Keep the support library
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**
## ---------------- End Project specifics ---------------- ##

请帮助,如何修复它。

如果按照Emanuel Seidinger的建议添加keeptattributes行后仍然出现错误,请为导致问题的包添加dontwarn指令。

-dontwarn org.codehaus.jackson.**

我会从不同的角度来解决这个问题。我在这里看到的是,您提供的警告可能表明仅编译工件意外泄漏到由ProGuard处理的实际编译/运行时类路径。特别是,注释处理器(如ParcelAnnotationProcessor)和可选注释不应包含在常规编译范围中。

通常你可以做的是根据你使用的apt插件将这些依赖关系的范围设置为providedcompileOnly(假设你使用Gradle构建android应用程序)

作为org.immutables库的作者之一,我已经在ProGuard中遇到并讨论了一些困难,ProGuard可能无法识别特殊的仅编译作用域等。在您的特定情况下,您使用org.immutables:gson工件,它包含可选的Jackson-Gson集成桥类,这些类被传播来构建。在安卓系统上,你通常不需要这些类。作为一种解决方案,我建议使用annotations分类器(使用类似provided "org.immutables:gson:2.1.11:annotations"的分类器)将org.immutables:gson工件替换为仅注释版本。这个工件排除了任何不需要的Jackson依赖类。使用不可变注释处理器时,请参阅渐变配置示例:http://immutables.github.io/getstarted.html#android

我还在Android项目中使用GSON。您可以尝试在这里找到的proguard配置android proguard示例。您必须为项目中的模型类调整示例中的最后一行,这些模型类将使用GSON进行序列化。由于GSON,我的proguard配置中确实有以下行:

-keepattributes Signature
-keepattributes *Annotation*

最新更新