【发布时间】:2019-05-04 04:19:43
【问题描述】:
我正在使用 okhttp 进行改造并迁移到 AndroidX,当我制作一个使用 proguard 混淆的签名应用程序时,它会崩溃并给出错误,但在调试模式下,当 proguard 未启用时,它运行良好。我只是为了测试而禁用了 proguard,并制作了一个签名的 APK,它也以这种方式工作。所以我确定崩溃是由 Proguard 引起的。我在谷歌上做了一些搜索,他们都说我必须为 OKHTTP 和 Retrofit 添加 proguard 规则,我也添加了它们,但它仍然崩溃。 错误是从 Crashlytics 记录的,因为我没有在调试模式下启用 proguard:
PagedStorage.java line 118
androidx.paging.PagedStorage.init
Fatal Exception: java.lang.NullPointerException
Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
androidx.paging.PagedStorage.init (PagedStorage.java:118)
androidx.paging.PagedStorage.init (PagedStorage.java:131)
androidx.paging.ContiguousPagedList$1.onPageResult (ContiguousPagedList.java:81)
androidx.paging.DataSource$LoadCallbackHelper$1.run (DataSource.java:324)
android.os.Handler.handleCallback (Handler.java:790)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:164)
android.app.ActivityThread.main (ActivityThread.java:7000)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:441)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408)
Thread-20
java.lang.Object.wait (Object.java)
java.lang.Thread.parkFor$ (Thread.java:2137)
sun.misc.Unsafe.park (Unsafe.java:358)
java.util.concurrent.locks.LockSupport.park (LockSupport.java:190)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await (AbstractQueuedSynchronizer.java:2059)
java.util.concurrent.PriorityBlockingQueue.take (PriorityBlockingQueue.java:548)
com.android.volley.NetworkDispatcher.processRequest (NetworkDispatcher.java:104)
com.android.volley.NetworkDispatcher.run (Network
Dispatcher.java:87)
这就是我的 Proguard 规则:
-dontwarn org.conscrypt.OpenSSLProvider
-dontwarn org.conscrypt.Conscrypt
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit
# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.-KotlinExtensions
# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*
# OkHttp platform used only on JVM and when Conscrypt dependency is available.
-dontwarn okhttp3.internal.platform.ConscryptPlatform
-keep class com.google.android.material.** { *; }
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
这部分是在崩溃后添加的,但仍然没用
-dontwarn androidx.**
-keep class androidx.** { *; }
-keep interface androidx.** { *; }
-keep class androidx.paging.PagedStorage.init
【问题讨论】:
-
对我来说同样的问题,但没有找到运气。我也确定proguard是问题所在。我的应用程序几乎崩溃就是这个问题。即使我试过这个:``` -keep class androidx.paging.** { ; } -keepclasseswithmembers 类 * { public static FirebaseAuth getInstance (); } -keep class com.google.firebase.* { ; } -keep class com.firebase.* { *; }
-
经过一个多月的研究和测试,我发现 Proguard 是问题,它混淆了我的模型 (pojo) 类并制作了错误的路线,因此应用程序无法再访问这些类和 androidx .paging 有空参数。所以我做了--保留这些课程,问题就解决了。
-
我什至在调试应用程序中也得到了这个。对我有什么提示吗?
-
@SimpleCoder 是否在调试模式下启用了 Proguard?
-
@user2682025 你能解决这个问题吗?
标签: android retrofit2 okhttp3 android-proguard android-paging