当前位置: 首页 > 知识库问答 >
问题:

使用Proguard混淆时Gson EnumTypeAdapter中的AssertionError

晏修诚
2023-03-14

在序列化/反序列化过程中,我的项目在GSON中实现了一个TypeAdapter,用于保留对象的多态性状态。不管怎样,该项目在开发测试中工作得很好,但当它用proguard混淆发布并测试时,它就崩溃了。

03-21 10:06:53.632: E/AndroidRuntime(12441): FATAL EXCEPTION: main
03-21 10:06:53.632: E/AndroidRuntime(12441): java.lang.AssertionError
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.internal.bind.TypeAdapters$EnumTypeAdapter.<init>(SourceFile:724)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.internal.bind.TypeAdapters$26.create(SourceFile:753)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.Gson.getAdapter(SourceFile:353)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(SourceFile:82)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(SourceFile:81)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(SourceFile:118)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(SourceFile:72)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.Gson.getAdapter(SourceFile:353)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.Gson.toJson(SourceFile:578)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.Gson.toJsonTree(SourceFile:479)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.Gson.toJsonTree(SourceFile:458)
03-21 10:06:53.632: E/AndroidRuntime(12441):    at com.google.gson.Gson$3.serialize(SourceFile:137)

我的Gson特定的proguard配置是:

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

#This is extra - added by me to exclude gson obfuscation
-keep class com.google.gson.** { *; }

##---------------End: proguard configuration for Gson  ----------

我正在使用的打字适配器是:

public final class GsonWorkshiftAdapter implements JsonSerializer<IWorkshift>, JsonDeserializer<IWorkshift> {
    private static final String CLASSNAME = "CLASSNAME";
    private static final String INSTANCE  = "INSTANCE";

    @Override
    public JsonElement serialize(IWorkshift src, Type typeOfSrc, JsonSerializationContext context) {
        String className = src.getClass().getCanonicalName();
        JsonElement elem = context.serialize(src);

        JsonObject retValue = new JsonObject();
        retValue.addProperty(CLASSNAME, className);
        retValue.add(INSTANCE, elem);

        return retValue;
    }

    @Override
    public IWorkshift deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject =  json.getAsJsonObject();
        JsonPrimitive prim = (JsonPrimitive) jsonObject.get(CLASSNAME);
        String className = prim.getAsString();

        Class<?> klass = null;
        try { klass = Class.forName(className); }
        catch (ClassNotFoundException e) { throw new JsonParseException(e.getMessage()); }

        return context.deserialize(jsonObject.get(INSTANCE), klass);
    }
}

任何来自开发者社区的帮助都将不胜感激。

共有1个答案

公良琛
2023-03-14

似乎我们必须要求保留枚举的成员。将其添加到proguard配置文件中对我很有效:

-keepclassmembers enum * { *; }

或者,如果你想说得更具体,

-keepclassmembers enum com.your.package.** { *; }
 类似资料:
  • 我对混淆有问题。为了获得更好的想象力: JAVA代码 本机代码 在我想发布一个混淆版本之前,一切都很好。这个类中的Java类(例如)和方法的名称被proGuard重命名为“a”和“a()”(这可能并不总是相同的),但在本机代码中,方法和类的原始名称保持不变,因为它被硬编码为字符串,如下所示: ...有没有办法动态设置方法名?

  • 我正在努力解决JavaFX应用程序的模糊问题。以本项目为基础: Proguard配置文件:-dontoptimized-dontshrink 有人有JavaFX模糊处理的经验吗?

  • 问题内容: 是否可以仅将ProGuard用于混淆。我不希望ProGuard从我的项目中删除任何类。我打算使用ProGuard只是为了混淆,以防止进行反向工程。 问题答案: 是的,通过指定 您可以在ProGuard手册中找到有关所有配置选项的详细信息。 请注意,缩小和优化可能有助于防止反向工程。

  • 问题内容: 我在AndroidStudio 1.2.1.1和Gradle 1.2.3中使用了ProGuard。 My Gradle的发布版本的配置如下: 我希望混淆类的私有字段。 到目前为止,这是我的proguard配置文件(经过多次尝试): 但是在从AndroidGuard 反编译后,我最终得到了: 我知道这种混淆的使用是有限的,但是我想由ProGuard重命名。怎么做? 这是refcard。

  • 我已经成功地用Maven配置了Proguard来混淆jar及其依赖jar。我已经设法让两个混淆使用相同的映射文件,这样一个jar就可以调用另一个jar的方法。我面临的问题是,Proguard没有在模糊的jar中保留唯一的名称;两个模糊的jar都包含一个名为 由于有两个名为F.B.class的类(每个jar中有一个),因此优先级被赋予了调用jar中的类,这就造成了问题。 也被应用,但它显然只将此应用

  • 本文向大家介绍Android 一些常用的混淆Proguard,包括了Android 一些常用的混淆Proguard的使用技巧和注意事项,需要的朋友参考一下 一些公共的模板 一些自定义的模板 aar中增加独立的混淆配置 检查混淆和追踪异常 开启 Proguard 功能,则每次构建时 ProGuard 都会输出下列文件: dump.txt 说明 APK 中所有类文件的内部结构。 mapping.txt