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

Это не скомпилировано. Он вызывает несколько ошибок: 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".

Решено было отредактировать файл main-rules.xml от ANT, но я использую 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 из них.

Проблема запутывания libGDX может быть решена с помощью этого правила:

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

При использовании добавок, компиляция прошла успешно, но приложение падает через некоторое время: NullPointerException: попытка вызвать виртуальный метод «com.badlogic .gdx.scenes.scene2d.ui.Label $ LabelStyle com.badlogic.gdx.scenes.scene2d.ui.Label.getStyle() 'на ссылке нулевого объекта – kwantuM

+0

Это скорее всего вызвано обфускацией (или я совершенно не прав?) – kwantuM

+0

Nevermind, получил его на работу! – kwantuM

Смежные вопросы