有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

由于特定的第三方库,java Proguard产生运行时错误

最近我用Android完成了一个大项目的构建,发布之前的最后一个要求是,它将使用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 安卓.app.Fragment.performCreateView(Fragment.java:1699) at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:885) at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057) at 安卓.app.BackStackRecord.run(BackStackRecord.java:682) at 安卓.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) at 安卓.app.FragmentManagerImpl$1.run(FragmentManager.java:441) at 安卓.os.Handler.handleCallback(Handler.java:725) at 安卓.os.Handler.dispatchMessage(Handler.java:92) at 安卓.os.Looper.loop(Looper.java:137) at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.安卓.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 安卓.app.Fragment.performCreateView(Fragment.java:1699)  at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)  at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)  at 安卓.app.BackStackRecord.run(BackStackRecord.java:682)  at 安卓.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)  at 安卓.app.FragmentManagerImpl$1.run(FragmentManager.java:441)  at 安卓.os.Handler.handleCallback(Handler.java:725)  at 安卓.os.Handler.dispatchMessage(Handler.java:92)  at 安卓.os.Looper.loop(Looper.java:137)  at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  at com.安卓.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 安卓.app.Fragment.performCreateView(Fragment.java:1699)  at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)  at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)  at 安卓.app.BackStackRecord.run(BackStackRecord.java:682)  at 安卓.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)  at 安卓.app.FragmentManagerImpl$1.run(FragmentManager.java:441)  at 安卓.os.Handler.handleCallback(Handler.java:725)  at 安卓.os.Handler.dispatchMessage(Handler.java:92)  at 安卓.os.Looper.loop(Looper.java:137)  at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  at com.安卓.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 安卓.app.Fragment.performCreateView(Fragment.java:1699)  at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)  at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)  at 安卓.app.BackStackRecord.run(BackStackRecord.java:682)  at 安卓.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)  at 安卓.app.FragmentManagerImpl$1.run(FragmentManager.java:441)  at 安卓.os.Handler.handleCallback(Handler.java:725)  at 安卓.os.Handler.dispatchMessage(Handler.java:92)  at 安卓.os.Looper.loop(Looper.java:137)  at 安卓.app.ActivityThread.main(ActivityThread.java:5041)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke

有人能告诉我处理这个问题的正确方法吗


共 (1) 个答案

  1. # 1 楼答案

    如果您想简单地防止整个Java包被混淆,因为找出一个错误太费时,请尝试将其添加到proguard规则文件中:

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

    这些规则通常在项目的proguard规则中。专业文件