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

Posted

技术标签:

【中文标题】多个新的 Proguard 在 Multidex 项目中发布 Google Play 服务 v10.2.6 到 v11.0.0【英文标题】:Several new Proguard issues Google Play services v10.2.6 to v11.0.0 in a Multidex project 【发布时间】:2017-11-11 15:55:58 【问题描述】:

我更新了我们的应用以使用最新的 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 在 dexing 之前工作,所以 multidex 信息是多余的 您只更新了播放服务吗?所以构建工具链或 android gradle 插件没有升级? 它是在 AS 还是从命令行失败? 你看过***.com/questions/28690994/…吗? 我怀疑 proguard 配置在这些依赖项之一中发生了更改 【参考方案1】:

您可能需要检查此Proguard Troubleshooting manual,其中指出对于遇到的警告,the configuration keeps the entry point...but not the descriptor class

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

要获得更多见解,这些 SO 帖子也可能会有所帮助:

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

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

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

【讨论】:

我以为我们使用了 proguard,所以我们不必将所有东西都保留在包中。如果有什么 proguard 应该用作精密工具。【参考方案2】:

Android Firebase SDK v11.0.0 似乎注定要失败,Android Firebase SDK v11.0.1 修复了它,没有任何额外的改变.

【讨论】:

以上是关于多个新的 Proguard 在 Multidex 项目中发布 Google Play 服务 v10.2.6 到 v11.0.0的主要内容,如果未能解决你的问题,请参考以下文章

Android ProGuard +MultiDex 导致 ClassNotFoundException

使用 Multidex 的 Android proguard

在 Xamarin Studio 中启用 MultiDex 或 ProGuard 时出错

在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,只有第二次出现警告/注释?

Multidex、Proguard 和 Firebase

Proguard 可以保存到 multidex 应用程序吗?