几个新的 Proguard 问题 Google Play services v10.2.6 to v11.0.0 in a Multidex project

Several new Proguard issues Google Play services v10.2.6 to v11.0.0 in a Multidex project

我更新了我们的应用程序以使用最新的 Android Firebase SDK v11.0.0 (https://firebase.google.com/support/release-notes/android#20170607) 并且突然出现了一堆新的 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 { RequestBody(okhttp3.MediaType,okio.ByteString); }', but not the descriptor class 'okio.ByteString'
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 { void writeTo(okio.BufferedSink); }', 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.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 { ResponseBody(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 { CacheInterceptor(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 { CacheInterceptor(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 { long read(okio.Buffer,long); }', but not the descriptor class 'okio.Buffer'
Note: the configuration keeps the entry point 'okhttp3.internal.cache.DiskLruCache { DiskLruCache(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 { DiskLruCache$Editor(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 { RealConnection(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 { RealConnection(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 { Http2Connection(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 { 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 Troubleshooting manual,其中注意到对于遇到的警告,the configuration keeps the entry point...but not the descriptor class:

Your configuration contains a -keep option to preserve the given method (or field), but no -keep option for the given class that is an argument type or return type in the method's descriptor. You may then want to keep the class too. Otherwise, ProGuard will obfuscate its name, thus changing the method's signature. The method might then become unfindable as an entry point. You can automatically keep such descriptor classes with the -keep option modifier includedescriptorclasses (-keep,includedescriptorclasses ...). You can switch off these notes by specifying the -dontnote option.

如需更多见解,这些 SO 帖子也可能有所帮助:

  • Proguard: can't find referenced class
  • Proguard unresolved references to classes

总而言之,您可能想尝试将这两行添加到您的 Proguard 配置文件中:

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

看来Android Firebase SDK v11.0.0已经注定了,Android Firebase SDK v11.0.1 修复了它,没有任何额外的变化。