2016-10-07 3 views
1

私はProGuardを動作させようとしています。約4時間無作為に試してみると、この素晴らしいソフトウェアが動作するようになりました。ProGuard SimException

私のプロジェクトは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.** { *; } 

これはコンパイルされません。次のエラーの複数をスローします:Compile with Proguard gives SimException: "local variable type mismatch"このエラーに関するいくつかの情報が見つかりました: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.

解決策は、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