2016-04-03 11 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

これは非常にイライラしています、それはちょうど** 1 **のものですが、私が何を試しても、何も働いていませんでした。あなたが提案したものを追加しましたが、クラッシュはまだ発生します。また、 '-keepclassmembers class io.jsonwebtoken.Jwts {*; } '、しかし、再び動作しませんでした、私は何をすべきかわかりません、エラーはタイプ_DefaultJwtBuilder_の新しいオブジェクトを返すライブラリ内の特定の関数から来ているようです、あなたは私が問題を絞り込むことができますそれに基づいて?私はこのライブラリを完全に無視するためにProguardが必要ですが、それはそうではないようです... – Nadav96

+0

"java PUBLIC_ONLY"のGoogle検索ではこれが2番目のヒットとなります:http://stackoverflow.com/questions/27184247/java-lang -nosuchfielderror - 公開中のみ使用中のボックスのAPI in-android-in-signed –

関連する問題