几个新的Proguard在Multidex项目中发布了Google Play服务v10.2.6到v11.0.0



我更新了我们的应用程序以使用最新的Android Firebase SDK v11.0.0(https://firebase.google.com/support/release-notes/android#20170607),突然出现了一堆新的proguard错误,仅供参考,Proguard之前一切正常。

以前:

compile 'com.google.firebase:firebase-messaging:10.2.6'
compile 'com.google.android.gms:play-services-vision:10.2.6'

后:

compile 'com.google.firebase:firebase-messaging:11.0.0'
compile 'com.google.android.gms:play-services-vision:11.0.0'

问题是它似乎不是一个简单的新缺失的 proguard 条目,但它似乎破坏了整个事情,突然间其他几个库似乎受到了这种变化的影响。

这些是与GMS相关的Proguard问题:

Note: the configuration keeps the entry point 'com.google.android.gms.ads.identifier.AdvertisingIdClient { com.google.android.gms.internal.zzfd zza(android.content.Context,com.google.android.gms.common.zza); }', but not the descriptor class 'com.google.android.gms.common.zza'
Note: the configuration keeps the entry point 'com.google.android.gms.flags.impl.FlagProviderImpl { void init(com.google.android.gms.dynamic.IObjectWrapper); }', but not the descriptor class 'com.google.android.gms.dynamic.IObjectWrapper'
Note: the configuration keeps the entry point 'com.google.android.gms.measurement.AppMeasurement { AppMeasurement(com.google.android.gms.internal.zzchx); }', but not the descriptor class 'com.google.android.gms.internal.zzchx'
Note: the configuration keeps the entry point 'com.google.android.gms.measurement.AppMeasurement { void setEventInterceptor(com.google.android.gms.measurement.AppMeasurement$EventInterceptor); }', but not the descriptor class 'com.google.android.gms.measurement.AppMeasurement$EventInterceptor'
Note: the configuration keeps the entry point 'com.google.android.gms.measurement.AppMeasurement { void registerOnMeasurementEventListener(com.google.android.gms.measurement.AppMeasurement$OnEventListener); }', but not the descriptor class 'com.google.android.gms.measurement.AppMeasurement$OnEventListener'
Note: the configuration keeps the entry point 'com.google.android.gms.measurement.AppMeasurement { void unregisterOnMeasurementEventListener(com.google.android.gms.measurement.AppMeasurement$OnEventListener); }', but not the descriptor class 'com.google.android.gms.measurement.AppMeasurement$OnEventListener'
Note: the configuration keeps the entry point 'com.google.android.gms.measurement.AppMeasurement { void registerOnScreenChangeCallback(com.google.android.gms.measurement.AppMeasurement$zza); }', but not the descriptor class 'com.google.android.gms.measurement.AppMeasurement$zza'
Note: the configuration keeps the entry point 'com.google.android.gms.measurement.AppMeasurement { void unregisterOnScreenChangeCallback(com.google.android.gms.measurement.AppMeasurement$zza); }', but not the descriptor class 'com.google.android.gms.measurement.AppMeasurement$zza'
Note: the configuration keeps the entry point 'com.google.firebase.analytics.FirebaseAnalytics { FirebaseAnalytics(com.google.android.gms.internal.zzchx); }', but not the descriptor class 'com.google.android.gms.internal.zzchx'
Note: the configuration keeps the entry point 'com.google.firebase.iid.FirebaseInstanceId { com.google.firebase.iid.FirebaseInstanceId getInstance(com.google.firebase.FirebaseApp); }', but not the descriptor class 'com.google.firebase.FirebaseApp'

此外,OkHttp3 也受到影响,请参阅以下错误:

Note: the configuration keeps the entry point 'okhttp3.Cache$Entry { Cache$Entry(okio.Source); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.Cache$Entry { java.util.List readCertificateList(okio.BufferedSource); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.Cache$Entry { void writeCertList(okio.BufferedSink,java.util.List); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.FormBody { void writeTo(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.FormBody { long writeOrCountBytes(okio.BufferedSink,boolean); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.HttpUrl { void percentDecode(okio.Buffer,java.lang.String,int,int,boolean); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.HttpUrl { void canonicalize(okio.Buffer,java.lang.String,int,int,java.lang.String,boolean,boolean,boolean,boolean); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.MultipartBody { MultipartBody(okio.ByteString,okhttp3.MediaType,java.util.List); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.MultipartBody { void writeTo(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.MultipartBody { long writeOrCountBytes(okio.BufferedSink,boolean); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.RequestBody { void writeTo(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.RequestBody { okhttp3.RequestBody create(okhttp3.MediaType,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.RequestBody$1 { RequestBody$1(okhttp3.MediaType,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.RequestBody$1 { void writeTo(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.RequestBody$2 { void writeTo(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.RequestBody$3 { void writeTo(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.ResponseBody { okhttp3.ResponseBody create(okhttp3.MediaType,long,okio.BufferedSource); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.ResponseBody$1 { ResponseBody$1(okhttp3.MediaType,long,okio.BufferedSource); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.ResponseBody$BomAwareReader { ResponseBody$BomAwareReader(okio.BufferedSource,java.nio.charset.Charset); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.WebSocket { boolean send(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.WebSocketListener { void onMessage(okhttp3.WebSocket,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.Util { boolean discard(okio.Source,int,java.util.concurrent.TimeUnit); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.Util { boolean skipAll(okio.Source,int,java.util.concurrent.TimeUnit); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.Util { java.nio.charset.Charset bomAwareCharset(okio.BufferedSource,java.nio.charset.Charset); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.CacheInterceptor$1 { CacheInterceptor$1(okhttp3.internal.cache.CacheInterceptor,okio.BufferedSource,okhttp3.internal.cache.CacheRequest,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.CacheInterceptor$1 { CacheInterceptor$1(okhttp3.internal.cache.CacheInterceptor,okio.BufferedSource,okhttp3.internal.cache.CacheRequest,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.CacheInterceptor$1 { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.DiskLruCache$2 { DiskLruCache$2(okhttp3.internal.cache.DiskLruCache,okio.Sink); }', but not the descriptor class 'okio.Sink'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.DiskLruCache$Editor$1 { DiskLruCache$Editor$1(okhttp3.internal.cache.DiskLruCache$Editor,okio.Sink); }', but not the descriptor class 'okio.Sink'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.DiskLruCache$Entry { void writeLengths(okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.DiskLruCache$Snapshot { DiskLruCache$Snapshot(okhttp3.internal.cache.DiskLruCache,java.lang.String,long,okio.Source[],long[]); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.FaultHidingSink { FaultHidingSink(okio.Sink); }', but not the descriptor class 'okio.Sink'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.FaultHidingSink { void write(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.FileOperator { void write(long,okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.FileOperator { void read(long,okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.Relay { Relay(java.io.RandomAccessFile,okio.Source,long,okio.ByteString,long); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.Relay { Relay(java.io.RandomAccessFile,okio.Source,long,okio.ByteString,long); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.Relay { okhttp3.internal.cache2.Relay edit(java.io.File,okio.Source,okio.ByteString,long); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.Relay { okhttp3.internal.cache2.Relay edit(java.io.File,okio.Source,okio.ByteString,long); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.Relay { void writeHeader(okio.ByteString,long,long); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.cache2.Relay$RelaySource { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.connection.RealConnection$1 { RealConnection$1(okhttp3.internal.connection.RealConnection,boolean,okio.BufferedSource,okio.BufferedSink,okhttp3.internal.connection.StreamAllocation); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.connection.RealConnection$1 { RealConnection$1(okhttp3.internal.connection.RealConnection,boolean,okio.BufferedSource,okio.BufferedSink,okhttp3.internal.connection.StreamAllocation); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.http.RealResponseBody { RealResponseBody(okhttp3.Headers,okio.BufferedSource); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec { Http1Codec(okhttp3.OkHttpClient,okhttp3.internal.connection.StreamAllocation,okio.BufferedSource,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec { Http1Codec(okhttp3.OkHttpClient,okhttp3.internal.connection.StreamAllocation,okio.BufferedSource,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec { void detachTimeout(okio.ForwardingTimeout); }', but not the descriptor class 'okio.ForwardingTimeout'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec$ChunkedSink { void write(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec$ChunkedSource { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec$FixedLengthSink { void write(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec$FixedLengthSource { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http1.Http1Codec$UnknownLengthSource { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Header { Header(okio.ByteString,java.lang.String); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Header { Header(okio.ByteString,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Header { Header(okio.ByteString,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Hpack { okio.ByteString checkLowercase(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Hpack$Reader { Hpack$Reader(int,okio.Source); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Hpack$Reader { Hpack$Reader(int,int,okio.Source); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Hpack$Writer { Hpack$Writer(okio.Buffer); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Hpack$Writer { Hpack$Writer(int,boolean,okio.Buffer); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Hpack$Writer { void writeByteString(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Codec$StreamFinishingSource { Http2Codec$StreamFinishingSource(okhttp3.internal.http2.Http2Codec,okio.Source); }', but not the descriptor class 'okio.Source'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection { void writeData(int,boolean,okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection { void pushDataLater(int,okio.BufferedSource,int,boolean); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection$6 { Http2Connection$6(okhttp3.internal.http2.Http2Connection,java.lang.String,java.lang.Object[],int,okio.Buffer,int,boolean); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection$Builder { okhttp3.internal.http2.Http2Connection$Builder socket(java.net.Socket,java.lang.String,okio.BufferedSource,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection$Builder { okhttp3.internal.http2.Http2Connection$Builder socket(java.net.Socket,java.lang.String,okio.BufferedSource,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection$ReaderRunnable { void data(boolean,int,okio.BufferedSource,int); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection$ReaderRunnable { void goAway(int,okhttp3.internal.http2.ErrorCode,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Connection$ReaderRunnable { void alternateService(int,java.lang.String,okio.ByteString,java.lang.String,int,long); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader { Http2Reader(okio.BufferedSource,boolean); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader { int readMedium(okio.BufferedSource); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader$ContinuationSource { Http2Reader$ContinuationSource(okio.BufferedSource); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader$ContinuationSource { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader$Handler { void data(boolean,int,okio.BufferedSource,int); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader$Handler { void goAway(int,okhttp3.internal.http2.ErrorCode,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Reader$Handler { void alternateService(int,java.lang.String,okio.ByteString,java.lang.String,int,long); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Stream { void receiveData(okio.BufferedSource,int); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Stream$FramingSink { void write(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Stream$FramingSource { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Stream$FramingSource { void receive(okio.BufferedSource,long); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Writer { Http2Writer(okio.BufferedSink,boolean); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Writer { void data(boolean,int,okio.Buffer,int); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Writer { void dataFrame(int,byte,okio.Buffer,int); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Http2Writer { void writeMedium(okio.BufferedSink,int); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Huffman { void encode(okio.ByteString,okio.BufferedSink); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Huffman { void encode(okio.ByteString,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.Huffman { int encodedLength(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.PushObserver { boolean onData(int,okio.BufferedSource,int,boolean); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.http2.PushObserver$1 { boolean onData(int,okio.BufferedSource,int,boolean); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket { void onReadMessage(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket { void onReadPing(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket { void onReadPong(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket { boolean send(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket { boolean send(okio.ByteString,int); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket { boolean pong(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket$Close { RealWebSocket$Close(int,okio.ByteString,long); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket$Message { RealWebSocket$Message(int,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket$Streams { RealWebSocket$Streams(boolean,okio.BufferedSource,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.RealWebSocket$Streams { RealWebSocket$Streams(boolean,okio.BufferedSource,okio.BufferedSink); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketReader { WebSocketReader(boolean,okio.BufferedSource,okhttp3.internal.ws.WebSocketReader$FrameCallback); }', but not the descriptor class 'okio.BufferedSource'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketReader { void readMessage(okio.Buffer); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketReader$FrameCallback { void onReadMessage(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketReader$FrameCallback { void onReadPing(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketReader$FrameCallback { void onReadPong(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketWriter { WebSocketWriter(boolean,okio.BufferedSink,java.util.Random); }', but not the descriptor class 'okio.BufferedSink'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketWriter { void writePing(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketWriter { void writePong(okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketWriter { void writeClose(int,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketWriter { void writeControlFrameSynchronized(int,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
Note: the configuration keeps the entry point 'okhttp3.internal.ws.WebSocketWriter$FrameSink { void write(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'

更多信息:

dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.google.gms:google-services:3.0.0' classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.4' }

ext.COMPILE_SDK_VERSION = 25 ext.BUILD_TOOLS_VERSION = "26.0.0"

您可能需要查看此Proguard故障排除手册,其中指出,对于遇到的警告,the configuration keeps the entry point...but not the descriptor class

您的配置包含一个用于保留给定方法(或字段)的-keep选项,但没有用于给定类的-keep选项,该类是方法描述符中的参数类型或返回类型。然后,您可能也想保留该类。否则,ProGuard 将混淆其名称,从而更改方法的签名。然后,该方法可能作为入口点变得不可找到。您可以使用-keep选项修饰符includedescriptorclasses自动保留此类描述符类(-keep,includeescriptorclasses ...)。您可以通过指定-dontnote选项来关闭这些注释。

有关其他见解,这些 SO 帖子也可能有所帮助:

  • Proguard:找不到引用的类
  • Proguard 对类的未解析引用

综上所述,您可能需要尝试将以下两行添加到Proguard配置文件中:

-keep class com.google.android.gms.**
-dontwarn com.google.android.gms.**

看来Android Firebase SDK v11.0.0注定要失败,Android Firebase SDK v11.0.1修复了它,没有任何额外的更改。

最新更新