Google Gson保留泛型签名:Firebase Crashlytics崩溃问题求助
解决TypeToken与jsonschema2pojo生成类的崩溃问题
1. 修正TypeToken的创建方式
必须以匿名内部类形式创建TypeToken,不能直接调用构造方法——TypeToken依赖子类反射来获取泛型类型信息:
// 正确写法 TypeToken<ApiResponse<YourDataClass>> token = new TypeToken<ApiResponse<YourDataClass>>() {}; // 错误写法(触发崩溃) TypeToken<ApiResponse<YourDataClass>> token = new TypeToken<ApiResponse<YourDataClass>>();
注意末尾的{},这是创建TypeToken匿名子类的关键语法。
2. 配置ProGuard/R8保留泛型元数据
代码压缩工具会移除泛型签名,导致TypeToken无法解析类型。在proguard-rules.pro中添加以下规则:
# 保留泛型签名和注解元数据 -keepattributes Signature, *Annotation* # 保留jsonschema2pojo生成的ApiResponse类及其泛型信息 -keep class com.your.package.ApiResponse** { <fields>; <methods>; } # 若ApiResponse有内部类,同样保留泛型信息 -keep class com.your.package.ApiResponse$** { <fields>; <methods>; }
将com.your.package替换为实际的包路径。
3. 验证jsonschema2pojo生成的ApiResponse类
确认生成的类是正确的泛型类,结构应类似:
public class ApiResponse<T> { private T data; // 其他字段、getter/setter方法 }
如果生成的类丢失了泛型参数,需调整jsonschema2pojo的生成配置,确保开启泛型类生成。检查JSON Schema定义是否包含泛型相关结构,或在生成工具中指定genericTypes参数。
4. 规避静态/反射场景的错误使用
在静态方法、静态变量中创建TypeToken时,同样要使用匿名内部类形式。避免通过反射动态生成TypeToken,这类场景下泛型元数据大概率已被压缩工具移除。
内容的提问来源于stack exchange,提问作者S. Gissel
相关产品推荐
相关产品推荐

