ProGuard SimException

Posted

技术标签:

【中文标题】ProGuard SimException【英文标题】: 【发布时间】:2017-02-16 09:03:19 【问题描述】:

我正在尝试让 ProGuard 工作,经过大约 4 小时的随机尝试,试图让这个神奇的软件工作。

我的项目正在使用 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"。

给出的解决方案是从 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 相关的所有属性。

libGDX 的混淆问题可以通过这条规则解决:

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

【讨论】:

当使用你的添加时,编译成功,但一段时间后应用程序崩溃:NullPointerException: Attempt to invoke virtual method 'com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle com. badlogic.gdx.scenes.scene2d.ui.Label.getStyle()' 在空对象引用上 这很可能是由混淆引起的(或者我完全错了吗?)

以上是关于ProGuard SimException的主要内容,如果未能解决你的问题,请参考以下文章

使用属性打开/关闭 Proguard

proguard.ParseException:proguard.cfg 中的未知选项“-encryptstrings”

ProGuard惯用法

Proguard Maven 插件不使用指定的 Proguard 版本

Proguard 查询,正在使用哪一个

Proguard 返回错误 1 ​​- 项目 bin 文件夹中没有 proguard.txt 文件?