創維v5機型gson解析數據造成應用閃退
異常log要點:java.lang.NoSuchMethodError: com.google.gson.Gson.newJsonReader
異常log要點:java.lang.IllegalArgumentException: Unable to create converter for <class>
項目使用框架:retrofit2+rxjava2+gson
測試環境:Android4.4 HISIV510
gson依賴版本:2.6.2 / 2.8.2
github提問鏈接:https://github.com/google/gson/issues/1552
stackoverflow提問鏈接:https://stackoverflow.com/questions/57052546/java-lang-illegalargumentexception-unable-to-create-converter-for
通過抓到的log日誌,初步判斷是gson數據解析異常,所以本人首先嚐試自定義TypeAdapter,繼承read和write方法去手動解析json,這個方法成功的解決了報錯的數據接口解析失敗
Gson builder = new GsonBuilder() .registerTypeAdapter(ColumnInfo.class, new ColumnInfoAdapter()) .registerTypeAdapter(PhoneWorksInfo.class, new PhoneWorksInfoAdapter(context)) .create();
但是,另一個數據接口也報錯了,這樣子的話可能所有json數據接口都需要寫一個TypeAdapter,工作量太大了,只能放棄這種解決思路。
解決方案:
通過分析app在V5機型的安裝日誌,發現如下信息:
07-18 11:05:22.388 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/ExclusionStrategy;' has an earlier definition; blocking out 07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/FieldAttributes;' has an earlier definition; blocking out 07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/FieldNamingStrategy;' has an earlier definition; blocking out 07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/Gson;' has an earlier definition; blocking out 07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/GsonBuilder;' has an earlier definition; blocking out 07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/InstanceCreator;' has an earlier definition; blocking out 07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/JsonDeserializationContext;' has an earlier definition; blocking out
應用使用的是設備本身更早版本的gson庫,而不是app中配置版本的gson庫,所以決定在項目中手動集成gson。
首先在github上把gson源碼拉下來,並且導入module到項目中,然後把com.squareup.retrofit2:converter-gson中的三個類也添加到項目中,並且都改掉包名,成功解決問題!