Android混淆後運行程序出現異常:Missing type parameter

對程序進行混淆,打包發佈版apk,再用真機對該發佈版apk進行測試,發現所有有網絡請求的頁面都無法顯示出數據,查看log,發現如下異常:

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,運行正常,問題解決啦!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *