Proguard 由于特定的第三方库而产生运行时错误
Proguard produce runtime error because of specific third party library
最近我在Android完成了一个大项目,发布前的最后一个要求是编译时启用Proguard,我认为这是项目中比较容易的部分,但结果对我来说真是地狱般的经历。
在项目中我使用了几个第三方库,至少从我目前的检查来看,似乎所有这些库都与我的 Proguard 配置一起工作。
有问题的库是 JWT: JSON Web Token for Java and Android,它没有关于如何使用 Proguard 配置它的文档,我尝试了很多不同的配置,但 none 解决了这个问题。
仅当我将此行放入代码中(从该库调用 class)时才会发生错误:
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.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.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.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.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
有人可以指导我正确处理这个问题吗?
如果你想简单地防止整个 Java 包被混淆,因为找出出错的地方太费时间了,请尝试将它添加到你的混淆器规则文件中:
-keep class io.jsonwebtoken.** {
public protected private *;
}
这些规则通常在您项目的 proguard-rules.pro 文件中。
最近我在Android完成了一个大项目,发布前的最后一个要求是编译时启用Proguard,我认为这是项目中比较容易的部分,但结果对我来说真是地狱般的经历。
在项目中我使用了几个第三方库,至少从我目前的检查来看,似乎所有这些库都与我的 Proguard 配置一起工作。
有问题的库是 JWT: JSON Web Token for Java and Android,它没有关于如何使用 Proguard 配置它的文档,我尝试了很多不同的配置,但 none 解决了这个问题。
仅当我将此行放入代码中(从该库调用 class)时才会发生错误:
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.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.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.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.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
有人可以指导我正确处理这个问题吗?
如果你想简单地防止整个 Java 包被混淆,因为找出出错的地方太费时间了,请尝试将它添加到你的混淆器规则文件中:
-keep class io.jsonwebtoken.** {
public protected private *;
}
这些规则通常在您项目的 proguard-rules.pro 文件中。