多个新的 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 时出错