androidx.paging.PagedStorage.init 在启用 proguard 时给出错误

Posted

技术标签:

【中文标题】androidx.paging.PagedStorage.init 在启用 proguard 时给出错误【英文标题】:androidx.paging.PagedStorage.init is giving error when proguard is enabled 【发布时间】: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 你能解决这个问题吗? 【参考方案1】:

我可以通过 -keep myModelclass(or be pakages) 在 progaurd 中解决这个问题, 但我不知道它好不好。

-keep class com.appname.dashboard.model***;

【讨论】:

以上是关于androidx.paging.PagedStorage.init 在启用 proguard 时给出错误的主要内容,如果未能解决你的问题,请参考以下文章