2017-01-02 108 views
1

當設置在我的gradle這個minifyEnabled true開始我的應用程序時,我得到一個NullPointerException異常的ProGuard導致空指針異常

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)  

在閱讀過的StackOverflow我發現了proguard-rules.pro文件中的一些設置:

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

哪個並沒有真正解決這個問題(但是之前的NullPointerException)。

最後我gradle產出的重要組成部分:

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

當我確定停用minifyEnabled寄託都工作正常。

感謝您的幫助!

+0

這個問題有點不清楚。保持類確實解決了空指針異常?你可以發佈'CalendarActivity.onCreate()'的代碼嗎? –

+0

請製作[SSCCE](http://sscce.org/)。 – m0skit0

+0

@Reaz Murshed:在此NullPointerException發生之前,有一個由ProGuard引起的前一個問題,我可以使用發佈的proguard規則來解決這個問題。但是這些規則對這個NullPointerException沒有幫助,我不知道爲什麼。對不起,如果不清楚。我添加了onCreate和佈局xml。 – Alexander

回答

0

我解決了這個問題:

Android Studio中運行Clean Project後,我得到了一個名爲資源釋放小stripped.ap_無法找到文件的錯誤。通過谷歌搜索顯示,我需要在gradle文件中禁用shrinkResources,因爲它與Jack不兼容。

0

這個想法是保留您包含在項目中的庫提供的文件。我正在分享我的一個proguard-rules.pro,這可能會幫助你理解。

-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.** { *; } 

希望有所幫助!

+0

謝謝你的回答。對我來說,它看起來像無法找到'android.support.v7.widget.RecyclerView'或'android.support.v7.widget.RecyclerView.LayoutManager',它是我的項目中包含的一個庫的一部分('compile'c​​om .android.support:recyclerview-V7:25.0.0'')。這就是爲什麼我加了'-keep class android.support.v7。** {*; }「我的proguard規則,沒有任何成功。 – Alexander

+0

您還需要保持以'com.android.'開頭的類。檢查我添加的列表。這些是你需要保留的常用類。 –

+0

我解決了它。這是gradle文件中'shrinkResources'的問題。但是,感謝您的幫助。我學到了一些關於ProGuard的知識。 – Alexander

2

大部分時間由於Android庫的錯誤,試試這個

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

這可能是因爲出現這種情況,序列化對象和領域不被註釋時@SerializedName("param")(或類似),併爲此不能找到。

對於調試這也有助於暫時設置-keepnames class **,使類名稱不混淆。