對程式進行混淆,打包發布版apk,再用真機對該發布版apk進行測試,發現所有有網路請求的頁面都無法顯示出資料,查看log,發現如下異常:
<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+zfjJz7Lpwcuy6Q=="Missing type parameter"這個問題到底是什麼原因引起的,可以看到這樣的回答因為程式中用到了gson的new typeToken。那應該是在混淆的檔案裡對typetoken相關的類做了混淆,導致運行時程式不能識別。看的
at com a.a.c.a.a(Unknown Source)這個應該就是被混淆的不能識別的類。為了進一步證實,還是查看下混淆後產生的檔案mapping.txt來找出混淆後的類com a.a.c.a.a對應的是程式中的哪個類,如:
可以確定是指向了com.google.gson.reflect.TypeToken
然後就在混淆檔案裡proguard-android.txt(我在Android Studio0.3.7上用的該txt對程式進行混淆,很多以往的項目都是在proguard.cfg裡)加上這句話:
-keep class com.google.gson.** {*;} 表示對該類不執行proguard操作
網上也可查到很多解決辦法,例如下面兩個
android混淆編譯——問題匯總 和stackoverflow上的 proguard Missing type parameter
在 proguard.cfg中添加
-dontobfuscate
-dontoptimize
或者添加:
# 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# 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.** { *; }
但是這樣配置後,打包發布版的apk後運行還是出現同樣的錯誤,問題並沒有解決。
糾結過後,想想問題既然出在混淆了不該混淆的類上,而且是在進行擷取網路資料時報錯的,又已經排除了TypeToken類被混淆導致的問題(已經寫了-keep class com.google.gson.** {*;}還出現Missing Type patamerer的問題),那應該是程式在執行到TypeToken之前就遇到了被混淆的類,查看程式中擷取網路資料並進行json格式轉換操作的相關代碼,發現:
在擷取介面資料的模組中引用了org.json下的類,但proguard-android.txt中沒有對這部分類做保留操作。
在proguard-android.txt中加入:
-keep classorg.json.** {*;}
再打包發布版的apk,運行正常,問題解決啦!