2016-01-12 13 views
9

Sto riscontrando un comportamento un po 'inaspettato con ItemDecoration per gli elementi RecyclerView.Proguard e RecyclerView decorazione articolo

Su alcuni telefoni (dispositivi Samsung Android 5), il mio ItemDecoration non viene visualizzato quando il proguard viene applicato con la build (minify true). Senza proguard/minify sta funzionando bene, puoi vedere il ItemDecoration tra gli elementi del recycler.

Sulla maggior parte dei telefoni, il problema non esiste, è possibile vedere la decorazione dell'articolo con o senza proguard applicata.

Non so cosa succede lì, ma qualsiasi input è apprezzato.

Il codice articolo decoratore:

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> 

regole 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 costruire registro:

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 

soluzione Super strano

Aggiunta Log.i(TAG, "decorating: " + i); all'interno del ciclo for, in realtà rende tracciare le linee per ogni elemento. Mettendolo fuori dal ciclo for non funziona. Qualche idea su cosa diavolo sta succedendo lì?

+0

L'input più importante che è possibile ricevere qui: rivedere l'output del logcat per un indizio di ciò che manca (e quindi modificare la configurazione di proguard per assicurarsi che rimanga intatta). – mah

+0

@mah ecco un pastebin del logcat su samsung S5, non vedo nulla che possa essere collegato, puoi dare un'occhiata? http://pastebin.com/wb9CaS79 (Il nome del pacchetto dell'app è com.company.myAppName) – aviran

+0

Quale versione di libreria 'RecyclerView' stai usando? Qual è la tua configurazione di Proguard? Hai controllato il log di costruzione quando 'minify' è abilitato? Grazie. – fasteque

risposta

0

Questo non risponde direttamente alla tua domanda ma potrebbe funzionare. Che cosa si può fare è nel file Proguard fare una voce

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

se sopra doesnt opere cercano con

-keepattributes *Annotation*, InnerClasses, Signature 

questo modo tutto il codice è offuscato lasciando fuori il decoratore oggetto, che non è grande perdita di codice : P

+0

Questa è la prima cosa che ho provato, non ha funzionato – aviran

+0

ok mantieni uno di più voce per RecyclerView.ItemDecoration come nella risposta aggiornata – ingsaurabh

+0

Appena provato, non funziona Non penso che il problema è con l'oggetto ItemDecorator che viene oscurato, qualcos'altro si perde nel modo. – aviran

Problemi correlati