首页 文章

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

提问于
浏览
1

最近我在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)位于android.app.FragmentManager.Imp.Dove.moveToState(FragmentManager.java)的android.app.FragmentManager上的android.app.Fragment.If.ToveToState(FragmentManager.java:885)的android.app.Fragment.performCreateView(Fragment.java:1699) 1057)在Android.app.BackStackRecord.run(BackStackRecord.java:682)android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)android.app.FragmentManagerImpl $ 1.run(FragmentManager.java:441)at android .os.Handler.handleCallback(Handler.java:725)位于android.app.A.运行时,android.O.Roler.Mopage(Handler.java:92),android.app.Looper.loop(Looper.java:137),android.app.ActivityThread . main(ActivityThread.java:5041)位于java.lang.reflect.Method.invoke的java.lang.reflect.Method.invokeNative(Native Method)(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方法)由io.jsonwebtoken.impl.DefaultJwtBuilder . (ProGuard:42)的java.lang.ExceptionInInitializerError引起,位于com.cineworld.app.screen_options.webpage.PurchaseWebPage的io.jsonwebtoken.Jwts.builder(ProGuard:116) . GenerateToken(ProGuard:216)位于android.app.FragmentManagerImpl.moveToState(FragmentManager)的android.app.Fragment.performCreateView(Fragment.java:1699)的com.cineworld.app.screen_options.webpage.PurchaseWebPage.onCreateView(ProGuard:142) .java:885)在android.app.FragmentManagerImpl.move前面的android.app.BackStackRecord.run(BackStackRecord.java:682)的android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)(FragmentManager.java:1435)在android.app.FragmentManagerImpl $ 1.run(FragmentManager.java:441)的android.os.Handler.handleCallback(Handler.java:725)at a在android.app.Looper.loop(Looper.java:137)的ndroid.os.Handler.dispatchMessage(Handler.java:92)位于java.lang.reflect的android.app.ActivityThread.main(ActivityThread.java:5041)位于com.android的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)的java.lang.reflect.Method.invoke(Method.java:511)中的.Method.invokeNative(Native Method) .internal.os.ZygoteInit.main(ZygoteInit.java:560)at dalvik.system.NativeStart.main(Native Method)由:java.lang.ExceptionInInitializerError at com.aacad . (ProGuard:209)at io.jsonwebtoken .impl.DefaultJwtBuilder . (ProGuard:42)at i.jsonwebtoken.Jwts.builder(ProGuard:116)at com.cineworld.app.screen_options.webpage.PurchaseWebPage.GenerateToken(ProGuard:216)at com.cineworld.app.screen_options在Android.app.FragmentManagerImpl.moveToState的android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)的android.app.Fragment.performCreateView(Fragment.java:1699)上的.webpage.PurchaseWebPage.onCreateView(ProGuard:142)神父agmentManager.java:1057)在android.app.BackStack.Record.run(BackStackRecord.java:682)的android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)android.app.FragmentManagerImpl $ 1.run(FragmentManager.java: 441)在android.os.Handler.handleCallback(Handler.java:725)的android.os.Handler.dispatchMessage(Handler.java:92)android.os.Looper.loop(Looper.java:137) . app.ActivityThread.main(ActivityThread.java:5041)位于com.android.internal的java.lang.reflect.Method.invoke(Method.java:511)的java.lang.reflect.Method.invokeNative(Native Method)中 . os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)at atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)at dalvik.system.NativeStart.main(Native Method)引起:java.lang.NoSuchFieldError:PUBLIC_ONLY at java.lang.Class.getDeclaredAnnotation(Native方法)在com.aacfac(ProGuard:172)的java.lang.Class.getAnnotation(Class.java:260)at com.aacad . (ProGuard:209)at io.jsonwebtoken.impl.DefaultJwtBuilder . (ProGuard) :42)在ic.jsonwebtoken.Jwts.builder(ProGuard:116)的com.cineworld.app.screen_options.webpage.PurchaseWebPage.GenerateToken(ProGuard:216)at com.cineworld.app.screen_options.webpage.PurchaseWebPage.onCreateView( ProGuard:142)在Android.app.FragmentManager.If.ToveToState(FragmentManager.java:885)的android.app.FragmentManager.If.ToveToState(FragmentManager.java:885)的android.app.Fragment.performCreateView(Fragment.java:1699) android.app.BackStackRecord.run(BackStackRecord.java:682)位于android.app.FragmentManagerImpl $ 1run的android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) ragmentManager.java:441)在android.os.Handler.handle上使用android.os.Handler.handleCallback(Handler.java:725),在android.os.Looper.loop(Looper.java:137)上运行android.os.Handler.dispatchMessage(Handler.java:92) )在java.lang.reflect.Method.invoke的java.lang.reflect.Method.invokeNative(Native Method)的android.app.ActivityThread.main(ActivityThread.java:5041)上

有人可以指导我以正确的方式来处理这个问题吗?

1 回答

  • 1

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

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

    规则通常位于项目的proguard-rules.pro文件中 .

相关问题