2013-08-17 34 views
4

我正在開發一個libgdx的android動態壁紙,當我使用proguard時遇到了一個大問題。這是當我livewallpaper開始的錯誤:Proguard和libgdx:RuntimeException

08-17 13:55:50.755: E/AndroidRuntime(28276): FATAL EXCEPTION: main 
08-17 13:55:50.755: E/AndroidRuntime(28276): java.lang.RuntimeException: Couldn't construct AndroidInput, this should never happen 
08-17 13:55:50.755: E/AndroidRuntime(28276): at com.badlogic.gdx.backends.android.o.a(Unknown Source) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at com.badlogic.gdx.backends.android.q.a(Unknown Source) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at com.badlogic.gdx.backends.android.r.onCreate(Unknown Source) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at android.service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:777) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:1037) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:40) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at android.os.Looper.loop(Looper.java:137) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at android.app.ActivityThread.main(ActivityThread.java:5227) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at java.lang.reflect.Method.invokeNative(Native Method) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at java.lang.reflect.Method.invoke(Method.java:511) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at dalvik.system.NativeStart.main(Native Method) 
08-17 13:55:50.755: E/AndroidRuntime(28276): Caused by: java.lang.NoSuchMethodException: <init> [interface com.badlogic.gdx.a, class android.content.Context, class java.lang.Object, class com.badlogic.gdx.backends.android.a] 
08-17 13:55:50.755: E/AndroidRuntime(28276): at java.lang.Class.getConstructorOrMethod(Class.java:460) 
08-17 13:55:50.755: E/AndroidRuntime(28276): at java.lang.Class.getConstructor(Class.java:431) 
08-17 13:55:50.755: E/AndroidRuntime(28276): 

這是我proguard.cfg:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-dontwarn java.awt.** 
-dontnote java.awt.** 
-dontwarn com.badlogic.gdx.jnigen.** 
-dontwarn com.moribitotech.mtx.** 

-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 com.bugsense.trace.models.** { *; } 




-keepclassmembers class **.MraidView$JavaScriptInterface 
{ 
    *; 
}-keepclassmembers class **.SmartWallActivity$AppWall$JavaScriptInterface 
{ 
    *; 
} 

-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 *; 
} 

-keepclasseswithmembers class **.R$** 
    { 
    public static <fields>; 
    } 

    -keep class * extends android.view.View 
    { 

     public <init>(android.content.Context); 
     public <init>(android.content.Context, android.util.AttributeSet); 
     public <init>(android.content.Context, android.util.AttributeSet, int); 
     void set*(***); 
     *** get*(); 
    } 

    -keepclassmembers class * 
    { 
     static final %    *; 
     static final java.lang.String *; 
    } 


    -keepattributes SetJavaScriptEnabled 
    -keepattributes JavascriptInterface 
    -keepattributes InlinedApi 

    -dontwarn com.bugsense.trace.models.** 


-keep public class cmn.Proguard$KeepMembers 
-keep public class * implements cmn.Proguard$KeepMembers 
-keepclassmembers class * implements cmn.Proguard$KeepMembers { 
    <methods>; 
} 
-keepattributes *Annotation* 
-dontwarn android.webkit.JavascriptInterface 

謝謝您的幫助!

+1

您嘗試添加像'-keep類* com.badlogic.gdx。**'保持libgdx類不變?無論如何,你爲什麼要混淆它們,它們是開源的... – noone

回答

2

我有一個與AndroidInput類混淆的類似問題。它是足夠使用:

-keepnames class com.badlogic.gdx.backends.android.AndroidInput* 
-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {<init>(...);} 

...而不是沒有人的答案,或者:

-keep class com.badlogic.gdx.backends.android.** { *; } 

這是記錄並在問題追蹤器回答了libgdx:https://code.google.com/p/libgdx/issues/detail?id=1215

0

我有麻煩用LibGDX設置Proguard,並最終在這個方便的堆棧溢出文章。問題是,儘管它解決了最初的問題,但還是留下了另一個更令人費解的問題:「找不到方法:[...]/badlogic/gdx/physics/box2d/World; .beginContact:(J)V」。

經過一番google搜索我結束了對這個職位:method not found

它建議使用以下設置:

-dontwarn com.badlogic.gdx.jnigen.** 
-dontwarn com.badlogic.gdx.backends.** 

-keep class com.badlogic.gdx.** 
-keepclasseswithmembers class * implements com.badlogic.gdx.physics.box2d { 
    *; 
} 
-keepclasseswithmembers class com.badlogic.gdx.physics.box2d { 
    *; 
} 
-keepclasseswithmembers class com.badlogic.gdx.physics.box2d.World { 
    *; 
} 

的@斯托蒙特的第一設置和崗位設置的組合固定我的問題與LibGdx而且方法不被認可。之後,應用程序在移動設備上運行就好了。

希望它可以幫助任何人。

0

即使關閉了proguard,我的應用仍會拋出此錯誤。

下面爲我工作

創建一個新的libgdx項目,美國可以保持相同的包和文件夾的名稱,以便您可以從舊項目複製到他們