ProGuard混淆 - java.lang.NoSuchMethodError: getPointer

3
我想要混淆一个我编写的游戏。我将其精简为一个非常基本的项目,以说明问题(该项目可以在此找到:https://github.com/dschneider/libgdx-proguard-test)。您需要安装ant并在终端中运行make desktop来编译和混淆项目。当尝试运行混淆后的jar文件时会出现以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: getPointer
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1894)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1851)
at java.lang.Runtime.load0(Runtime.java:795)
at java.lang.System.load(System.java:1062)
at org.lwjgl.Sys$1.run(Sys.java:70)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.b(Sys.java:66)
at org.lwjgl.Sys.c(Sys.java:95)
at org.lwjgl.Sys.<clinit>(Sys.java:112)
at org.lwjgl.openal.AL.<clinit>(AL.java:59)
at com.badlogic.gdx.backends.openal.OpenALAudio.<init>(OpenALAudio.java:70)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.<init>(LwjglApplication.java:82)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.<init>(LwjglApplication.java:64)
at com.libgdxproguard.test.Main.main(Main.java:14)

我有点不明白。当我告诉ProGuard不要混淆代码时,它后来运行得很好。显然,某些不应该被混淆的东西被混淆了,但我不确定如何解决这个错误。


1
你可以尝试使用这个配置文件: https://github.com/libgdx/libgdx-maven-archetype/blob/master/src/main/resources/archetype-resources/android/proguard.cfg - noone
1个回答

3

liblwjgl.so中的本地代码通过反射回调LWJGL库的Java代码。ProGuard不知道本地代码所做的任何事情,因此可能会删除或重命名类、字段和方法,从而破坏反射。最简单的解决方案是告诉ProGuard保留所有内容及其原始名称:

-keep class org.lwjgl.** { *; }

libgdx.so 在 GDX 库中也出现了同样的情况,因此:

-keep class com.badlogic.** { *; }

您可以通过精确地确定需要保留哪些类、字段和方法来优化此配置。

非常感谢,这解决了问题!我认为它会按照这种方式工作,我想实际保留那些包中的所有内容。之前我一直在使用“-keep class org.lwjgl.**”。花括号内的星号是否指的是包内的所有方法、字段和类? - RaceCondition
@RaceCondition 大括号内的 *;<fields>; <methods>; 的简写。请参阅 ProGuard 手册 > Usage > Class Specifications: http://proguard.sourceforge.net/manual/usage.html#classspecification。 - Eric Lafortune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接