2016-01-12 14 views
9

Ich habe etwas unerwartetes Verhalten mit für RecyclerView Elemente.Proguard und RecyclerView Artikel Dekoration

Auf einigen Handys (Samsung Android 5 Geräte) wird meine ItemDecoration nicht angezeigt, wenn proguard mit dem Build angewendet wird (minify true). Ohne progard/minify funktioniert es gut, Sie können die ItemDecoration zwischen den Elementen des Recyclers sehen.

Auf den meisten Telefonen existiert das Problem nicht, Sie können die Objektdekoration mit oder ohne Programm sehen.

Nicht sicher, was dort passiert, aber jede Eingabe wird geschätzt.

Der Artikel Dekorateur Code:

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 Regeln:

-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 bauen log:

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 

Super-seltsame Lösung

Hinzufügen Log.i(TAG, "decorating: " + i); innerhalb der for Schleife macht es tatsächlich die Linien für jede Position ziehen. Putting es außerhalb der for-Schleife funktioniert nicht. Irgendeine Idee, was zum Teufel ist dort los?

+0

Die wichtigste Eingabe, die Sie möglicherweise hier erhalten können: Überprüfen Sie Ihre Logcat-Ausgabe für einen Hinweis auf was fehlt (und ändern Sie dann Ihre Proguard-Konfiguration, um sicherzustellen, dass es intakt bleibt). – mah

+0

@mah hier ist ein Pastebin der Logcat auf Samsung S5, sehe ich nichts, das verwandt sein könnte, können Sie einen Blick darauf werfen? http://pastebin.com/wb9CaS79 (Der Paketname der App lautet com.company.myAppName) – aviran

+0

Welche 'RecyclerView'-Bibliotheksversion verwenden Sie? Was ist deine 'Proguard'-Konfiguration? Haben Sie das Buildprotokoll überprüft, wenn "minify" aktiviert ist? Vielen Dank. – fasteque

Antwort

0

Dies beantwortet nicht direkt Ihre Frage, aber könnte funktionieren. Was Sie tun können, in Ihrer proguard Datei einen Eintrag

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

wenn oben tut Werke versuchen, mit

-keepattributes *Annotation*, InnerClasses, Signature 

Auf diese Weise Ihre gesamte Code das Element Dekorateur Weglassen verschleiert wird, die nicht groß Code Leck : P

+0

Das ist die erste Sache, die ich versucht habe, hat nicht funktioniert. – aviran

+0

ok, halten Sie einen mehr Eintrag für RecyclerView.ItemDecoration wie in der aktualisierten Antwort – ingsaurabh

+0

Ich habe es gerade versucht, funktioniert nicht.Ich denke nicht, das Problem ist mit dem ItemDecorator obfoscated, etwas anderes geht auf dem Weg verloren. – aviran

Verwandte Themen