2016-10-07 56 views
1

我試圖讓ProGuard工作,經過大約4小時的隨機嘗試,嘗試讓這個驚人的軟件工作。ProGuard SimException

我的項目使用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

該問題可能與ProGuard的特定優化有關。 您可以像禁用它:

-optimizations !code/allocation/variable 

此外,您還可以刪除LocalVariableTable和LocalVariableTypeTable屬性這似乎不正確更新(並在應用中不需要了)。爲此,您將需要啓用,雖然模糊,然後使用類似:

-keepattributes !LocalVariable*,** 

此規則將保留所有的屬性,但所以LocalVariable相關的。

# Keep names - Native method names. Keep all native class/method names. 
-keepclasseswithmembers,includedescriptorclasses class * { 
    native <methods>; 
} 
+0

當使用添加劑,編譯成功,但經過一段時間的應用程序崩潰:NullPointerException異常:試圖調用虛擬方法com.badlogic

與libGDX混淆問題可能是由於此規則來解決.gdx.scenes.scene2d.ui.Label $ LabelStyle com.badlogic.gdx.scenes.scene2d.ui.Label.getStyle()'null對象引用 – kwantuM

+0

這很可能是由混淆造成的(或者我完全錯了嗎? ) – kwantuM

+0

沒關係,讓它工作! – kwantuM