ProGuard 模拟异常
ProGuard SimException
我正在尝试让 ProGuard 正常工作,经过大约 4 小时的随机尝试选项来尝试让这个令人惊叹的软件正常工作。
我的项目正在使用 LibGDX 和 KryoNet。这是我当前的 ProGuard 配置:
-verbose
-dontobfuscate
-dontwarn android.support.**
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
-dontwarn com.badlogic.gdx.utils.GdxBuild
-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild
-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
<init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
}
# Kryo
-dontwarn sun.reflect.**
-dontwarn java.beans.**
-dontwarn sun.nio.ch.**
-dontwarn sun.misc.**
-keep class com.esotericsoftware.kryo.** {*;}
-keep class com.esotericsoftware.** {*;}
-keep class java.beans.** { *; }
-keep class sun.reflect.** { *; }
-keep class sun.nio.ch.** { *; }
这不编译。它会引发以下多个错误:Uncaught translation error: com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type float using a local variable of type int. This is symptomatic of .class transformation tools that ignore local variable information.
我找到了有关此错误的一些信息:Compile with Proguard gives SimException: "local variable type mismatch"。
给出的解决方案是从 ANT 编辑一些主要的 rules.xml 文件,但我使用的是 Gradle。已发布一条评论,其中包含 Gradle 的修复:添加 project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--no-locals'] }
。但显然 Dex class 已被删除,所以这不再有效。
我了解到这是 ProGuard 中的一个错误,混淆应该可以修复它。但是当我删除 -dontobfuscate
行时,我的应用程序不再启动:java.lang.UnsatisfiedLinkError: No implementation found for void com.a.a.c.a.k.g() (tried Java_com_a_a_c_a_k_g and Java_com_a_a_c_a_k_g__)
.
有谁知道如何解决这些问题?
问题可能与 ProGuard 的特定优化有关。
您可以这样禁用它:
-optimizations !code/allocation/variable
此外,您还可以删除 LocalVariableTable 和 LocalVariableTypeTable 属性,它们似乎没有正确更新(应用程序不再需要)。为此,您需要启用混淆,然后使用类似的东西:
-keepattributes !LocalVariable*,**
此规则将保留除 LocalVariable 相关属性之外的所有属性。
libGDX的混淆问题可能会被这个规则解决:
# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses class * {
native <methods>;
}
我正在尝试让 ProGuard 正常工作,经过大约 4 小时的随机尝试选项来尝试让这个令人惊叹的软件正常工作。
我的项目正在使用 LibGDX 和 KryoNet。这是我当前的 ProGuard 配置:
-verbose
-dontobfuscate
-dontwarn android.support.**
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
-dontwarn com.badlogic.gdx.utils.GdxBuild
-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild
-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
<init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
}
# Kryo
-dontwarn sun.reflect.**
-dontwarn java.beans.**
-dontwarn sun.nio.ch.**
-dontwarn sun.misc.**
-keep class com.esotericsoftware.kryo.** {*;}
-keep class com.esotericsoftware.** {*;}
-keep class java.beans.** { *; }
-keep class sun.reflect.** { *; }
-keep class sun.nio.ch.** { *; }
这不编译。它会引发以下多个错误:Uncaught translation error: com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type float using a local variable of type int. This is symptomatic of .class transformation tools that ignore local variable information.
我找到了有关此错误的一些信息:Compile with Proguard gives SimException: "local variable type mismatch"。
给出的解决方案是从 ANT 编辑一些主要的 rules.xml 文件,但我使用的是 Gradle。已发布一条评论,其中包含 Gradle 的修复:添加 project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--no-locals'] }
。但显然 Dex class 已被删除,所以这不再有效。
我了解到这是 ProGuard 中的一个错误,混淆应该可以修复它。但是当我删除 -dontobfuscate
行时,我的应用程序不再启动:java.lang.UnsatisfiedLinkError: No implementation found for void com.a.a.c.a.k.g() (tried Java_com_a_a_c_a_k_g and Java_com_a_a_c_a_k_g__)
.
有谁知道如何解决这些问题?
问题可能与 ProGuard 的特定优化有关。 您可以这样禁用它:
-optimizations !code/allocation/variable
此外,您还可以删除 LocalVariableTable 和 LocalVariableTypeTable 属性,它们似乎没有正确更新(应用程序不再需要)。为此,您需要启用混淆,然后使用类似的东西:
-keepattributes !LocalVariable*,**
此规则将保留除 LocalVariable 相关属性之外的所有属性。
libGDX的混淆问题可能会被这个规则解决:
# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses class * {
native <methods>;
}