ProGuard混淆Exception

轉(zhuǎn):Android-Exception整理之com.google.gson.internal.xxx cannot be cast to xxx

Android混淆打包及混淆后運(yùn)行錯(cuò)誤

1. 有時(shí)我們的Android使用Google的Gson庫摇展,在混淆后會(huì)報(bào)出一些異常:

java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to xxx
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xxx

這些異常往往是在配置混淆文件時(shí)出現(xiàn)的問題:

  • 首先要確保混淆文件存在以下語句:
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }
  • 另外(這往往是出現(xiàn)異常的原因)枫甲,確保自己項(xiàng)目?jī)?nèi)用到的實(shí)體類或者bean類(總之就是和Gson解析相關(guān)的模型類)有keep聲明:
# com.package.name是你的項(xiàng)目包名
-keep class com.package.name.bean.** { *; }
-keep class com.package.name.bean.entity.** { *; }
-keep public class com.package.name.R$*{ 
    public static final int *;
}

2. Android引用第三方j(luò)ar包混淆時(shí)打包報(bào)錯(cuò)(can't find referenced class)

項(xiàng)目打包的時(shí)候,總是失敗目养,提示Proguard returned with error code 1. See console挂滓。然后看控制臺(tái)馒索,報(bào)出好多can't find referenced class......

  • 場(chǎng)景:項(xiàng)目中引用了第三方的jar包
  • 原因:第三方j(luò)ar包中引用了好多oracle發(fā)布的java標(biāo)準(zhǔn)中(也就是我們常用的JDK)包含的類,但是Android的java標(biāo)準(zhǔn)和oracle的不一樣红碑,android.jar里面去掉了oracle java標(biāo)準(zhǔn)中好多用不到的包和類;
  • 解決辦法:
首先要把你項(xiàng)目中所引入的第三方j(luò)ar包使用"-libraryjars 包路徑"指定好舞吭。
然后泡垃,用
-dontwarn com.xx.bbb.**
-keep class com.xx.bbb.** { *;}
告訴proguard.cfg不用混淆指定的jar包,也不用提示這個(gè)包所報(bào)出的錯(cuò)羡鸥。
注意:要是用dontwarn取消指定包報(bào)錯(cuò)之前蔑穴,你要保證第三方引用的類在你的項(xiàng)目中沒有用到。

3. Android混淆后項(xiàng)目運(yùn)行的時(shí)候出現(xiàn)異常(混淆之前沒有該異常)

a. ClassNotFoundException惧浴,NoSuchMethodError

  • 原因:這種異常會(huì)在好多情況下出現(xiàn)存和,比如:本地代碼通過反射調(diào)用其他的類,但是經(jīng)過了混淆之后衷旅,就會(huì)出現(xiàn)如上異常捐腿;調(diào)用了JNI之后,C或者C++和java代碼進(jìn)行交互的時(shí)候找不到j(luò)ava的類或者方法柿顶,導(dǎo)致發(fā)生了異常......等等茄袖,還有好多。
  • 解決辦法:只需要將被調(diào)用的java類標(biāo)注為不混淆即可嘁锯。
 -keep class package.classname{*;}

b. ExceptionInInitializerError

  • 原因:這是由于類初始化的時(shí)候發(fā)生了異常宪祥。
  • 解決辦法:找到具體是哪里的類哪個(gè)方法哪個(gè)類初始化的時(shí)候發(fā)生的異常,然后解決問題家乘。
    • 注:遇到這個(gè)錯(cuò)誤蝗羊,首先要確認(rèn)是不是因?yàn)榈谌降膉ar包導(dǎo)致的。如果不是的話烤低,就找本地代碼肘交,看是不是寫的有問題。如果確實(shí)是因?yàn)榈谌絡(luò)ar包的代碼導(dǎo)致的扑馁,盡量找到源碼或者反編譯,查看問題到底是什么引起的凉驻,然后找到相應(yīng)的配置在proguard里面配置腻要。
    • 例如:我們項(xiàng)目中碰到過一個(gè)問題,就是因?yàn)榈谌降膉ar包里面有一個(gè)字段初始化的時(shí)候報(bào)了空指針涝登,然后導(dǎo)致我們的代碼報(bào)了上面的錯(cuò)雄家。當(dāng)時(shí)很奇怪,為什么第三方的jar包還能報(bào)錯(cuò)胀滚,最后調(diào)查了之后才發(fā)現(xiàn)趟济,是因?yàn)槿思矣玫搅祟惖淖⒔猓鴓roguard在混淆優(yōu)化的時(shí)候把注解去掉了咽笼,所以報(bào)了空指針顷编,只需要在proguard里面加上保護(hù)注解就可以了-keepattributes Annotation--

