【问题标题】:Proguard issue with Support Library and RecyclerView onBindViewHolder and onCreateViewHolder支持库和 RecyclerView onBindViewHolder 和 onCreateViewHolder 的 Proguard 问题
【发布时间】:2018-03-22 19:52:05
【问题描述】:

致命异常:java.lang.NullPointerException at my.packa.CustomAdapter.onCreateViewHolder(未知 来源)在 my.package.name.CustomAdapter.onBindViewHolder(未知 来源)在 android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(未知 来源)在 android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(未知 来源)在 android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(未知 来源)在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(未知 来源)在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(未知 来源)在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(未知 来源)在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(未知 来源)在 android.support.v7.widget.LinearLayoutManager.layoutChunk(未知 来源)在android.support.v7.widget.LinearLayoutManager.fill(未知 来源)在 android.support.v7.widget.LinearLayoutManager.onLayoutChildren(未知 来源)在 android.support.v7.widget.RecyclerView.dispatchLayoutStep2(未知 来源)在 android.support.v7.widget.RecyclerView.dispatchLayout(未知来源) 在 android.support.v7.widget.RecyclerView.onLayout(Unknown Source) 在 android.view.View.layout(View.java:14948) 在 android.view.ViewGroup.layout(ViewGroup.java:4631) 在 android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(未知 来源)在 android.support.design.widget.ViewOffsetBehavior.onLayoutChild(未知 来源)在 android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(未知 来源)在 android.support.design.widget.CoordinatorLayout.onLayout(未知 来源)在 android.view.View.layout(View.java:14948) 在 android.view.ViewGroup.layout(ViewGroup.java:4631) 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) 在 android.view.View.layout(View.java:14948) 在 android.view.ViewGroup.layout(ViewGroup.java:4631) 在 android.support.v4.widget.SwipeRefreshLayout.onLayout(未知来源) 在 android.view.View.layout(View.java:14948) 在 android.view.ViewGroup.layout(ViewGroup.java:4631) 在 android.support.v4.widget.DrawerLayout.onLayout(Unknown Source) at

ProGuard 规则如下所示:

-dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
-keep class android.support.v7.widget.** { *; }
-keep class android.support.v7.widget.SearchView { *; }
-keep class java.lang.** { *; }
-keep class android.support.** { *; }
-dontwarn android.support.**
-keep class android.support.v7.widget.** { *; }
-keep class android.support.design.widget.** { *; }
-keep class my.package.name.CustomAdapter


# Hide warnings about references to newer platforms in the library
-dontwarn android.support.v7.**
# don't process support library
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }


-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

该问题仅在 proguard 运行时在发布 apk 中发生

【问题讨论】:

  • 请分享 onCreateViewHolder 中的内容

标签: android android-recyclerview proguard android-support-library android-proguard


【解决方案1】:

将以下规则添加到您的 proguard 文件中:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributes *Annotation*
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keepattributes Exceptions,InnerClasses,Signature

#-keep class au.com.flightcentre.fragment.** { *; }

# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keep class * implements android.os.Serializable {
  public static final android.os.Serializable$Creator *;
}
-keepclassmembers class **.R$* {
    public static <fields>;
}

我认为没有必要保留您的自定义适配器,但您必须保留模型类(您的 java 对象)。像这样:

-keep class com.nnacres.app.model.** { *; }

告诉我进展如何。

【讨论】:

  • 你说得对,我只需要在 proguard 规则文件中添加 RecyclerView 的模型类。我使用了 keepclassmembers 规则。
【解决方案2】:

我认为以下规则应该适用于您的情况。

-dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
-keep class com.google.** { *; }
-keep class com.android.** { *; }
-keep class android.support.v7.** { *; }
-keep class java.lang.** { *; }

-dontwarn android.support.v7.**

-keepattributes Signature
-keepattributes *Annotation*

只需保持com.googlecom.androidandroid.support.v7 下的所有类名不变。也去掉keep接口。

我认为您不需要在proguard-rules.pro 中添加以下内容。所以你可以考虑省略它。

-keep class my.package.name.CustomAdapter

这是我项目中的一个有效的progurad-rules.pro 文件。

-adaptclassstrings
-useuniqueclassmembernames
-allowaccessmodification
-keep class com.google.** { *; }
-keep class com.github.** { *; }
-keep class org.apache.** { *; }
-keep class com.android.** { *; }
-keep class junit.** { *; }
-keep class org.mockito.** { *; }
-keep class android.support.v7.widget.SearchView { *; }

-keepattributes Signature
-keepattributes *Annotation*

-dontwarn com.google.**
-dontwarn org.apache.**
-dontwarn android.support.**
-dontwarn org.junit.**
-dontwarn org.mockito.**

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
    public static *** i(...);
    public static *** e(...);
}

-printmapping build/outputs/mapping/release/mapping.txt

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2021-11-19
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多