【问题标题】:Proguard Error- NoSuchMethodException in EnumTypeIntProguard 错误 - EnumTypeInt 中的 NoSuchMethodException
【发布时间】:2019-02-27 10:32:29
【问题描述】:

我有一个名为 EnumInt 的接口,并按如下方式使用它

                 case EnumInt:
                        @SuppressWarnings("unchecked")
                        Class<? extends EnumInt> enumType = (Class<? extends EnumInt>) field.getType();
                        Method enumStaticMethod = enumType.getMethod("fromVal", int.class);
                        Object enumInstance = enumStaticMethod.invoke(null, object);
                        field.setAccessible(true);
                        field.set(entity, enumInstance);
                        break;

我已经将整个包裹保存在 progaurd 中,但仍在获取

-保持类 abc.cde.** { *; } // 包含 EnumInt 接口和其他文件的包

    java.lang.NoSuchMethodException: fromVal [int]
    at java.lang.Class.getMethod(Class.java:2068)
    at java.lang.Class.getMethod(Class.java:1690)

我已尝试保留 EnumInt 接口、所有本机方法、proguard 中的字段以防止混淆,但仍无法消除错误。 请注意,如果没有 proguard,它工作正常。 请帮忙。提前致谢。问题是 Enums 特有的。

【问题讨论】:

标签: android obfuscation android-proguard


【解决方案1】:

为未来的读者回答我自己的问题。 我正在使用另一个实现 EnumInt 的枚举,如下所示

public static enum CustomeType implements EnumInt {
    ALL(MSG_TYPE_ALL),
    IN(MSG_TYPE_IN),
    OUT(MSG_TYPE_OUT),

    int val;

    private CustomeType(int val) {
        this.val = val;
    }

    public static CustomeType fromVal(int val) {
        for (CustomeType messageType : values()) {
            if (messageType.val == val) {
                return messageType;
            }
        }
        return null;
    }
}

我错过了 proguard 混淆来防止这个枚举。

解决方案

proguard 中的下一行

-keep public enum abc.cde.a.CustomeType$** {
**[] $VALUES;
 public *;
 }

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多