ProGuard SimException

时间:2016-10-07 11:19:41

标签: java android libgdx proguard

我试图让ProGuard工作,经过大约4个小时的随机尝试选项,试图让这个神奇的软件发挥作用。

我的项目正在使用LibGDX和Kryo​​Net。这是我目前的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编辑一些main-rules.xml文件,但我使用的是Gradle。发布了评论,其中包含Gradle修补程序:添加project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--no-locals'] }。但显然Dex类已被删除,因此不再有效。

我读到这是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__)

有谁知道如何解决这些问题?

1 个答案:

答案 0 :(得分:1)

问题可能与ProGuard的特定优化有关。 你可以这样禁用它:

<div data-WRID="WRID-147582892358590272" data-widgetType="Push Content" data-class="affiliateAdsByFlipkart" height="6.181318681318681%" width="50%"></div>
<script async src="//affiliate.flipkart.com/affiliate/widgets/FKAffiliateW‌​idgets.js"></script>

此外,您还可以删除LocalVariableTable和LocalVariableTypeTable属性,这些属性似乎没有正确更新(并且在应用程序中不再需要)。为此,您需要启用模糊处理,然后使用类似:

-optimizations !code/allocation/variable

此规则将保留所有属性,但与LocalVariable相关。

libGDX的混淆问题可能通过以下规则解决:

-keepattributes !LocalVariable*,**