首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ProGuard SimException

ProGuard SimException
EN

Stack Overflow用户
提问于 2016-10-07 11:19:40
回答 1查看 973关注 0票数 1

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

我的项目是使用LibGDX和KryoNet。这是我当前的ProGuard配置:

代码语言:javascript
复制
-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-rues.xml文件,但我使用的是Gradle。发布了一条评论,并对Gradle进行了修正:添加project.tasks.withType(com.android.build.gradle.tasks.Dex) { additionalParameters=['--no-locals'] }。但是很明显Dex类被删除了,所以这不再有效。

我读到这是ProGuard中的一个bug,而这种混淆应该会修复它。但是当我删除-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__)

有人知道如何解决这些问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 11:54:34

这个问题可能与ProGuard的特定优化有关。您可以这样禁用它:

代码语言:javascript
复制
-optimizations !code/allocation/variable

此外,您还可以删除LocalVariableTable和LocalVariableTypeTable属性,这些属性似乎没有被正确更新(并且在应用程序中不再需要)。为此,您需要启用混淆,然后使用如下内容:

代码语言:javascript
复制
-keepattributes !LocalVariable*,**

此规则将保留所有属性,但保留与LocalVariable相关的属性。

libGDX的混淆问题可以通过以下规则来解决:

代码语言:javascript
复制
# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses class * {
    native <methods>;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39915959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档