2017-01-02 5 views
1

Wenn minifyEnabled true in meinem gradle Einstellung erhalte ich eine Nullpointer wenn meine app starten:ProGuard führt zu Nullpointer

java.lang.RuntimeException: Unable to start activity ComponentInfo{de.ae.formulaecalendar/de.ae.formulaecalendar.view.calendar.CalendarActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2444) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5461) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference 
    at de.ae.formulaecalendar.view.calendar.CalendarActivity.onCreate(Unknown Source) 
    at android.app.Activity.performCreate(Activity.java:6251) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504)  
    at android.app.ActivityThread.-wrap11(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5461)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

Während er durch das Lesen Stackoverflow ich einige Einstellungen für die proguard-rules.pro Datei gefunden:

######### KEEP ANDROID SUPPORT V7 AND DESIGN 
-keep class android.support.v7.** { *; } 
-keep interface android.support.v7.** { *; } 

die dieses Problem nicht wirklich gelöst hat (aber eine vorherige NullPointerException).

schließlich der wichtigste Teil meines gradle:

buildTypes { 
    release { 
     shrinkResources true 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     signingConfig signingConfigs.config 
    } 
} 

Als ich disbale minifyEnabled Everthing funktioniert gut.

Danke für Ihre Hilfe!

+0

Die Frage ist mir etwas unklar. Behalten die Klassen die Nullzeigerausnahme? Und können Sie bitte den Code von 'CalendarActivity.onCreate()' posten? –

+0

Bitte machen Sie eine [SSCCE] (http://sscce.org/). – m0skit0

+0

@Reaz Murshed: Bevor diese NullPointerException auftrat, gab es eine vorherige, die von ProGuard verursacht wurde und die ich mit den veröffentlichten Proguard-Regeln lösen konnte. Aber diese Regeln helfen nicht mit dieser NullPointerException und ich weiß nicht warum. Tut mir leid, wenn es unklar war. Ich habe das onCreate und das Layout-XML hinzugefügt. – Alexander

Antwort

0

Ich löste das Problem:

Nach Clean Project in Android Studio läuft ich einen Fehler über eine Datei Ressource-Release-stripped.ap_, die nicht gefunden werden kann, genannt bekam. Einige Suche über Google zeigte, dass ich shrinkResources in der Gradle-Datei deaktivieren muss, weil es nicht mit Jack kompatibel ist.

0

Die Idee besteht darin, die bereitgestellten Dateien von den Bibliotheken beizubehalten, die Sie in Ihrem Projekt enthalten haben. Ich teile eine meiner proguard-rules.pro, die Ihnen helfen könnte, zu verstehen.

-keep class com.google.** { *; } 
-keep class com.github.** { *; } 
-keep class org.apache.** { *; } 
-keep class com.android.** { *; } 
-keep class junit.** { *; } 
-keep class android.support.v7.widget.SearchView { *; } 
-keep class com.myproject.model.** { *; } 

Hoffe, dass hilft!

+0

Vielen Dank für Ihre Antwort. Für mich sieht es so aus, als könnte es 'android.support.v7.widget.RecyclerView' oder' android.support.v7.widget.RecyclerView.LayoutManager' nicht finden, das Teil einer der Bibliotheken ist, die in meinem Projekt enthalten sind ('compile 'com .android.support: recyclerview-v7: 25.0.0''). Deshalb habe ich '-keep class android.support.v7 hinzugefügt. ** {*; } 'zu meinen Proguard-Regeln, ohne Erfolg. – Alexander

+0

Sie müssen die Klasse auch mit 'com.android." starten. Überprüfen Sie die Liste, die ich hinzugefügt habe. Dies sind die üblichen Klassen, die Sie behalten müssen. –

+0

Ich habe es gelöst.Es war ein Problem mit 'shrinkResources' in der Gradle-Datei. Vielen Dank für Ihre Hilfe. Ich habe etwas über ProGuard gelernt. – Alexander

2

der Zeit die meisten der Fehler wegen Android-Libs, versuchen Sie dies

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

Es ist wahrscheinlich, dass dies geschieht, wenn Objekte serialisiert und die Felder werden nicht kommentiert von @SerializedName("param") (oder ähnlich) und dafür kann nicht sein, gefunden.

Für Debuggen es hilft auch vorübergehend eingestellt-keepnames class ** so dass die Klassennamen nicht verschleiert werden.