2016-04-03 84 views
1

最近我完成了在Android的建設大項目,最後要求之前公佈的是,它會被編譯啓用Proguard的,而且我認爲他會在項目中最簡單的部分,但對我來說卻是非常糟糕的經歷。Proguard的生產運行時錯誤

在我用了幾個第三方庫,至少從我目前的檢查項目,似乎所有的人都工作正常,我的Proguard的配置。

有問題的庫是JWT: JSON Web Token for Java and Android,它沒有關於如何使用Proguard配置它的文檔,我嘗試了很多不同的配置,但沒有解決這個問題。

Jwts.builder();

和錯誤如下:

java.lang.ExceptionInInitializerError at io.jsonwebtoken.Jwts.builder(ProGuard:116) at com.cineworld.app.screen_options.webpage.PurchaseWebPage.GenerateToken(ProGuard:216) at com.cineworld.app.screen_options.webpage.PurchaseWebPage.onCreateView(ProGuard:142) at android.app.Fragment.performCreateView(Fragment.java:1699) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057) at android.app.BackStackRecord.run(BackStackRecord.java:682) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ExceptionInInitializerError at io.jsonwebtoken.impl.DefaultJwtBuilder.(ProGuard:42) at io.jsonwebtoken.Jwts.builder(ProGuard:116)  at com.cineworld.app.screen_options.webpage.PurchaseWebPage.GenerateToken(ProGuard:216)  at com.cineworld.app.screen_options.webpage.PurchaseWebPage.onCreateView(ProGuard:142)  at android.app.Fragment.performCreateView(Fragment.java:1699)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)  at android.app.BackStackRecord.run(BackStackRecord.java:682)  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)  at android.os.Handler.handleCallback(Handler.java:725)  at android.os.Handler.dispatchMessage(Handler.java:92)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:5041)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)  at dalvik.system.NativeStart.main(Native Method)  Caused by: java.lang.ExceptionInInitializerError at com.a.a.c.ad.(ProGuard:209) at io.jsonwebtoken.impl.DefaultJwtBuilder.(ProGuard:42)  at io.jsonwebtoken.Jwts.builder(ProGuard:116)  at com.cineworld.app.screen_options.webpage.PurchaseWebPage.GenerateToken(ProGuard:216)  at com.cineworld.app.screen_options.webpage.PurchaseWebPage.onCreateView(ProGuard:142)  at android.app.Fragment.performCreateView(Fragment.java:1699)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)  at android.app.BackStackRecord.run(BackStackRecord.java:682)  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)  at android.os.Handler.handleCallback(Handler.java:725)  at android.os.Handler.dispatchMessage(Handler.java:92)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:5041)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)  at dalvik.system.NativeStart.main(Native Method)  Caused by: java.lang.NoSuchFieldError: PUBLIC_ONLY at java.lang.Class.getDeclaredAnnotation(Native Method) at java.lang.Class.getAnnotation(Class.java:260) at com.a.a.c.f.ac.(ProGuard:172) at com.a.a.c.ad.(ProGuard:209)  at io.jsonwebtoken.impl.DefaultJwtBuilder.(ProGuard:42)  at io.jsonwebtoken.Jwts.builder(ProGuard:116)  at com.cineworld.app.screen_options.webpage.PurchaseWebPage.GenerateToken(ProGuard:216)  at com.cineworld.app.screen_options.webpage.PurchaseWebPage.onCreateView(ProGuard:142)  at android.app.Fragment.performCreateView(Fragment.java:1699)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)  at android.app.BackStackRecord.run(BackStackRecord.java:682)  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)  at android.os.Handler.handleCallback(Handler.java:725)  at android.os.Handler.dispatchMessage(Handler.java:92)  at android.os.Looper.loop(Looper.java:137)  at android.app.ActivityThread.main(ActivityThread.java:5041)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke

有人引導,只有當我把這個行代碼(從調用該庫中的類)發生

錯誤我以正確的方式來處理這個問題?

回答

1

如果你想簡單地防止整個Java包被混淆,因爲它太耗費時間搞清楚一兩件事,地方出了錯,你可以添加以下到您的ProGuard規則文件:

-keep class io.jsonwebtoken.** { 
    public protected private *; 
} 

規則通常在您項目的proguard-rules.pro文件中。

+0

這是什麼是如此令人沮喪的,它只是一個** **的事情,但無論怎樣我試過,沒有奏效。我添加了你的建議,但崩潰仍然發生,也嘗試了不同的變體,例如'-keepclassmembers class io.jsonwebtoken.Jwts {*; }',但同樣,沒有工作,我不知道該怎麼做,似乎是在錯誤是,其中返回式_DefaultJwtBuilder_的新對象庫中的特定功能來了,你能不能幫我縮小問題基於那個?我需要Proguard的簡單地完全忽略這個庫,但它似乎沒有這樣做... – Nadav96

+0

谷歌搜索「Java的PUBLIC_ONLY」認爲這是第二擊:http://stackoverflow.com/questions/27184247/java-lang -nosuchfielderror公有制只,同時,利用現成的API功能於Android的中籤 –