微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – Dexguard / Proguard使应用程序在Enum交换机上崩溃

dexguard从7.0.12更新到7.1.22之后,我在Enum交换机上遇到崩溃.

这只发生在dexguard运行我们的项目时(我想这是由Proguard问题引起的).

如果我使用硬编码值,则不会发生崩溃.

当然,我想避免使用硬编码值.

碰撞

发生的崩溃如下

java.lang.NoClassDefFoundError: Failed resolution of: Lif;

这发生在状态切换(类型){的行上(见下文)

应用程序崩溃的一些示例代码(假设MyEnum是一个Enum ofcourse):

MyEnum type = MyEnum.someValue;

switch (type) {
    case SomeValue:
        // Do something
        Log.i("Tag", "Hello World!");
        break;
}

假设MyEnum.someValue的序数值为1.

如果我将案例SomeValue更改为案例1:它的工作方式与预期相符.

我做了什么

我不知道为什么会发生这种崩溃.我试图添加这些Proguard规则.

-keep enum * { *; }
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

但这并不能解决问题.

UPDATE

我刚检查了映射文件,保留了所有枚举名称等.现在我对发生的事情更加无知了.

my.identifier.MyEnum -> my.identifier.MyEnum:
    my.identifier.MyEnum SomeValue -> SomeValue
    my.identifier.MyEnum[] $VALUES -> $VALUES
    6:6:my.identifier.MyEnum[] values() -> values
    6:6:my.identifier.MyEnum valueOf(java.lang.String) -> valueOf
    6:6:void <init>(java.lang.String,int) -> <init>
    6:7:void <clinit>() -> <clinit>

更新2

刚看了一下输出.它被编译成这个.
判断堆栈跟踪,我想如果Proguard没有保留.
这定义在哪里?我需要添加什么才能让Proguard保留这个?

switch(if.ˊ[var2.ordinal()]) {
    case 1:
        //some other code
        break;

更新3

代码行看起来像这样的中间体:

switch(null.$SwitchMap$my$identifier$MyEnum[type.ordinal()]) {
    case 1:
        //some other code
        break;

事实,它声明为null.$困扰我.这似乎不对.或者这是正常的吗?

更新4

刚刚恢复到我们旧版本的dexguard删除了我添加的Proguard规则.

现在崩溃不再发生了,尽管代码看起来仍然完全一样. (中间体和完全编译的代码)

更新5

切换到dexguard 7.2,它完美无瑕.

解决方法:

switch语句将创建一个合成内部类,其数组字段$SwitchMap $MyEnum将枚举字段的序号映射到大于0的整数.您需要确保此类及其字段也被保留.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