【问题标题】:Proguard and RecyclerView item decorationProguard 和 RecyclerView 物品装饰
【发布时间】:2016-04-17 09:34:45
【问题描述】:

对于 RecyclerView 元素,我在使用 ItemDecoration 时遇到了一些意外行为。

在某些手机(三星 Android 5 设备)上,当 proguard 与构建一起应用时,我的 ItemDecoration 未显示(缩小为真)。如果没有 proguard/minify 它可以正常工作,您可以看到回收器元素之间的 ItemDecoration。

在大多数手机上,该问题不存在,您可以看到应用或不应用 proguard 的项目装饰。

不确定那里会发生什么,但感谢您提供任何意见。

物品装饰器代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    private Drawable mDivider;

    public DividerItemDecoration(Context context) {
        mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);
    }

    @Override
    public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + mDivider.getIntrinsicHeight();
            int margin = 30;
            mDivider.setBounds(left + margin, top, right - margin, bottom);
            mDivider.draw(canvas);
        }
    }
}

line_divider.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="1dp"
        android:height="1dp" />
    <solid android:color="#ffc6c6c6" />
</shape>

Proguard 规则:

-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}

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


#retrofit
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keep class com.myappspackage.catalog.** { *; }

#OKHttp
-dontwarn okio.**
-keep class okio.** { *; }

-dontwarn org.slf4j.**
-keep class org.slf4j.** { *; }

-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }

-keepattributes Signature
-keepattributes Exceptions

#Google analytics
 -keep class com.google.android.gms.** { *; }
 -keep public class com.google.android.gms.**
 -dontwarn com.google.android.gms.**

Gradle 构建日志:

Executing tasks: [clean, :app:generateReleaseSources]

Configuration on demand is an incubating feature.
:app:clean
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:checkReleaseManifest
:app:preDebugBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72311Library
:app:prepareComAndroidSupportCardviewV72311Library
:app:prepareComAndroidSupportDesign2311Library
:app:prepareComAndroidSupportRecyclerviewV72311Library
:app:prepareComAndroidSupportSupportV42311Library
:app:prepareComCrashlyticsSdkAndroidAnswers131Library
:app:prepareComCrashlyticsSdkAndroidBeta113Library
:app:prepareComCrashlyticsSdkAndroidCrashlytics251Library
:app:prepareComCrashlyticsSdkAndroidCrashlyticsCore234Library
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library
:app:prepareDeHdodenhofCircleimageview130Library
:app:prepareIoFabricSdkAndroidFabric135Library
:app:prepareReleaseDependencies
:app:compileReleaseAidl
:app:compileReleaseRenderscript
:app:generateReleaseBuildConfig
:app:generateReleaseAssets UP-TO-DATE
:app:mergeReleaseAssets
:app:processReleaseManifest
:app:fabricGenerateResourcesRelease
:app:generateReleaseResValues UP-TO-DATE
:app:generateReleaseResources
:app:mergeReleaseResources
AAPT: /Users/aviran/Projects/app/src/main/res/drawable-xhdpi/ic_drawer.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited
AAPT: /Users/aviran/Projects/app/src/main/res/drawable-hdpi/ic_drawer.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited
AAPT: /Users/aviran/Projects/app/src/main/res/drawable-mdpi/ic_drawer.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited
:app:processReleaseResources
:app:generateReleaseSources

BUILD SUCCESSFUL

Total time: 30.549 secs

超诡异的解决方案

for 循环中添加Log.i(TAG, "decorating: " + i);,实际上使它为每个项目绘制线条。将其放在 for 循环之外是行不通的。知道那里到底发生了什么吗?

【问题讨论】:

  • 您可能在此处收到的最重要的输入:查看您的 logcat 输出以寻找缺少什么的线索(然后修改您的 proguard 配置以确保它保持不变)。
  • @mah 这是三星 S5 上 logcat 的 pastebin,我没有看到任何可能相关的内容,你能看一下吗? pastebin.com/wb9CaS79(应用的包名是com.company.myAppName)
  • 您使用的是哪个RecyclerView 库版本?你的Proguard 配置是什么?启用minify 时是否检查了构建日志?谢谢。
  • 能否提供您用来绘制装饰的代码?你是自己画的还是用drawable画的?
  • 我已经添加了自定义装饰器的代码

标签: android android-recyclerview proguard android-proguard


【解决方案1】:

这并不能直接回答您的问题,但可能会起作用。你可以做的是在你的 proguard 文件中做一个条目

-keep class yourpakganame.itemdecorator
-keep public class * extends android.support.v7.widget.RecyclerView.ItemDecoration
-keep class android.support.v7.widget.RecyclerView

如果上述方法不起作用,请尝试

-keepattributes *Annotation*, InnerClasses, Signature

这样你的整个代码就被混淆了,忽略了不是大代码泄漏的项目装饰器:P

【讨论】:

  • 好的,像更新的答案一样为 RecyclerView.ItemDecoration 再保留一个条目
  • 刚试过,不行。我不认为问题在于 ItemDecorator 被混淆了,其他东西会在路上丢失。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2021-08-09
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多