okio.Base64.encode ArrayIndexOutOfBoundsException为什么会发生这种情况?

时间:2017-11-14 08:17:51

标签: android caching base64 okhttp crash-reports

我在布料中发现了这样的例外,这种情况很少发生,但每次构建时,每周3-5次用户都会发生3-5次崩溃(从~500 DAU) 我没有找到有关此类崩溃的任何信息,有谁知道是什么原因造成的?

我发现只有一个关于此类问题的问题,但它被删除为"重复" https://stackoverflow.com/questions/45868217/arrayindexoutofboundsexception-trying-to-cache-certificate-list-in-okhttp3

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=1305; index=1953974520

okio.Base64.encode (Base64.java:137)
okio.Base64.encode (Base64.java:125)
okio.ByteString.base64 (ByteString.java:105)
okhttp3.Cache$Entry.writeCertList (Cache.java:686)
okhttp3.Cache$Entry.writeTo (Cache.java:645)
okhttp3.Cache.put (Cache.java:249)
okhttp3.Cache.access$000 (Cache.java:136)
okhttp3.Cache$1.put (Cache.java:148)
okhttp3.internal.cache.CacheInterceptor.maybeCache (CacheInterceptor.java:173)
okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:143)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:124)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)

更新

这个问题的

https://github.com/square/okio/issues/325 Okio票 此问题的https://issuetracker.google.com/issues/69364976 Google票证

更新2: 已在Android Studio 3.1 Canary 6 Build

中修复

2 个答案:

答案 0 :(得分:2)

虚拟机或虚拟机周围的基础设施(CPU?,内存?)中存在错误。没有其他方法在0和数组长度之间循环的值i可以超出这样的范围。

答案 1 :(得分:2)

从11月8日开始,仅在Android 5.1上,特定设备上的VM可能存在错误。

我们发现问题是由使用dex编译器D8引起的。解决方案是通过以下行在gradle.properties中禁用它:android.enableD8 = false

此处已创建票证

Okio issue tracker

它正在影响几乎所有低价手机,不包括三星设备