c. ClassCastException

  • 原因:類強(qiáng)制轉(zhuǎn)換的時(shí)候出錯(cuò)。
  • 解決辦法:找到代碼剑刑,看是代碼寫的問題媳纬,還是混淆后的問題双肤。如果沒有混淆正常運(yùn)行的話,一般都是因?yàn)榛煜笥龅搅烁鞣N問題才報(bào)的錯(cuò)钮惠。我們項(xiàng)目中遇到的問題是因?yàn)闆]有讓proguard保持泛型茅糜,所以強(qiáng)轉(zhuǎn)的時(shí)候報(bào)錯(cuò)。只需要在proguard文件里面加上泛型即可-keepattributes Signature;

d. Resources$NotFoundException(resource not found)

  • 原因:代碼進(jìn)行了混淆素挽,R文件沒有了蔑赘,所以通過反射獲取的R文件找不到, 資源沒有找到,是因?yàn)榈谌絡(luò)ar包或者自己的代碼是通過反射獲得R文件中的資源预明,所以需要將R文件屏蔽掉;
  • 解決辦法:在proguard文件里設(shè)置不混淆R文件 -keep class *.R$ { *; }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末米死,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贮庞,更是在濱河造成了極大的恐慌峦筒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗慎,死亡現(xiàn)場(chǎng)離奇詭異物喷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)遮斥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門峦失,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人术吗,你說我怎么就攤上這事尉辑。” “怎么了较屿?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵隧魄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我隘蝎,道長(zhǎng)购啄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任嘱么,我火速辦了婚禮狮含,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曼振。我一直安慰自己几迄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布冰评。 她就那樣靜靜地躺著映胁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪集索。 梳的紋絲不亂的頭發(fā)上屿愚,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天汇跨,我揣著相機(jī)與錄音,去河邊找鬼妆距。 笑死穷遂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娱据。 我是一名探鬼主播蚪黑,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼中剩!你這毒婦竟也來了忌穿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤结啼,失蹤者是張志新(化名)和其女友劉穎掠剑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郊愧,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朴译,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了属铁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眠寿。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖焦蘑,靈堂內(nèi)的尸體忽然破棺而出盯拱,到底是詐尸還是另有隱情,我是刑警寧澤例嘱,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布狡逢,位于F島的核電站,受9級(jí)特大地震影響蝶防,放射性物質(zhì)發(fā)生泄漏甚侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一间学、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧印荔,春花似錦低葫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至水泉,卻和暖如春善涨,著一層夾襖步出監(jiān)牢的瞬間窒盐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工钢拧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟹漓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓源内,卻偏偏與公主長(zhǎng)得像葡粒,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膜钓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,845評(píng)論 25 707
  • 5分鐘搞定android混淆 前言 混淆是上線前挺重要的一個(gè)環(huán)節(jié)嗽交。android使用的ProGuard,可以起到壓...
    garyhu1閱讀 747評(píng)論 0 1
  • 1.首先需要在app下的build.gradle下配置颂斜,true表示編譯時(shí)會(huì)混淆代碼\ 2.在proguard-r...
    Thomas_yy閱讀 6,646評(píng)論 0 6
  • 混淆(Proguard)用法 最近項(xiàng)目中遇到一些混淆相關(guān)的問題夫壁,由于之前對(duì)proguard了解不多,所以每次都是面...
    于曉飛93閱讀 56,716評(píng)論 38 230
  • 這一整套學(xué)說沃疮,逐漸日趨成熟完整的理論體系盒让,成為我對(duì)抗疾病,拯救健康忿磅,揭示衰老真相的最有力的武器和最根本的信心源泉糯彬。...
    viola銅豌豆閱讀 331評(píng)論 0 0