2013-11-25 98 views
3

我想用ProGuard對我的Libgdx Java項目進行混淆,但是在某些時候我在某些時候出現了關於Themeable Widget庫的錯誤。這是我的桌面項目(非安卓):Libgdx和ProGuard不能與Themable Widget庫(桌面)一起工作

Ignoring unused library classes... 
    Original number of library classes: 19830 
    Final number of library classes: 880 
Optimizing... 
Unexpected error while evaluating instruction: 
    Class  = [de/matthiasmann/twlthemeeditor/datamodel/Include] 
    Method  = [addToXPP(Lde/matthiasmann/twlthemeeditor/datamodel/DomXPPParser;)V] 
    Instruction = [6] invokevirtual #71 
    Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/lang/Object] (with 0 known super classes) and [de/matthiasmann/twlthemeeditor/datamodel/Include] (with 1 known super classes)) 
Unexpected error while performing partial evaluation: 
    Class  = [de/matthiasmann/twlthemeeditor/datamodel/Include] 
    Method  = [addToXPP(Lde/matthiasmann/twlthemeeditor/datamodel/DomXPPParser;)V] 
    Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/lang/Object] (with 0 known super classes) and [de/matthiasmann/twlthemeeditor/datamodel/Include] (with 1 known super classes)) 
java.lang.IllegalArgumentException: Can't find common super class of [java/lang/Object] (with 0 known super classes) and [de/matthiasmann/twlthemeeditor/datamodel/Include] (with 1 known super classes) 
    at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:344) 
    at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:481) 
    at proguard.optimize.info.MethodOptimizationInfo.generalizeParameter(MethodOptimizationInfo.java:231) 
    at proguard.optimize.evaluation.StoringInvocationUnit.generalizeMethodParameterValue(StoringInvocationUnit.java:176) 
    at proguard.optimize.evaluation.StoringInvocationUnit.setMethodParameterValue(StoringInvocationUnit.java:112) 
    at proguard.evaluation.BasicInvocationUnit.visitAnyMethodrefConstant(BasicInvocationUnit.java:223) 
    at proguard.classfile.util.SimplifiedVisitor.visitMethodrefConstant(SimplifiedVisitor.java:204) 
    at proguard.classfile.constant.MethodrefConstant.accept(MethodrefConstant.java:69) 
    at proguard.classfile.ProgramClass.constantPoolEntryAccept(ProgramClass.java:453) 
    at proguard.evaluation.BasicInvocationUnit.invokeMember(BasicInvocationUnit.java:178) 
    at proguard.evaluation.Processor.visitConstantInstruction(Processor.java:573) 
    at proguard.classfile.instruction.ConstantInstruction.accept(ConstantInstruction.java:157) 
    at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:753) 
    at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:587) 
    at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:560) 
    at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:264) 
    at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:181) 
    at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101) 
    at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79) 
    at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95) 
    at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91) 
    at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71) 
    at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:504) 
    at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47) 
    at proguard.classfile.ProgramClass.accept(ProgramClass.java:346) 
    at proguard.classfile.ClassPool.classesAccept(ClassPool.java:125) 
    at proguard.optimize.Optimizer.execute(Optimizer.java:372) 
    at proguard.ProGuard.optimize(ProGuard.java:307) 
    at proguard.ProGuard.execute(ProGuard.java:116) 
    at proguard.ProGuard.main(ProGuard.java:484) 

這是我的ProGuard配置文件的樣子:

-injars  ../Acast-desktop/bin/Acast.jar(!META-INF/MANIFEST.MF) 
-outjars  ../Acast-desktop/bin/Acast-guarded.jar 
-libraryjars ../Acast/libs/gdx-sources.jar 
-libraryjars ../Acast/libs/gdx-controllers-desktop.jar 
-libraryjars ../Acast/libs/gdx-controllers-gwt.jar 
-libraryjars ../Acast/libs/gdx-controllers-android.jar 
-libraryjars ../Acast/libs/gdx-controllers.jar 
-libraryjars ../Acast/libs/gdx-controllers-desktop-natives.jar 
-libraryjars ../Acast/libs/gdx-tools.jar 
-libraryjars ../Acast/libs/gdx.jar 
-libraryjars ../Acast/libs/json-simple-1.1.1.jar 
-libraryjars ../Acast/libs/acast-network-commons.jar 
-libraryjars ../Acast-desktop/libs/gdx-backend-lwjgl.jar 
-libraryjars ../Acast-desktop/libs/gdx-backend-lwjgl-sources.jar 
-libraryjars ../Acast-desktop/libs/gdx-backend-lwjgl-natives.jar 
-libraryjars ../Acast-desktop/libs/gdx-natives.jar 
-libraryjars ../Acast-network-commons/libs/kryonet-2.18-all.jar 
-libraryjars <java.home>/../jre/lib/rt.jar 

-optimizationpasses 1 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-dontshrink 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
-keep class org.apache.** 
-keep class de.matthiasmann.** 
-keep class de.matthiasmann.twlthemeeditor.** 
-keep class com.jcraft.** 
-keep class com.badlogic.** 
-keep class com.badlogic.gdx.** 
-keep class com.badlogic.gdx.backends.** 
-keep class com..badlogic.gdx.controllers.** 
-keep class javax.** 
-keep class org.lwjgl.** 
-keep class org.lwjgl.opengl.** 
-keep class com.badlogic.backends.** 
-keep class * implements com.badlogic.gdx.utils.Json* 
-keep class com.esotericsoftware.** 
-keep class com.esotericsoftware.kryo.** 
-keep class com.google.** 
-keep class java.lang.reflect.** 

-dontnote 
-dontwarn de.matthiasmann.** 
-dontwarn com.esotericsoftware.kryo.** 
-dontwarn com.badlogic.gdx.** 
-dontwarn org.lwjgl.** 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-keep public class com.pixelonion.acast.Main{ 
    public static void main(java.lang.String[]); 
} 

我不明白拋出的異常。我錯過了包括一個圖書館罐子嗎?當我從我的proguard配置中刪除'dontwarn de.matthiasmann。**'這一行時,出現「無法找到引用的類de.matthiasmann.twl.Widget」等錯誤。我明確告訴ProGuard從libgdx和matthiasmann(The Widget Library:http://twl.l33tlabs.org/)開始保留類,以便它們不會被混淆(它們無論如何都是開源的)。

回答

2

我能解決這個問題:

首先,保持線是非常重要的

-dontwarn de.matthiasmann.** 

然後從這裏下載官方庫:http://twl.l33tlabs.org/dist/TWL.jar

之後,你的庫添加到外部圖書館:

-libraryjars ../Project/libs/TWL.jar 

就是這樣。它會正確地混淆和優化代碼。我還沒有嘗試過運行它,因爲我遇到了另一個問題。但至少現在錯誤消失了。